summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/CODEOWNERS3
-rw-r--r--.gitignore1
-rw-r--r--.travis.yml24
-rw-r--r--core/SCsub1
-rw-r--r--core/array.cpp10
-rw-r--r--core/bind/core_bind.cpp79
-rw-r--r--core/bind/core_bind.h114
-rw-r--r--core/class_db.cpp52
-rw-r--r--core/class_db.h7
-rw-r--r--core/color.cpp34
-rw-r--r--core/color.h4
-rw-r--r--core/command_queue_mt.h4
-rw-r--r--core/crypto/SCsub38
-rw-r--r--core/crypto/crypto.cpp170
-rw-r--r--core/crypto/crypto.h105
-rw-r--r--core/crypto/crypto_core.cpp (renamed from core/math/crypto_core.cpp)32
-rw-r--r--core/crypto/crypto_core.h (renamed from core/math/crypto_core.h)20
-rw-r--r--core/crypto/hashing_context.cpp137
-rw-r--r--core/crypto/hashing_context.h66
-rw-r--r--core/engine.cpp5
-rw-r--r--core/hash_map.h16
-rw-r--r--core/image.cpp86
-rw-r--r--core/image.h2
-rw-r--r--core/input_map.cpp5
-rw-r--r--core/io/config_file.cpp9
-rw-r--r--core/io/file_access_buffered.cpp12
-rw-r--r--core/io/file_access_buffered_fa.h5
-rw-r--r--core/io/file_access_encrypted.cpp7
-rw-r--r--core/io/file_access_pack.cpp19
-rw-r--r--core/io/image_loader.h4
-rw-r--r--core/io/ip_address.cpp14
-rw-r--r--core/io/marshalls.cpp10
-rw-r--r--core/io/multiplayer_api.cpp162
-rw-r--r--core/io/packet_peer.cpp3
-rw-r--r--core/io/pck_packer.cpp5
-rw-r--r--core/io/resource_format_binary.cpp49
-rw-r--r--core/io/resource_loader.cpp42
-rw-r--r--core/io/resource_loader.h3
-rw-r--r--core/io/resource_saver.cpp6
-rw-r--r--core/io/resource_saver.h4
-rw-r--r--core/io/stream_peer_ssl.cpp68
-rw-r--r--core/io/stream_peer_ssl.h13
-rw-r--r--core/io/translation_loader_po.cpp25
-rw-r--r--core/io/xml_parser.cpp6
-rw-r--r--core/map.h4
-rw-r--r--core/math/SCsub33
-rw-r--r--core/math/a_star.cpp271
-rw-r--r--core/math/a_star.h37
-rw-r--r--core/math/basis.cpp5
-rw-r--r--core/math/basis.h4
-rw-r--r--core/math/bsp_tree.h4
-rw-r--r--core/math/camera_matrix.h4
-rw-r--r--core/math/delaunay.h4
-rw-r--r--core/math/expression.cpp11
-rw-r--r--core/math/geometry.cpp146
-rw-r--r--core/math/geometry.h224
-rw-r--r--core/math/math_funcs.h10
-rw-r--r--core/math/octree.h9
-rw-r--r--core/math/quat.h4
-rw-r--r--core/math/transform.h75
-rw-r--r--core/math/transform_2d.h31
-rw-r--r--core/math/vector2.cpp13
-rw-r--r--core/math/vector2.h24
-rw-r--r--core/math/vector3.h40
-rw-r--r--core/message_queue.cpp11
-rw-r--r--core/method_bind.h4
-rw-r--r--core/node_path.cpp3
-rw-r--r--core/node_path.h4
-rw-r--r--core/oa_hash_map.h66
-rw-r--r--core/object.cpp79
-rw-r--r--core/object.h2
-rw-r--r--core/os/dir_access.h4
-rw-r--r--core/os/file_access.cpp8
-rw-r--r--core/os/input.cpp1
-rw-r--r--core/os/input.h1
-rw-r--r--core/os/input_event.cpp4
-rw-r--r--core/os/input_event.h4
-rw-r--r--core/os/keyboard.h4
-rw-r--r--core/os/main_loop.cpp8
-rw-r--r--core/os/main_loop.h5
-rw-r--r--core/os/memory.h4
-rw-r--r--core/os/os.cpp13
-rw-r--r--core/os/os.h10
-rw-r--r--core/os/semaphore.h4
-rw-r--r--core/os/thread.h4
-rw-r--r--core/pool_allocator.cpp7
-rw-r--r--core/pool_vector.cpp3
-rw-r--r--core/pool_vector.h10
-rw-r--r--core/project_settings.cpp28
-rw-r--r--core/project_settings.h4
-rw-r--r--core/reference.h3
-rw-r--r--core/register_core_types.cpp24
-rw-r--r--core/register_core_types.h4
-rw-r--r--core/resource.cpp8
-rw-r--r--core/resource.h4
-rw-r--r--core/rid.h4
-rw-r--r--core/script_debugger_remote.cpp9
-rw-r--r--core/script_language.h4
-rw-r--r--core/set.h4
-rw-r--r--core/string_name.h3
-rw-r--r--core/translation.cpp3
-rw-r--r--core/ustring.cpp17
-rw-r--r--core/ustring.h4
-rw-r--r--core/variant.cpp5
-rw-r--r--core/variant.h4
-rw-r--r--core/variant_call.cpp33
-rw-r--r--doc/classes/AStar.xml23
-rw-r--r--doc/classes/AStar2D.xml23
-rw-r--r--doc/classes/AnimationPlayer.xml1
-rw-r--r--doc/classes/AudioServer.xml28
-rw-r--r--doc/classes/AudioStreamGenerator.xml1
-rw-r--r--doc/classes/AudioStreamGeneratorPlayback.xml1
-rw-r--r--doc/classes/AudioStreamSample.xml1
-rw-r--r--doc/classes/Basis.xml8
-rw-r--r--doc/classes/Button.xml5
-rw-r--r--doc/classes/Camera2D.xml4
-rw-r--r--doc/classes/ClassDB.xml4
-rw-r--r--doc/classes/Control.xml18
-rw-r--r--doc/classes/Crypto.xml43
-rw-r--r--doc/classes/CryptoKey.xml29
-rw-r--r--doc/classes/Directory.xml4
-rw-r--r--doc/classes/EditorInterface.xml16
-rw-r--r--doc/classes/Environment.xml7
-rw-r--r--doc/classes/FileDialog.xml2
-rw-r--r--doc/classes/Geometry.xml25
-rw-r--r--doc/classes/GeometryInstance.xml12
-rw-r--r--doc/classes/GraphNode.xml3
-rw-r--r--doc/classes/HashingContext.xml41
-rw-r--r--doc/classes/Image.xml12
-rw-r--r--doc/classes/Input.xml20
-rw-r--r--doc/classes/JSONRPC.xml95
-rw-r--r--doc/classes/MainLoop.xml12
-rw-r--r--doc/classes/Node.xml6
-rw-r--r--doc/classes/OS.xml44
-rw-r--r--doc/classes/PoolByteArray.xml13
-rw-r--r--doc/classes/Popup.xml7
-rw-r--r--doc/classes/ProjectSettings.xml9
-rw-r--r--doc/classes/ResourceFormatLoaderCrypto.xml13
-rw-r--r--doc/classes/ResourceFormatSaverCrypto.xml13
-rw-r--r--doc/classes/RigidBody2D.xml2
-rw-r--r--doc/classes/SceneTree.xml9
-rw-r--r--doc/classes/SpriteBase3D.xml2
-rw-r--r--doc/classes/StreamPeerSSL.xml10
-rw-r--r--doc/classes/TextEdit.xml4
-rw-r--r--doc/classes/Transform.xml4
-rw-r--r--doc/classes/Transform2D.xml4
-rw-r--r--doc/classes/Tree.xml2
-rw-r--r--doc/classes/TreeItem.xml20
-rw-r--r--doc/classes/Vector2.xml33
-rw-r--r--doc/classes/Vector3.xml35
-rw-r--r--doc/classes/VisualShaderNode.xml15
-rw-r--r--doc/classes/VisualShaderNodeCustom.xml149
-rw-r--r--doc/classes/VisualShaderNodeGlobalExpression.xml13
-rw-r--r--doc/classes/VisualShaderNodeGroupBase.xml4
-rw-r--r--doc/classes/VisualShaderNodeVectorScalarMix.xml13
-rw-r--r--doc/classes/X509Certificate.xml29
-rw-r--r--drivers/gles2/rasterizer_canvas_gles2.cpp7
-rw-r--r--drivers/gles2/rasterizer_scene_gles2.cpp3
-rw-r--r--drivers/gles2/rasterizer_storage_gles2.cpp8
-rw-r--r--drivers/gles2/shader_compiler_gles2.cpp23
-rw-r--r--drivers/gles2/shaders/stdlib.glsl75
-rw-r--r--drivers/gles3/rasterizer_canvas_gles3.cpp5
-rw-r--r--drivers/gles3/rasterizer_scene_gles3.cpp17
-rw-r--r--drivers/gles3/rasterizer_storage_gles3.cpp5
-rw-r--r--drivers/gles3/shader_compiler_gles3.cpp16
-rw-r--r--drivers/gles3/shader_gles3.h4
-rw-r--r--drivers/gles3/shaders/copy.glsl4
-rw-r--r--drivers/gles3/shaders/tonemap.glsl16
-rw-r--r--drivers/png/image_loader_png.h3
-rw-r--r--drivers/png/png_driver_common.cpp9
-rw-r--r--drivers/png/resource_saver_png.cpp9
-rw-r--r--drivers/register_driver_types.h4
-rw-r--r--drivers/unix/dir_access_unix.h4
-rw-r--r--drivers/unix/file_access_unix.cpp19
-rw-r--r--drivers/unix/file_access_unix.h4
-rw-r--r--drivers/unix/ip_unix.cpp4
-rw-r--r--drivers/unix/os_unix.cpp20
-rw-r--r--drivers/unix/os_unix.h4
-rw-r--r--drivers/unix/semaphore_posix.h4
-rw-r--r--drivers/unix/thread_posix.h4
-rw-r--r--drivers/wasapi/audio_driver_wasapi.cpp3
-rw-r--r--drivers/windows/file_access_windows.cpp22
-rw-r--r--drivers/windows/file_access_windows.h4
-rw-r--r--drivers/windows/mutex_windows.h4
-rw-r--r--drivers/windows/semaphore_windows.h4
-rw-r--r--drivers/windows/thread_windows.h4
-rw-r--r--drivers/xaudio2/audio_driver_xaudio2.cpp21
-rw-r--r--editor/animation_bezier_editor.cpp16
-rw-r--r--editor/animation_track_editor.cpp26
-rw-r--r--editor/code_editor.cpp142
-rw-r--r--editor/code_editor.h6
-rw-r--r--editor/collada/collada.cpp10
-rw-r--r--editor/collada/collada.h4
-rw-r--r--editor/connections_dialog.cpp7
-rw-r--r--editor/create_dialog.cpp55
-rw-r--r--editor/create_dialog.h3
-rw-r--r--editor/doc/doc_data.cpp24
-rw-r--r--editor/editor_about.cpp4
-rw-r--r--editor/editor_about.h3
-rw-r--r--editor/editor_asset_installer.cpp4
-rw-r--r--editor/editor_autoload_settings.cpp16
-rw-r--r--editor/editor_data.cpp21
-rw-r--r--editor/editor_data.h1
-rw-r--r--editor/editor_export.cpp10
-rw-r--r--editor/editor_file_dialog.cpp6
-rw-r--r--editor/editor_file_dialog.h3
-rw-r--r--editor/editor_file_system.cpp3
-rw-r--r--editor/editor_fonts.cpp26
-rw-r--r--editor/editor_help.cpp28
-rw-r--r--editor/editor_help.h1
-rw-r--r--editor/editor_help_search.cpp2
-rw-r--r--editor/editor_inspector.cpp12
-rw-r--r--editor/editor_node.cpp217
-rw-r--r--editor/editor_node.h21
-rw-r--r--editor/editor_path.cpp3
-rw-r--r--editor/editor_plugin.cpp14
-rw-r--r--editor/editor_plugin.h10
-rw-r--r--editor/editor_plugin_settings.cpp88
-rw-r--r--editor/editor_properties.cpp29
-rw-r--r--editor/editor_properties.h1
-rw-r--r--editor/editor_properties_array_dict.cpp6
-rw-r--r--editor/editor_resource_preview.cpp6
-rw-r--r--editor/editor_sectioned_inspector.cpp2
-rw-r--r--editor/editor_settings.cpp102
-rw-r--r--editor/editor_settings.h3
-rw-r--r--editor/editor_spin_slider.cpp56
-rw-r--r--editor/editor_themes.cpp51
-rw-r--r--editor/export_template_manager.cpp162
-rw-r--r--editor/export_template_manager.h2
-rw-r--r--editor/file_type_cache.cpp5
-rw-r--r--editor/filesystem_dock.cpp413
-rw-r--r--editor/filesystem_dock.h8
-rw-r--r--editor/find_in_files.cpp8
-rw-r--r--editor/groups_editor.cpp213
-rw-r--r--editor/groups_editor.h20
-rw-r--r--editor/icons/icon_auto_key.svg57
-rw-r--r--editor/icons/icon_editor_curve_handle.svg1
-rw-r--r--editor/icons/icon_editor_path_sharp_handle.svg1
-rw-r--r--editor/icons/icon_editor_path_smooth_handle.svg1
-rw-r--r--editor/icons/icon_ruler.svg5
-rw-r--r--editor/icons/icon_timeline_indicator.svg1
-rw-r--r--editor/import/editor_import_collada.cpp24
-rw-r--r--editor/import/editor_scene_importer_gltf.cpp5
-rw-r--r--editor/import/resource_importer_csv_translation.cpp3
-rw-r--r--editor/import/resource_importer_obj.cpp6
-rw-r--r--editor/import/resource_importer_scene.cpp66
-rw-r--r--editor/import/resource_importer_scene.h2
-rw-r--r--editor/import/resource_importer_wav.cpp19
-rw-r--r--editor/node_dock.cpp7
-rw-r--r--editor/plugins/abstract_polygon_2d_editor.cpp3
-rw-r--r--editor/plugins/abstract_polygon_2d_editor.h3
-rw-r--r--editor/plugins/animation_blend_space_2d_editor.h3
-rw-r--r--editor/plugins/animation_blend_tree_editor_plugin.cpp1
-rw-r--r--editor/plugins/animation_blend_tree_editor_plugin.h3
-rw-r--r--editor/plugins/animation_player_editor_plugin.cpp17
-rw-r--r--editor/plugins/animation_player_editor_plugin.h4
-rw-r--r--editor/plugins/animation_tree_player_editor_plugin.h3
-rw-r--r--editor/plugins/asset_library_editor_plugin.cpp107
-rw-r--r--editor/plugins/asset_library_editor_plugin.h4
-rw-r--r--editor/plugins/camera_editor_plugin.h4
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp398
-rw-r--r--editor/plugins/canvas_item_editor_plugin.h49
-rw-r--r--editor/plugins/collision_polygon_2d_editor_plugin.h3
-rw-r--r--editor/plugins/collision_polygon_editor_plugin.h4
-rw-r--r--editor/plugins/cpu_particles_2d_editor_plugin.cpp6
-rw-r--r--editor/plugins/curve_editor_plugin.cpp16
-rw-r--r--editor/plugins/editor_preview_plugins.cpp1
-rw-r--r--editor/plugins/item_list_editor_plugin.h4
-rw-r--r--editor/plugins/light_occluder_2d_editor_plugin.h3
-rw-r--r--editor/plugins/multimesh_editor_plugin.cpp9
-rw-r--r--editor/plugins/multimesh_editor_plugin.h4
-rw-r--r--editor/plugins/navigation_polygon_editor_plugin.h3
-rw-r--r--editor/plugins/particles_2d_editor_plugin.cpp6
-rw-r--r--editor/plugins/particles_editor_plugin.cpp21
-rw-r--r--editor/plugins/particles_editor_plugin.h6
-rw-r--r--editor/plugins/path_2d_editor_plugin.cpp42
-rw-r--r--editor/plugins/path_2d_editor_plugin.h3
-rw-r--r--editor/plugins/path_editor_plugin.cpp3
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.cpp7
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.h4
-rw-r--r--editor/plugins/script_editor_plugin.cpp56
-rw-r--r--editor/plugins/script_text_editor.cpp30
-rw-r--r--editor/plugins/shader_editor_plugin.cpp7
-rw-r--r--editor/plugins/spatial_editor_plugin.cpp153
-rw-r--r--editor/plugins/spatial_editor_plugin.h3
-rw-r--r--editor/plugins/theme_editor_plugin.cpp77
-rw-r--r--editor/plugins/theme_editor_plugin.h2
-rw-r--r--editor/plugins/tile_map_editor_plugin.cpp7
-rw-r--r--editor/plugins/tile_map_editor_plugin.h4
-rw-r--r--editor/plugins/tile_set_editor_plugin.cpp88
-rw-r--r--editor/plugins/tile_set_editor_plugin.h6
-rw-r--r--editor/plugins/visual_shader_editor_plugin.cpp299
-rw-r--r--editor/plugins/visual_shader_editor_plugin.h22
-rw-r--r--editor/project_export.cpp14
-rw-r--r--editor/project_manager.cpp222
-rw-r--r--editor/project_manager.h3
-rw-r--r--editor/project_settings_editor.cpp1
-rw-r--r--editor/property_editor.cpp7
-rw-r--r--editor/property_editor.h4
-rw-r--r--editor/scene_tree_dock.cpp12
-rw-r--r--editor/scene_tree_editor.cpp82
-rw-r--r--editor/scene_tree_editor.h4
-rw-r--r--editor/script_create_dialog.cpp118
-rw-r--r--editor/script_create_dialog.h19
-rw-r--r--editor/script_editor_debugger.cpp2
-rw-r--r--editor/spatial_editor_gizmos.cpp24
-rw-r--r--editor/translations/af.po572
-rw-r--r--editor/translations/ar.po679
-rw-r--r--editor/translations/bg.po627
-rw-r--r--editor/translations/bn.po741
-rw-r--r--editor/translations/ca.po789
-rw-r--r--editor/translations/cs.po774
-rw-r--r--editor/translations/da.po638
-rw-r--r--editor/translations/de.po996
-rw-r--r--editor/translations/de_CH.po591
-rw-r--r--editor/translations/editor.pot502
-rw-r--r--editor/translations/el.po1299
-rw-r--r--editor/translations/eo.po613
-rw-r--r--editor/translations/es.po804
-rw-r--r--editor/translations/es_AR.po795
-rw-r--r--editor/translations/et.po505
-rw-r--r--editor/translations/eu.po11325
-rw-r--r--editor/translations/fa.po628
-rw-r--r--editor/translations/fi.po785
-rw-r--r--editor/translations/fil.po554
-rw-r--r--editor/translations/fr.po1454
-rw-r--r--editor/translations/ga.po11327
-rw-r--r--editor/translations/he.po652
-rw-r--r--editor/translations/hi.po543
-rw-r--r--editor/translations/hr.po503
-rw-r--r--editor/translations/hu.po654
-rw-r--r--editor/translations/id.po2103
-rw-r--r--editor/translations/is.po518
-rw-r--r--editor/translations/it.po852
-rw-r--r--editor/translations/ja.po1976
-rw-r--r--editor/translations/ka.po567
-rw-r--r--editor/translations/ko.po786
-rw-r--r--editor/translations/lt.po559
-rw-r--r--editor/translations/lv.po561
-rw-r--r--editor/translations/mi.po502
-rw-r--r--editor/translations/ml.po502
-rw-r--r--editor/translations/ms.po510
-rw-r--r--editor/translations/nb.po651
-rw-r--r--editor/translations/nl.po762
-rw-r--r--editor/translations/or.po11324
-rw-r--r--editor/translations/pl.po795
-rw-r--r--editor/translations/pr.po571
-rw-r--r--editor/translations/pt_BR.po807
-rw-r--r--editor/translations/pt_PT.po734
-rw-r--r--editor/translations/ro.po647
-rw-r--r--editor/translations/ru.po1024
-rw-r--r--editor/translations/si.po509
-rw-r--r--editor/translations/sk.po571
-rw-r--r--editor/translations/sl.po659
-rw-r--r--editor/translations/sq.po604
-rw-r--r--editor/translations/sr_Cyrl.po684
-rw-r--r--editor/translations/sr_Latn.po525
-rw-r--r--editor/translations/sv.po636
-rw-r--r--editor/translations/ta.po510
-rw-r--r--editor/translations/te.po502
-rw-r--r--editor/translations/th.po721
-rw-r--r--editor/translations/tr.po801
-rw-r--r--editor/translations/uk.po775
-rw-r--r--editor/translations/ur_PK.po545
-rw-r--r--editor/translations/vi.po622
-rw-r--r--editor/translations/zh_CN.po1105
-rw-r--r--editor/translations/zh_HK.po627
-rw-r--r--editor/translations/zh_TW.po878
-rw-r--r--main/gamecontrollerdb.txt51
-rw-r--r--main/input_default.cpp4
-rw-r--r--main/input_default.h1
-rw-r--r--main/main.cpp27
-rw-r--r--main/main.h4
-rw-r--r--main/tests/test_gui.h3
-rw-r--r--main/tests/test_oa_hash_map.cpp19
-rw-r--r--main/tests/test_physics.h4
-rw-r--r--main/tests/test_render.h4
-rwxr-xr-xmisc/hooks/pre-commit-clang-format3
-rw-r--r--misc/ide/jetbrains/build.gradle2
-rw-r--r--misc/ide/jetbrains/gradle/wrapper/gradle-wrapper.properties4
-rwxr-xr-xmisc/travis/clang-format.sh2
-rw-r--r--modules/arkit/arkit_interface.h6
-rw-r--r--modules/arkit/arkit_interface.mm6
-rw-r--r--modules/arkit/arkit_session_delegate.h6
-rw-r--r--modules/arkit/arkit_session_delegate.mm6
-rw-r--r--modules/assimp/editor_scene_importer_assimp.cpp1595
-rw-r--r--modules/assimp/editor_scene_importer_assimp.h147
-rw-r--r--modules/assimp/import_state.h115
-rw-r--r--modules/assimp/import_utils.h448
-rw-r--r--modules/csg/csg.cpp10
-rw-r--r--modules/etc/texture_loader_pkm.cpp4
-rw-r--r--modules/gdnative/doc_classes/NativeScript.xml2
-rw-r--r--modules/gdnative/doc_classes/PluginScript.xml2
-rw-r--r--modules/gdnative/nativescript/nativescript.cpp2
-rw-r--r--modules/gdnative/pluginscript/pluginscript_script.cpp2
-rw-r--r--modules/gdscript/SCsub10
-rw-r--r--modules/gdscript/doc_classes/@GDScript.xml6
-rw-r--r--modules/gdscript/doc_classes/GDScript.xml2
-rw-r--r--modules/gdscript/gdscript.cpp2
-rw-r--r--modules/gdscript/gdscript_editor.cpp12
-rw-r--r--modules/gdscript/gdscript_function.cpp4
-rw-r--r--modules/gdscript/gdscript_functions.cpp36
-rw-r--r--modules/gdscript/gdscript_functions.h1
-rw-r--r--modules/gdscript/gdscript_parser.cpp545
-rw-r--r--modules/gdscript/gdscript_parser.h1
-rw-r--r--modules/gdscript/language_server/gdscript_extend_parser.cpp759
-rw-r--r--modules/gdscript/language_server/gdscript_extend_parser.h103
-rw-r--r--modules/gdscript/language_server/gdscript_language_protocol.cpp211
-rw-r--r--modules/gdscript/language_server/gdscript_language_protocol.h93
-rw-r--r--modules/gdscript/language_server/gdscript_language_server.cpp88
-rw-r--r--modules/gdscript/language_server/gdscript_language_server.h60
-rw-r--r--modules/gdscript/language_server/gdscript_text_document.cpp391
-rw-r--r--modules/gdscript/language_server/gdscript_text_document.h73
-rw-r--r--modules/gdscript/language_server/gdscript_workspace.cpp504
-rw-r--r--modules/gdscript/language_server/gdscript_workspace.h91
-rw-r--r--modules/gdscript/language_server/lsp.hpp1506
-rw-r--r--modules/gdscript/register_types.cpp18
-rw-r--r--modules/gridmap/grid_map_editor_plugin.cpp2
-rw-r--r--modules/gridmap/grid_map_editor_plugin.h3
-rw-r--r--modules/hdr/image_loader_hdr.cpp9
-rw-r--r--modules/hdr/image_loader_hdr.h3
-rw-r--r--modules/jpg/image_loader_jpegd.h3
-rw-r--r--modules/jsonrpc/SCsub7
-rw-r--r--modules/jsonrpc/config.py5
-rw-r--r--modules/jsonrpc/jsonrpc.cpp171
-rw-r--r--modules/jsonrpc/jsonrpc.h70
-rw-r--r--modules/jsonrpc/register_types.cpp40
-rw-r--r--modules/jsonrpc/register_types.h32
-rw-r--r--modules/mbedtls/crypto_mbedtls.cpp285
-rw-r--r--modules/mbedtls/crypto_mbedtls.h124
-rwxr-xr-xmodules/mbedtls/register_types.cpp6
-rw-r--r--modules/mbedtls/ssl_context_mbedtls.cpp151
-rw-r--r--modules/mbedtls/ssl_context_mbedtls.h73
-rwxr-xr-xmodules/mbedtls/stream_peer_mbedtls.cpp (renamed from modules/mbedtls/stream_peer_mbed_tls.cpp)101
-rwxr-xr-xmodules/mbedtls/stream_peer_mbedtls.h (renamed from modules/mbedtls/stream_peer_mbed_tls.h)24
-rw-r--r--modules/mono/SCsub16
-rw-r--r--modules/mono/build_scripts/godot_tools_build.py10
-rw-r--r--modules/mono/build_scripts/make_android_mono_config.py19
-rw-r--r--modules/mono/build_scripts/mono_configure.py6
-rw-r--r--modules/mono/class_db_api_json.cpp4
-rw-r--r--modules/mono/class_db_api_json.h4
-rw-r--r--modules/mono/csharp_script.cpp2
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.BuildLogger/GodotTools.BuildLogger.csproj1
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.Core/GodotTools.Core.csproj1
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.IdeConnection/ConsoleLogger.cs33
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeBase.cs94
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeClient.cs219
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeConnection.cs207
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeConnectionClient.cs24
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeConnectionServer.cs24
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeMetadata.cs45
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotTools.IdeConnection.csproj53
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.IdeConnection/ILogger.cs13
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.IdeConnection/Message.cs21
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.IdeConnection/MessageComposer.cs46
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.IdeConnection/MessageParser.cs88
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.IdeConnection/Properties/AssemblyInfo.cs35
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.ProjectEditor/GodotTools.ProjectEditor.csproj6
-rw-r--r--modules/mono/editor/GodotTools/GodotTools.sln6
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/BottomPanel.cs (renamed from modules/mono/editor/GodotTools/GodotTools/MonoBottomPanel.cs)30
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs16
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs14
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/BuildInfo.cs (renamed from modules/mono/editor/GodotTools/GodotTools/MonoBuildInfo.cs)8
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/BuildManager.cs (renamed from modules/mono/editor/GodotTools/GodotTools/GodotSharpBuilds.cs)87
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/BuildTab.cs (renamed from modules/mono/editor/GodotTools/GodotTools/MonoBuildTab.cs)20
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/CsProjOperations.cs (renamed from modules/mono/editor/GodotTools/GodotTools/CSharpProject.cs)2
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/ExternalEditorId.cs11
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs123
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/GodotSharpExport.cs4
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/GodotTools.csproj25
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeManager.cs166
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeServer.cs212
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/EditorId.cs8
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/Instance.cs (renamed from modules/mono/editor/GodotTools/GodotTools/MonoDevelopInstance.cs)43
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs15
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/Utils/CollectionExtensions.cs8
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/Utils/NotifyAwaiter.cs64
-rw-r--r--modules/mono/editor/editor_internal_calls.cpp21
-rw-r--r--modules/mono/glue/Managed/Files/Color.cs56
-rw-r--r--modules/mono/glue/Managed/Files/Colors.cs4
-rw-r--r--modules/mono/glue/Managed/Files/Dispatcher.cs13
-rw-r--r--modules/mono/glue/Managed/Files/GodotSynchronizationContext.cs7
-rw-r--r--modules/mono/glue/Managed/Files/GodotTaskScheduler.cs9
-rw-r--r--modules/mono/glue/Managed/Files/Mathf.cs5
-rw-r--r--modules/mono/glue/Managed/Files/MathfEx.cs7
-rw-r--r--modules/mono/glue/Managed/Files/Vector2.cs49
-rw-r--r--modules/mono/glue/Managed/Files/Vector3.cs46
-rw-r--r--modules/mono/glue/Managed/Managed.csproj5
-rw-r--r--modules/mono/glue/gd_glue.cpp7
-rw-r--r--modules/mono/glue/gd_glue.h2
-rw-r--r--modules/mono/mono_gd/android_mono_config.h43
-rw-r--r--modules/mono/mono_gd/gd_mono.cpp43
-rw-r--r--modules/mono/mono_gd/gd_mono.h2
-rw-r--r--modules/recast/navigation_mesh_generator.cpp19
-rw-r--r--modules/tinyexr/image_loader_tinyexr.h3
-rw-r--r--modules/visual_script/visual_script_editor.cpp1
-rw-r--r--modules/visual_script/visual_script_nodes.cpp2
-rw-r--r--modules/webp/image_loader_webp.cpp7
-rw-r--r--modules/webp/image_loader_webp.h3
-rw-r--r--modules/webrtc/register_types.cpp7
-rw-r--r--modules/webrtc/webrtc_data_channel.cpp2
-rw-r--r--modules/webrtc/webrtc_data_channel.h4
-rw-r--r--modules/webrtc/webrtc_data_channel_js.cpp2
-rw-r--r--modules/websocket/websocket_multiplayer_peer.cpp15
-rw-r--r--modules/websocket/wsl_client.cpp26
-rw-r--r--modules/websocket/wsl_peer.cpp4
-rw-r--r--modules/websocket/wsl_server.cpp25
-rw-r--r--modules/xatlas_unwrap/register_types.cpp9
-rw-r--r--platform/SCsub2
-rw-r--r--platform/android/SCsub31
-rw-r--r--platform/android/detect.py20
-rw-r--r--platform/android/export/export.cpp9
-rw-r--r--platform/android/java/AndroidManifest.xml87
-rw-r--r--platform/android/java/README.md47
-rw-r--r--platform/android/java/THIRDPARTY.md39
-rw-r--r--platform/android/java/aidl/com/android/vending/billing/IInAppBillingService.aidl201
-rw-r--r--platform/android/java/aidl/com/android/vending/licensing/ILicenseResultListener.aidl (renamed from platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.aidl)2
-rw-r--r--platform/android/java/aidl/com/android/vending/licensing/ILicensingService.aidl (renamed from platform/android/java/src/com/google/android/vending/licensing/ILicensingService.aidl)2
-rw-r--r--platform/android/java/build.gradle138
-rw-r--r--platform/android/java/gradle/wrapper/gradle-wrapper.properties2
-rw-r--r--platform/android/java/patches/com.google.android.vending.expansion.downloader.patch300
-rw-r--r--platform/android/java/patches/com.google.android.vending.licensing.patch42
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/Constants.java165
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java80
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java311
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java284
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java466
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java56
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderService.java28
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/IStub.java6
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java175
-rw-r--r--[-rwxr-xr-x]platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java131
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java112
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java343
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java1401
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java1898
-rw-r--r--[-rwxr-xr-x]platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java885
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java295
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/AESObfuscator.java124
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/APKExpansionPolicy.java541
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/DeviceLimiter.java4
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.java100
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/ILicensingService.java100
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/LicenseChecker.java554
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/LicenseCheckerCallback.java26
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/LicenseValidator.java367
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/NullDeviceLimiter.java6
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/Obfuscator.java8
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/Policy.java26
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java84
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/ResponseData.java83
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/ServerManagedPolicy.java335
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/StrictPolicy.java75
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/ValidationException.java14
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/util/Base64.java704
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/util/Base64DecoderException.java14
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/util/URIQueryDecoder.java50
-rw-r--r--platform/android/java/src/org/godotengine/godot/Godot.java94
-rw-r--r--platform/android/java/src/org/godotengine/godot/GodotLib.java148
-rw-r--r--platform/android/java/src/org/godotengine/godot/xr/XRMode.java8
-rw-r--r--platform/android/java_godot_lib_jni.cpp2
-rw-r--r--platform/android/java_godot_lib_jni.h2
-rw-r--r--platform/android/java_godot_wrapper.cpp19
-rw-r--r--platform/android/java_godot_wrapper.h4
-rw-r--r--platform/android/os_android.cpp6
-rw-r--r--platform/android/os_android.h1
-rw-r--r--platform/android/thread_jandroid.h4
-rw-r--r--platform/iphone/app_delegate.mm5
-rw-r--r--platform/iphone/os_iphone.cpp6
-rw-r--r--platform/iphone/os_iphone.h1
-rw-r--r--platform/iphone/view_controller.h4
-rw-r--r--platform/iphone/view_controller.mm12
-rw-r--r--platform/osx/dir_access_osx.h3
-rw-r--r--platform/osx/os_osx.h28
-rw-r--r--platform/osx/os_osx.mm94
-rw-r--r--platform/server/os_server.h3
-rw-r--r--platform/uwp/export/export.cpp2
-rw-r--r--platform/uwp/os_uwp.h3
-rw-r--r--platform/windows/os_windows.h4
-rw-r--r--platform/x11/context_gl_x11.h3
-rw-r--r--platform/x11/key_mapping_x11.h3
-rw-r--r--platform/x11/os_x11.cpp5
-rw-r--r--platform/x11/os_x11.h3
-rw-r--r--scene/2d/canvas_item.cpp9
-rw-r--r--scene/2d/collision_object_2d.cpp7
-rw-r--r--scene/2d/cpu_particles_2d.h4
-rw-r--r--scene/2d/navigation_2d.cpp4
-rw-r--r--scene/2d/parallax_layer.cpp3
-rw-r--r--scene/2d/path_2d.cpp2
-rw-r--r--scene/2d/physics_body_2d.cpp14
-rw-r--r--scene/2d/tile_map.cpp1
-rw-r--r--scene/3d/camera.h4
-rw-r--r--scene/3d/collision_object.cpp3
-rw-r--r--scene/3d/collision_polygon.cpp2
-rw-r--r--scene/3d/cpu_particles.h4
-rw-r--r--scene/3d/light.h4
-rw-r--r--scene/3d/mesh_instance.h3
-rw-r--r--scene/3d/multimesh_instance.h4
-rw-r--r--scene/3d/particles.h4
-rw-r--r--scene/3d/physics_body.cpp16
-rw-r--r--scene/3d/physics_body.h2
-rw-r--r--scene/3d/portal.h3
-rw-r--r--scene/3d/ray_cast.cpp2
-rw-r--r--scene/3d/room_instance.h4
-rw-r--r--scene/3d/skeleton.h4
-rw-r--r--scene/3d/spatial.h4
-rw-r--r--scene/3d/sprite_3d.cpp21
-rw-r--r--scene/3d/sprite_3d.h3
-rw-r--r--scene/3d/visual_instance.h4
-rw-r--r--scene/3d/world_environment.h4
-rw-r--r--scene/animation/animation_player.cpp4
-rw-r--r--scene/animation/animation_player.h3
-rw-r--r--scene/animation/animation_tree.cpp1
-rw-r--r--scene/gui/base_button.h3
-rw-r--r--scene/gui/button.cpp289
-rw-r--r--scene/gui/button.h9
-rw-r--r--scene/gui/color_picker.cpp34
-rw-r--r--scene/gui/color_picker.h2
-rw-r--r--scene/gui/control.cpp14
-rw-r--r--scene/gui/control.h3
-rw-r--r--scene/gui/dialogs.h3
-rw-r--r--scene/gui/file_dialog.cpp2
-rw-r--r--scene/gui/file_dialog.h4
-rw-r--r--scene/gui/gradient_edit.cpp10
-rw-r--r--scene/gui/graph_edit.cpp20
-rw-r--r--scene/gui/graph_node.cpp3
-rw-r--r--scene/gui/label.h4
-rw-r--r--scene/gui/line_edit.cpp20
-rw-r--r--scene/gui/line_edit.h3
-rw-r--r--scene/gui/menu_button.h4
-rw-r--r--scene/gui/nine_patch_rect.h4
-rw-r--r--scene/gui/option_button.h4
-rw-r--r--scene/gui/panel.h4
-rw-r--r--scene/gui/popup.cpp3
-rw-r--r--scene/gui/popup.h3
-rw-r--r--scene/gui/popup_menu.h4
-rw-r--r--scene/gui/range.h4
-rw-r--r--scene/gui/rich_text_label.cpp5
-rw-r--r--scene/gui/scroll_bar.h4
-rw-r--r--scene/gui/scroll_container.cpp21
-rw-r--r--scene/gui/separator.h4
-rw-r--r--scene/gui/spin_box.cpp21
-rw-r--r--scene/gui/tab_container.cpp14
-rw-r--r--scene/gui/tab_container.h3
-rw-r--r--scene/gui/text_edit.cpp995
-rw-r--r--scene/gui/text_edit.h24
-rw-r--r--scene/gui/texture_button.cpp16
-rw-r--r--scene/gui/texture_rect.h4
-rw-r--r--scene/gui/tree.cpp29
-rw-r--r--scene/gui/tree.h8
-rw-r--r--scene/gui/viewport_container.cpp1
-rw-r--r--scene/main/http_request.cpp4
-rw-r--r--scene/main/node.cpp35
-rw-r--r--scene/main/node.h7
-rw-r--r--scene/main/scene_tree.cpp40
-rw-r--r--scene/main/scene_tree.h6
-rw-r--r--scene/main/viewport.cpp14
-rw-r--r--scene/main/viewport.h3
-rw-r--r--scene/register_scene_types.cpp4
-rw-r--r--scene/register_scene_types.h4
-rw-r--r--scene/resources/animation.cpp8
-rw-r--r--scene/resources/animation.h4
-rw-r--r--scene/resources/default_theme/default_theme.cpp11
-rw-r--r--scene/resources/default_theme/default_theme.h3
-rw-r--r--scene/resources/dynamic_font.cpp8
-rw-r--r--scene/resources/environment.cpp2
-rw-r--r--scene/resources/font.h3
-rw-r--r--scene/resources/material.cpp11
-rw-r--r--scene/resources/material.h9
-rw-r--r--scene/resources/mesh.h3
-rw-r--r--scene/resources/room.h3
-rw-r--r--scene/resources/style_box.h4
-rw-r--r--scene/resources/texture.h4
-rw-r--r--scene/resources/theme.h3
-rw-r--r--scene/resources/visual_shader.cpp226
-rw-r--r--scene/resources/visual_shader.h59
-rw-r--r--servers/arvr/arvr_interface.h2
-rw-r--r--servers/physics/body_sw.cpp1
-rw-r--r--servers/physics/gjk_epa.h5
-rw-r--r--servers/physics_2d/body_2d_sw.cpp30
-rw-r--r--servers/physics_2d/body_2d_sw.h1
-rw-r--r--servers/visual/shader_language.cpp324
-rw-r--r--servers/visual/shader_language.h16
-rw-r--r--servers/visual/visual_server_raster.h3
-rw-r--r--servers/visual/visual_server_wrap_mt.h3
-rw-r--r--servers/visual_server.h3
-rw-r--r--thirdparty/README.md2
-rw-r--r--thirdparty/assimp/assimp/config.h7
-rw-r--r--thirdparty/assimp/code/Common/BaseImporter.cpp27
-rw-r--r--thirdparty/assimp/code/FBX/FBXConverter.cpp96
-rw-r--r--thirdparty/assimp/code/FBX/FBXConverter.h7
-rw-r--r--thirdparty/assimp/code/FBX/FBXDocument.cpp8
-rw-r--r--thirdparty/assimp/code/FBX/FBXExporter.cpp43
-rw-r--r--thirdparty/assimp/code/FBX/FBXImporter.cpp10
-rw-r--r--thirdparty/assimp/code/FBX/FBXMeshGeometry.cpp7
-rw-r--r--thirdparty/assimp/code/PostProcessing/CalcTangentsProcess.cpp6
-rw-r--r--thirdparty/assimp/code/PostProcessing/ScaleProcess.cpp125
-rw-r--r--thirdparty/assimp/code/PostProcessing/ScaleProcess.h13
-rw-r--r--thirdparty/assimp/contrib/utf8cpp/doc/ReleaseNotes12
-rw-r--r--thirdparty/assimp/contrib/utf8cpp/doc/utf8cpp.html1789
-rw-r--r--thirdparty/assimp/include/assimp/.editorconfig8
-rw-r--r--thirdparty/assimp/include/assimp/BaseImporter.h61
-rw-r--r--thirdparty/assimp/include/assimp/config.h.in9
-rw-r--r--thirdparty/assimp/include/assimp/irrXMLWrapper.h144
-rw-r--r--thirdparty/assimp/include/assimp/scene.h2
-rw-r--r--thirdparty/xatlas/avoid-failing-on-bad-geometry.patch157
-rw-r--r--thirdparty/xatlas/build-fix-limits.patch14
-rw-r--r--thirdparty/xatlas/xatlas.cpp2891
-rw-r--r--thirdparty/xatlas/xatlas.h36
-rw-r--r--version.py2
710 files changed, 84781 insertions, 30477 deletions
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 399fca03e8..3bbe47af2a 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -30,7 +30,6 @@ doc_classes/* @godotengine/documentation
/modules/bullet/ @AndreaCatania
/modules/csg/ @BastiaanOlij
/modules/enet/ @godotengine/network
-/modules/gdnative/ @karroffel
/modules/gdnative/*arvr/ @BastiaanOlij
/modules/gdscript/ @vnen @bojidar-bg
/modules/mbedtls/ @godotengine/network
@@ -45,6 +44,6 @@ doc_classes/* @godotengine/documentation
/platform/uwp/ @vnen
/server/physics*/ @reduz @AndreaCatania
-/server/visual*/ @reduz @karroffel
+/server/visual*/ @reduz
/thirdparty/ @akien-mga
diff --git a/.gitignore b/.gitignore
index f43f68f25f..0ee2a8b382 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
# Godot auto generated files
*.gen.*
+.import/
# Documentation generated by doxygen or from classes.xml
doc/_build/
diff --git a/.travis.yml b/.travis.yml
index b52e40200f..a763fa5376 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,7 +2,10 @@ language: cpp
# OS config, depends on actual 'os' in build matrix
dist: xenial
-sudo: false
+
+stages:
+ - check
+ - build
env:
global:
@@ -18,6 +21,7 @@ cache:
matrix:
include:
- name: Static checks (clang-format)
+ stage: check
env: STATIC_CHECKS=yes
os: linux
compiler: gcc
@@ -29,6 +33,7 @@ matrix:
- clang-format-8
- name: Linux editor (debug, GCC 9, with Mono)
+ stage: build
env: PLATFORM=x11 TOOLS=yes TARGET=debug CACHE_NAME=${PLATFORM}-tools-mono-gcc-9 MATRIX_EVAL="CC=gcc-9 && CXX=g++-9" EXTRA_ARGS="module_mono_enabled=yes mono_glue=no warnings=extra werror=yes"
os: linux
compiler: gcc-9
@@ -52,6 +57,7 @@ matrix:
branch_pattern: coverity_scan
- name: Linux export template (release, Clang)
+ stage: build
env: PLATFORM=x11 TOOLS=no TARGET=release CACHE_NAME=${PLATFORM}-clang EXTRA_ARGS="warnings=extra werror=yes"
os: linux
compiler: clang
@@ -61,22 +67,26 @@ matrix:
- *linux_deps
- name: Android export template (release_debug, Clang)
+ stage: build
env: PLATFORM=android TOOLS=no TARGET=release_debug CACHE_NAME=${PLATFORM}-clang EXTRA_ARGS="warnings=extra werror=yes"
os: linux
compiler: clang
- name: macOS editor (debug, Clang)
+ stage: build
env: PLATFORM=osx TOOLS=yes TARGET=debug CACHE_NAME=${PLATFORM}-tools-clang
os: osx
compiler: clang
- name: iOS export template (debug, Clang)
+ stage: build
env: PLATFORM=iphone TOOLS=no TARGET=debug CACHE_NAME=${PLATFORM}-clang
os: osx
compiler: clang
- - name: Linux headless editor (release_debug, GCC 9)
- env: PLATFORM=server TOOLS=yes TARGET=release_debug CACHE_NAME=${PLATFORM}-tools-gcc-9 MATRIX_EVAL="CC=gcc-9 && CXX=g++-9" EXTRA_ARGS="warnings=extra werror=yes"
+ - name: Linux headless editor (release_debug, GCC 9, testing project exporting and script running)
+ stage: build
+ env: PLATFORM=server TOOLS=yes TARGET=release_debug CACHE_NAME=${PLATFORM}-tools-gcc-9 MATRIX_EVAL="CC=gcc-9 && CXX=g++-9" EXTRA_ARGS="warnings=extra werror=yes" TEST_PROJECT=yes
os: linux
compiler: gcc-9
addons:
@@ -88,6 +98,7 @@ matrix:
- *linux_deps
- name: Linux export template (release_debug, GCC 5, without 3D support)
+ stage: build
env: PLATFORM=x11 TOOLS=no TARGET=release_debug CACHE_NAME=${PLATFORM}-gcc-5 EXTRA_ARGS="disable_3d=yes"
os: linux
compiler: gcc
@@ -124,5 +135,10 @@ script:
- if [ "$STATIC_CHECKS" = "yes" ]; then
sh ./misc/travis/clang-format.sh;
else
- scons -j2 CC=$CC CXX=$CXX platform=$PLATFORM tools=$TOOLS target=$TARGET $OPTIONS $EXTRA_ARGS;
+ scons -j2 CC=$CC CXX=$CXX platform=$PLATFORM tools=$TOOLS target=$TARGET $OPTIONS $EXTRA_ARGS &&
+ if [ "$TEST_PROJECT" = "yes" ]; then
+ git clone --depth 1 "https://github.com/godotengine/godot-tests.git";
+ sed -i "s:custom_template/release=\"\":custom_template/release=\"$(readlink -e bin/godot_server.x11.opt.tools.64)\":" godot-tests/tests/project_export/export_presets.cfg;
+ godot-tests/tests/project_export/test_project.sh "bin/godot_server.x11.opt.tools.64";
+ fi
fi
diff --git a/core/SCsub b/core/SCsub
index 85e5f1b089..ed9a0a231d 100644
--- a/core/SCsub
+++ b/core/SCsub
@@ -159,6 +159,7 @@ env.CommandNoCache('#core/license.gen.h', ["../COPYRIGHT.txt", "../LICENSE.txt"]
# Chain load SCsubs
SConscript('os/SCsub')
SConscript('math/SCsub')
+SConscript('crypto/SCsub')
SConscript('io/SCsub')
SConscript('bind/SCsub')
diff --git a/core/array.cpp b/core/array.cpp
index a334af2c04..108d9f7386 100644
--- a/core/array.cpp
+++ b/core/array.cpp
@@ -133,18 +133,12 @@ void Array::erase(const Variant &p_value) {
}
Variant Array::front() const {
- if (_p->array.size() == 0) {
- ERR_EXPLAIN("Can't take value from empty array");
- ERR_FAIL_V(Variant());
- }
+ ERR_FAIL_COND_V_MSG(_p->array.size() == 0, Variant(), "Can't take value from empty array.");
return operator[](0);
}
Variant Array::back() const {
- if (_p->array.size() == 0) {
- ERR_EXPLAIN("Can't take value from empty array");
- ERR_FAIL_V(Variant());
- }
+ ERR_FAIL_COND_V_MSG(_p->array.size() == 0, Variant(), "Can't take value from empty array.");
return operator[](_p->array.size() - 1);
}
diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp
index b41b84ab1e..5161f8bab2 100644
--- a/core/bind/core_bind.cpp
+++ b/core/bind/core_bind.cpp
@@ -30,11 +30,11 @@
#include "core_bind.h"
+#include "core/crypto/crypto_core.h"
#include "core/io/file_access_compressed.h"
#include "core/io/file_access_encrypted.h"
#include "core/io/json.h"
#include "core/io/marshalls.h"
-#include "core/math/crypto_core.h"
#include "core/math/geometry.h"
#include "core/os/keyboard.h"
#include "core/os/os.h"
@@ -73,10 +73,7 @@ RES _ResourceLoader::load(const String &p_path, const String &p_type_hint, bool
Error err = OK;
RES ret = ResourceLoader::load(p_path, p_type_hint, p_no_cache, &err);
- if (err != OK) {
- ERR_EXPLAIN("Error loading resource: '" + p_path + "'");
- ERR_FAIL_V(ret);
- }
+ ERR_FAIL_COND_V_MSG(err != OK, ret, "Error loading resource: '" + p_path + "'.");
return ret;
}
@@ -148,10 +145,7 @@ _ResourceLoader::_ResourceLoader() {
}
Error _ResourceSaver::save(const String &p_path, const RES &p_resource, SaverFlags p_flags) {
- if (p_resource.is_null()) {
- ERR_EXPLAIN("Can't save empty resource to path: " + String(p_path))
- ERR_FAIL_V(ERR_INVALID_PARAMETER);
- }
+ ERR_FAIL_COND_V_MSG(p_resource.is_null(), ERR_INVALID_PARAMETER, "Can't save empty resource to path: " + String(p_path) + ".");
return ResourceSaver::save(p_path, p_resource, p_flags);
}
@@ -191,10 +185,31 @@ _ResourceSaver::_ResourceSaver() {
/////////////////OS
+void _OS::global_menu_add_item(const String &p_menu, const String &p_label, const Variant &p_signal, const Variant &p_meta) {
+
+ OS::get_singleton()->global_menu_add_item(p_menu, p_label, p_signal, p_meta);
+}
+
+void _OS::global_menu_add_separator(const String &p_menu) {
+
+ OS::get_singleton()->global_menu_add_separator(p_menu);
+}
+
+void _OS::global_menu_remove_item(const String &p_menu, int p_idx) {
+
+ OS::get_singleton()->global_menu_remove_item(p_menu, p_idx);
+}
+
+void _OS::global_menu_clear(const String &p_menu) {
+
+ OS::get_singleton()->global_menu_clear(p_menu);
+}
+
Point2 _OS::get_mouse_position() const {
return OS::get_singleton()->get_mouse_position();
}
+
void _OS::set_window_title(const String &p_title) {
OS::get_singleton()->set_window_title(p_title);
@@ -208,6 +223,7 @@ int _OS::get_mouse_button_state() const {
String _OS::get_unique_id() const {
return OS::get_singleton()->get_unique_id();
}
+
bool _OS::has_touchscreen_ui_hint() const {
return OS::get_singleton()->has_touchscreen_ui_hint();
@@ -217,6 +233,7 @@ void _OS::set_clipboard(const String &p_text) {
OS::get_singleton()->set_clipboard(p_text);
}
+
String _OS::get_clipboard() const {
return OS::get_singleton()->get_clipboard();
@@ -263,12 +280,14 @@ void _OS::set_video_mode(const Size2 &p_size, bool p_fullscreen, bool p_resizeab
vm.resizable = p_resizeable;
OS::get_singleton()->set_video_mode(vm, p_screen);
}
+
Size2 _OS::get_video_mode(int p_screen) const {
OS::VideoMode vm;
vm = OS::get_singleton()->get_video_mode(p_screen);
return Size2(vm.width, vm.height);
}
+
bool _OS::is_video_mode_fullscreen(int p_screen) const {
OS::VideoMode vm;
@@ -727,22 +746,16 @@ int64_t _OS::get_unix_time_from_datetime(Dictionary datetime) const {
{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
};
- ERR_EXPLAIN("Invalid second value of: " + itos(second));
- ERR_FAIL_COND_V(second > 59, 0);
+ ERR_FAIL_COND_V_MSG(second > 59, 0, "Invalid second value of: " + itos(second) + ".");
- ERR_EXPLAIN("Invalid minute value of: " + itos(minute));
- ERR_FAIL_COND_V(minute > 59, 0);
+ ERR_FAIL_COND_V_MSG(minute > 59, 0, "Invalid minute value of: " + itos(minute) + ".");
- ERR_EXPLAIN("Invalid hour value of: " + itos(hour));
- ERR_FAIL_COND_V(hour > 23, 0);
+ ERR_FAIL_COND_V_MSG(hour > 23, 0, "Invalid hour value of: " + itos(hour) + ".");
- ERR_EXPLAIN("Invalid month value of: " + itos(month));
- ERR_FAIL_COND_V(month > 12 || month == 0, 0);
+ ERR_FAIL_COND_V_MSG(month > 12 || month == 0, 0, "Invalid month value of: " + itos(month) + ".");
// Do this check after month is tested as valid
- ERR_EXPLAIN("Invalid day value of: " + itos(day) + " which is larger than " + itos(MONTH_DAYS_TABLE[LEAPYEAR(year)][month - 1]) + " or 0");
- ERR_FAIL_COND_V(day > MONTH_DAYS_TABLE[LEAPYEAR(year)][month - 1] || day == 0, 0);
-
+ ERR_FAIL_COND_V_MSG(day > MONTH_DAYS_TABLE[LEAPYEAR(year)][month - 1] || day == 0, 0, "Invalid day value of: " + itos(day) + " which is larger than " + itos(MONTH_DAYS_TABLE[LEAPYEAR(year)][month - 1]) + " or 0.");
// Calculate all the seconds from months past in this year
uint64_t SECONDS_FROM_MONTHS_PAST_THIS_YEAR = DAYS_PAST_THIS_YEAR_TABLE[LEAPYEAR(year)][month - 1] * SECONDS_PER_DAY;
@@ -1137,6 +1150,11 @@ void _OS::_bind_methods() {
//ClassDB::bind_method(D_METHOD("is_video_mode_resizable","screen"),&_OS::is_video_mode_resizable,DEFVAL(0));
//ClassDB::bind_method(D_METHOD("get_fullscreen_mode_list","screen"),&_OS::get_fullscreen_mode_list,DEFVAL(0));
+ ClassDB::bind_method(D_METHOD("global_menu_add_item", "menu", "label", "id", "meta"), &_OS::global_menu_add_item);
+ ClassDB::bind_method(D_METHOD("global_menu_add_separator", "menu"), &_OS::global_menu_add_separator);
+ ClassDB::bind_method(D_METHOD("global_menu_remove_item", "menu", "idx"), &_OS::global_menu_remove_item);
+ ClassDB::bind_method(D_METHOD("global_menu_clear", "menu"), &_OS::global_menu_clear);
+
ClassDB::bind_method(D_METHOD("get_video_driver_count"), &_OS::get_video_driver_count);
ClassDB::bind_method(D_METHOD("get_video_driver_name", "driver"), &_OS::get_video_driver_name);
ClassDB::bind_method(D_METHOD("get_current_video_driver"), &_OS::get_current_video_driver);
@@ -1414,6 +1432,11 @@ PoolVector<Plane> _Geometry::build_capsule_planes(float p_radius, float p_height
return Geometry::build_capsule_planes(p_radius, p_height, p_sides, p_lats, p_axis);
}
+bool _Geometry::is_point_in_circle(const Vector2 &p_point, const Vector2 &p_circle_pos, real_t p_circle_radius) {
+
+ return Geometry::is_point_in_circle(p_point, p_circle_pos, p_circle_radius);
+}
+
real_t _Geometry::segment_intersects_circle(const Vector2 &p_from, const Vector2 &p_to, const Vector2 &p_circle_pos, real_t p_circle_radius) {
return Geometry::segment_intersects_circle(p_from, p_to, p_circle_pos, p_circle_radius);
@@ -1666,11 +1689,6 @@ Array _Geometry::offset_polyline_2d(const Vector<Vector2> &p_polygon, real_t p_d
return ret;
}
-Vector<Point2> _Geometry::transform_points_2d(const Vector<Point2> &p_points, const Transform2D &p_mat) {
-
- return Geometry::transform_points_2d(p_points, p_mat);
-}
-
Dictionary _Geometry::make_atlas(const Vector<Size2> &p_rects) {
Dictionary ret;
@@ -1709,6 +1727,7 @@ void _Geometry::_bind_methods() {
ClassDB::bind_method(D_METHOD("build_box_planes", "extents"), &_Geometry::build_box_planes);
ClassDB::bind_method(D_METHOD("build_cylinder_planes", "radius", "height", "sides", "axis"), &_Geometry::build_cylinder_planes, DEFVAL(Vector3::AXIS_Z));
ClassDB::bind_method(D_METHOD("build_capsule_planes", "radius", "height", "sides", "lats", "axis"), &_Geometry::build_capsule_planes, DEFVAL(Vector3::AXIS_Z));
+ ClassDB::bind_method(D_METHOD("is_point_in_circle", "point", "circle_position", "circle_radius"), &_Geometry::is_point_in_circle);
ClassDB::bind_method(D_METHOD("segment_intersects_circle", "segment_from", "segment_to", "circle_position", "circle_radius"), &_Geometry::segment_intersects_circle);
ClassDB::bind_method(D_METHOD("segment_intersects_segment_2d", "from_a", "to_a", "from_b", "to_b"), &_Geometry::segment_intersects_segment_2d);
ClassDB::bind_method(D_METHOD("line_intersects_line_2d", "from_a", "dir_a", "from_b", "dir_b"), &_Geometry::line_intersects_line_2d);
@@ -1749,8 +1768,6 @@ void _Geometry::_bind_methods() {
ClassDB::bind_method(D_METHOD("offset_polygon_2d", "polygon", "delta", "join_type"), &_Geometry::offset_polygon_2d, DEFVAL(JOIN_SQUARE));
ClassDB::bind_method(D_METHOD("offset_polyline_2d", "polyline", "delta", "join_type", "end_type"), &_Geometry::offset_polyline_2d, DEFVAL(JOIN_SQUARE), DEFVAL(END_SQUARE));
- ClassDB::bind_method(D_METHOD("transform_points_2d", "points", "transform"), &_Geometry::transform_points_2d);
-
ClassDB::bind_method(D_METHOD("make_atlas", "sizes"), &_Geometry::make_atlas);
BIND_ENUM_CONSTANT(OPERATION_UNION);
@@ -2621,8 +2638,7 @@ void _Thread::_start_func(void *ud) {
}
}
- ERR_EXPLAIN("Could not call function '" + t->target_method.operator String() + "'' starting thread ID: " + t->get_id() + " Reason: " + reason);
- ERR_FAIL();
+ ERR_FAIL_MSG("Could not call function '" + t->target_method.operator String() + "'' starting thread ID: " + t->get_id() + " Reason: " + reason + ".");
}
}
@@ -2704,10 +2720,7 @@ _Thread::_Thread() {
_Thread::~_Thread() {
- if (active) {
- ERR_EXPLAIN("Reference to a Thread object object was lost while the thread is still running...");
- }
- ERR_FAIL_COND(active);
+ ERR_FAIL_COND_MSG(active, "Reference to a Thread object object was lost while the thread is still running...");
}
/////////////////////////////////////
diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h
index f0f86e003f..693b85710a 100644
--- a/core/bind/core_bind.h
+++ b/core/bind/core_bind.h
@@ -109,11 +109,11 @@ public:
};
enum PowerState {
- POWERSTATE_UNKNOWN, /**< cannot determine power status */
- POWERSTATE_ON_BATTERY, /**< Not plugged in, running on the battery */
- POWERSTATE_NO_BATTERY, /**< Plugged in, no battery available */
- POWERSTATE_CHARGING, /**< Plugged in, charging battery */
- POWERSTATE_CHARGED /**< Plugged in, battery charged */
+ POWERSTATE_UNKNOWN, // Cannot determine power status.
+ POWERSTATE_ON_BATTERY, // Not plugged in, running on the battery.
+ POWERSTATE_NO_BATTERY, // Plugged in, no battery available.
+ POWERSTATE_CHARGING, // Plugged in, charging battery.
+ POWERSTATE_CHARGED // Plugged in, battery charged.
};
enum Weekday {
@@ -127,8 +127,8 @@ public:
};
enum Month {
- /// Start at 1 to follow Windows SYSTEMTIME structure
- /// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724950(v=vs.85).aspx
+ // Start at 1 to follow Windows SYSTEMTIME structure
+ // https://msdn.microsoft.com/en-us/library/windows/desktop/ms724950(v=vs.85).aspx
MONTH_JANUARY = 1,
MONTH_FEBRUARY,
MONTH_MARCH,
@@ -143,6 +143,11 @@ public:
MONTH_DECEMBER
};
+ void global_menu_add_item(const String &p_menu, const String &p_label, const Variant &p_signal, const Variant &p_meta);
+ void global_menu_add_separator(const String &p_menu);
+ void global_menu_remove_item(const String &p_menu, int p_idx);
+ void global_menu_clear(const String &p_menu);
+
Point2 get_mouse_position() const;
void set_window_title(const String &p_title);
int get_mouse_button_state() const;
@@ -259,24 +264,6 @@ public:
bool is_scancode_unicode(uint32_t p_unicode) const;
int find_scancode_from_string(const String &p_code) const;
- /*
- struct Date {
-
- int year;
- Month month;
- int day;
- Weekday weekday;
- bool dst;
- };
-
- struct Time {
-
- int hour;
- int min;
- int sec;
- };
-*/
-
void set_use_file_access_save_and_swap(bool p_enable);
void set_native_icon(const String &p_filename);
@@ -404,6 +391,7 @@ public:
PoolVector<Vector3> segment_intersects_sphere(const Vector3 &p_from, const Vector3 &p_to, const Vector3 &p_sphere_pos, real_t p_sphere_radius);
PoolVector<Vector3> segment_intersects_cylinder(const Vector3 &p_from, const Vector3 &p_to, float p_height, float p_radius);
PoolVector<Vector3> segment_intersects_convex(const Vector3 &p_from, const Vector3 &p_to, const Vector<Plane> &p_planes);
+ bool is_point_in_circle(const Vector2 &p_point, const Vector2 &p_circle_pos, real_t p_circle_radius);
real_t segment_intersects_circle(const Vector2 &p_from, const Vector2 &p_to, const Vector2 &p_circle_pos, real_t p_circle_radius);
int get_uv84_normal_bit(const Vector3 &p_vector);
@@ -420,17 +408,17 @@ public:
OPERATION_INTERSECTION,
OPERATION_XOR
};
- // 2D polygon boolean operations
- Array merge_polygons_2d(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // union (add)
- Array clip_polygons_2d(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // difference (subtract)
- Array intersect_polygons_2d(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // common area (multiply)
- Array exclude_polygons_2d(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // all but common area (xor)
+ // 2D polygon boolean operations.
+ Array merge_polygons_2d(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // Union (add).
+ Array clip_polygons_2d(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // Difference (subtract).
+ Array intersect_polygons_2d(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // Common area (multiply).
+ Array exclude_polygons_2d(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // All but common area (xor).
- // 2D polyline vs polygon operations
- Array clip_polyline_with_polygon_2d(const Vector<Vector2> &p_polyline, const Vector<Vector2> &p_polygon); // cut
- Array intersect_polyline_with_polygon_2d(const Vector<Vector2> &p_polyline, const Vector<Vector2> &p_polygon); // chop
+ // 2D polyline vs polygon operations.
+ Array clip_polyline_with_polygon_2d(const Vector<Vector2> &p_polyline, const Vector<Vector2> &p_polygon); // Cut.
+ Array intersect_polyline_with_polygon_2d(const Vector<Vector2> &p_polyline, const Vector<Vector2> &p_polygon); // Chop.
- // 2D offset polygons/polylines
+ // 2D offset polygons/polylines.
enum PolyJoinType {
JOIN_SQUARE,
JOIN_ROUND,
@@ -446,8 +434,6 @@ public:
Array offset_polygon_2d(const Vector<Vector2> &p_polygon, real_t p_delta, PolyJoinType p_join_type = JOIN_SQUARE);
Array offset_polyline_2d(const Vector<Vector2> &p_polygon, real_t p_delta, PolyJoinType p_join_type = JOIN_SQUARE, PolyEndType p_end_type = END_SQUARE);
- Vector<Point2> transform_points_2d(const Vector<Point2> &p_points, const Transform2D &p_mat);
-
Dictionary make_atlas(const Vector<Size2> &p_rects);
_Geometry();
@@ -486,24 +472,24 @@ public:
Error open_encrypted_pass(const String &p_path, ModeFlags p_mode_flags, const String &p_pass);
Error open_compressed(const String &p_path, ModeFlags p_mode_flags, CompressionMode p_compress_mode = COMPRESSION_FASTLZ);
- Error open(const String &p_path, ModeFlags p_mode_flags); ///< open a file
- void close(); ///< close a file
- bool is_open() const; ///< true when file is open
+ Error open(const String &p_path, ModeFlags p_mode_flags); // open a file.
+ void close(); // Close a file.
+ bool is_open() const; // True when file is open.
- String get_path() const; /// returns the path for the current open file
- String get_path_absolute() const; /// returns the absolute path for the current open file
+ String get_path() const; // Returns the path for the current open file.
+ String get_path_absolute() const; // Returns the absolute path for the current open file.
- void seek(int64_t p_position); ///< seek to a given position
- void seek_end(int64_t p_position = 0); ///< seek from the end of file
- int64_t get_position() const; ///< get position in the file
- int64_t get_len() const; ///< get size of the file
+ void seek(int64_t p_position); // Seek to a given position.
+ void seek_end(int64_t p_position = 0); // Seek from the end of file.
+ int64_t get_position() const; // Get position in the file.
+ int64_t get_len() const; // Get size of the file.
- bool eof_reached() const; ///< reading passed EOF
+ bool eof_reached() const; // Reading passed EOF.
- uint8_t get_8() const; ///< get a byte
- uint16_t get_16() const; ///< get 16 bits uint
- uint32_t get_32() const; ///< get 32 bits uint
- uint64_t get_64() const; ///< get 64 bits uint
+ uint8_t get_8() const; // Get a byte.
+ uint16_t get_16() const; // Get 16 bits uint.
+ uint32_t get_32() const; // Get 32 bits uint.
+ uint64_t get_64() const; // Get 64 bits uint.
float get_float() const;
double get_double() const;
@@ -511,27 +497,27 @@ public:
Variant get_var(bool p_allow_objects = false) const;
- PoolVector<uint8_t> get_buffer(int p_length) const; ///< get an array of bytes
+ PoolVector<uint8_t> get_buffer(int p_length) const; // Get an array of bytes.
String get_line() const;
Vector<String> get_csv_line(const String &p_delim = ",") const;
String get_as_text() const;
String get_md5(const String &p_path) const;
String get_sha256(const String &p_path) const;
- /**< use this for files WRITTEN in _big_ endian machines (ie, amiga/mac)
+ /* Use this for files WRITTEN in _big_ endian machines (ie, amiga/mac).
* It's not about the current CPU type but file formats.
- * this flags get reset to false (little endian) on each open
+ * This flags get reset to false (little endian) on each open.
*/
void set_endian_swap(bool p_swap);
bool get_endian_swap();
- Error get_error() const; ///< get last error
+ Error get_error() const; // Get last error.
- void store_8(uint8_t p_dest); ///< store a byte
- void store_16(uint16_t p_dest); ///< store 16 bits uint
- void store_32(uint32_t p_dest); ///< store 32 bits uint
- void store_64(uint64_t p_dest); ///< store 64 bits uint
+ void store_8(uint8_t p_dest); // Store a byte.
+ void store_16(uint16_t p_dest); // Store 16 bits uint.
+ void store_32(uint32_t p_dest); // Store 32 bits uint.
+ void store_64(uint64_t p_dest); // Store 64 bits uint.
void store_float(float p_dest);
void store_double(double p_dest);
@@ -544,11 +530,11 @@ public:
virtual void store_pascal_string(const String &p_string);
virtual String get_pascal_string();
- void store_buffer(const PoolVector<uint8_t> &p_buffer); ///< store an array of bytes
+ void store_buffer(const PoolVector<uint8_t> &p_buffer); // Store an array of bytes.
void store_var(const Variant &p_var, bool p_full_objects = false);
- bool file_exists(const String &p_name) const; ///< return true if a file exists
+ bool file_exists(const String &p_name) const; // Return true if a file exists.
uint64_t get_modified_time(const String &p_file) const;
@@ -570,18 +556,18 @@ protected:
public:
Error open(const String &p_path);
- Error list_dir_begin(bool p_skip_navigational = false, bool p_skip_hidden = false); ///< This starts dir listing
+ Error list_dir_begin(bool p_skip_navigational = false, bool p_skip_hidden = false); // This starts dir listing.
String get_next();
bool current_is_dir() const;
- void list_dir_end(); ///<
+ void list_dir_end();
int get_drive_count();
String get_drive(int p_drive);
int get_current_drive();
- Error change_dir(String p_dir); ///< can be relative or absolute, return false on success
- String get_current_dir(); ///< return current dir location
+ Error change_dir(String p_dir); // Can be relative or absolute, return false on success.
+ String get_current_dir(); // Return current dir location.
Error make_dir(String p_dir);
Error make_dir_recursive(String p_dir);
diff --git a/core/class_db.cpp b/core/class_db.cpp
index 49e3f94d8f..3ad59bc309 100644
--- a/core/class_db.cpp
+++ b/core/class_db.cpp
@@ -836,10 +836,7 @@ void ClassDB::add_signal(StringName p_class, const MethodInfo &p_signal) {
#ifdef DEBUG_METHODS_ENABLED
ClassInfo *check = type;
while (check) {
- if (check->signal_map.has(sname)) {
- ERR_EXPLAIN("Type " + String(p_class) + " already has signal: " + String(sname));
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(check->signal_map.has(sname), "Type " + String(p_class) + " already has signal: " + String(sname) + ".");
check = check->inherits_ptr;
}
#endif
@@ -924,16 +921,11 @@ void ClassDB::add_property(StringName p_class, const PropertyInfo &p_pinfo, cons
if (p_setter) {
mb_set = get_method(p_class, p_setter);
#ifdef DEBUG_METHODS_ENABLED
- if (!mb_set) {
- ERR_EXPLAIN("Invalid Setter: " + p_class + "::" + p_setter + " for property: " + p_pinfo.name);
- ERR_FAIL();
- } else {
- int exp_args = 1 + (p_index >= 0 ? 1 : 0);
- if (mb_set->get_argument_count() != exp_args) {
- ERR_EXPLAIN("Invalid Function for Setter: " + p_class + "::" + p_setter + " for property: " + p_pinfo.name);
- ERR_FAIL();
- }
- }
+
+ ERR_FAIL_COND_MSG(!mb_set, "Invalid setter: " + p_class + "::" + p_setter + " for property: " + p_pinfo.name + ".");
+
+ int exp_args = 1 + (p_index >= 0 ? 1 : 0);
+ ERR_FAIL_COND_MSG(mb_set->get_argument_count() != exp_args, "Invalid function for setter: " + p_class + "::" + p_setter + " for property: " + p_pinfo.name + ".");
#endif
}
@@ -943,25 +935,15 @@ void ClassDB::add_property(StringName p_class, const PropertyInfo &p_pinfo, cons
mb_get = get_method(p_class, p_getter);
#ifdef DEBUG_METHODS_ENABLED
- if (!mb_get) {
- ERR_EXPLAIN("Invalid Getter: " + p_class + "::" + p_getter + " for property: " + p_pinfo.name);
- ERR_FAIL();
- } else {
+ ERR_FAIL_COND_MSG(!mb_get, "Invalid getter: " + p_class + "::" + p_getter + " for property: " + p_pinfo.name + ".");
- int exp_args = 0 + (p_index >= 0 ? 1 : 0);
- if (mb_get->get_argument_count() != exp_args) {
- ERR_EXPLAIN("Invalid Function for Getter: " + p_class + "::" + p_getter + " for property: " + p_pinfo.name);
- ERR_FAIL();
- }
- }
+ int exp_args = 0 + (p_index >= 0 ? 1 : 0);
+ ERR_FAIL_COND_MSG(mb_get->get_argument_count() != exp_args, "Invalid function for getter: " + p_class + "::" + p_getter + " for property: " + p_pinfo.name + ".");
#endif
}
#ifdef DEBUG_METHODS_ENABLED
- if (type->property_setget.has(p_pinfo.name)) {
- ERR_EXPLAIN("Object " + p_class + " already has property: " + p_pinfo.name);
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(type->property_setget.has(p_pinfo.name), "Object " + p_class + " already has property: " + p_pinfo.name + ".");
#endif
OBJTYPE_WLOCK
@@ -1240,32 +1222,26 @@ MethodBind *ClassDB::bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const c
#ifdef DEBUG_ENABLED
- if (has_method(instance_type, mdname)) {
- ERR_EXPLAIN("Class " + String(instance_type) + " already has a method " + String(mdname));
- ERR_FAIL_V(NULL);
- }
+ ERR_FAIL_COND_V_MSG(has_method(instance_type, mdname), NULL, "Class " + String(instance_type) + " already has a method " + String(mdname) + ".");
#endif
ClassInfo *type = classes.getptr(instance_type);
if (!type) {
- ERR_PRINTS("Couldn't bind method '" + mdname + "' for instance: " + instance_type);
memdelete(p_bind);
- ERR_FAIL_V(NULL);
+ ERR_FAIL_V_MSG(NULL, "Couldn't bind method '" + mdname + "' for instance: " + instance_type + ".");
}
if (type->method_map.has(mdname)) {
memdelete(p_bind);
// overloading not supported
- ERR_EXPLAIN("Method already bound: " + instance_type + "::" + mdname);
- ERR_FAIL_V(NULL);
+ ERR_FAIL_V_MSG(NULL, "Method already bound: " + instance_type + "::" + mdname + ".");
}
#ifdef DEBUG_METHODS_ENABLED
if (method_name.args.size() > p_bind->get_argument_count()) {
memdelete(p_bind);
- ERR_EXPLAIN("Method definition provides more arguments than the method actually has: " + instance_type + "::" + mdname);
- ERR_FAIL_V(NULL);
+ ERR_FAIL_V_MSG(NULL, "Method definition provides more arguments than the method actually has: " + instance_type + "::" + mdname + ".");
}
p_bind->set_argument_names(method_name.args);
diff --git a/core/class_db.h b/core/class_db.h
index 3d9a695f02..092469beb7 100644
--- a/core/class_db.h
+++ b/core/class_db.h
@@ -35,10 +35,6 @@
#include "core/object.h"
#include "core/print_string.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
/** To bind more then 6 parameters include this:
* #include "core/method_bind_ext.gen.inc"
*/
@@ -310,8 +306,7 @@ public:
if (type->method_map.has(p_name)) {
memdelete(bind);
// overloading not supported
- ERR_EXPLAIN("Method already bound: " + instance_type + "::" + p_name);
- ERR_FAIL_V(NULL);
+ ERR_FAIL_V_MSG(NULL, "Method already bound: " + instance_type + "::" + p_name + ".");
}
type->method_map[p_name] = bind;
#ifdef DEBUG_METHODS_ENABLED
diff --git a/core/color.cpp b/core/color.cpp
index 1843532124..a54a3115cc 100644
--- a/core/color.cpp
+++ b/core/color.cpp
@@ -335,36 +335,23 @@ Color Color::html(const String &p_color) {
} else if (color.length() == 6) {
alpha = false;
} else {
- ERR_EXPLAIN("Invalid Color Code: " + p_color);
- ERR_FAIL_V(Color());
+ ERR_FAIL_V_MSG(Color(), "Invalid color code: " + p_color + ".");
}
int a = 255;
if (alpha) {
a = _parse_col(color, 0);
- if (a < 0) {
- ERR_EXPLAIN("Invalid Color Code: " + p_color);
- ERR_FAIL_V(Color());
- }
+ ERR_FAIL_COND_V_MSG(a < 0, Color(), "Invalid color code: " + p_color + ".");
}
int from = alpha ? 2 : 0;
int r = _parse_col(color, from + 0);
- if (r < 0) {
- ERR_EXPLAIN("Invalid Color Code: " + p_color);
- ERR_FAIL_V(Color());
- }
+ ERR_FAIL_COND_V_MSG(r < 0, Color(), "Invalid color code: " + p_color + ".");
int g = _parse_col(color, from + 2);
- if (g < 0) {
- ERR_EXPLAIN("Invalid Color Code: " + p_color);
- ERR_FAIL_V(Color());
- }
+ ERR_FAIL_COND_V_MSG(g < 0, Color(), "Invalid color code: " + p_color + ".");
int b = _parse_col(color, from + 4);
- if (b < 0) {
- ERR_EXPLAIN("Invalid Color Code: " + p_color);
- ERR_FAIL_V(Color());
- }
+ ERR_FAIL_COND_V_MSG(b < 0, Color(), "Invalid color code: " + p_color + ".");
return Color(r / 255.0, g / 255.0, b / 255.0, a / 255.0);
}
@@ -425,12 +412,8 @@ Color Color::named(const String &p_name) {
name = name.to_lower();
const Map<String, Color>::Element *color = _named_colors.find(name);
- if (color) {
- return color->value();
- } else {
- ERR_EXPLAIN("Invalid Color Name: " + p_name);
- ERR_FAIL_V(Color());
- }
+ ERR_FAIL_NULL_V_MSG(color, Color(), "Invalid color name: " + p_name + ".");
+ return color->value();
}
String _to_hex(float p_val) {
@@ -523,8 +506,7 @@ Color Color::from_hsv(float p_h, float p_s, float p_v, float p_a) const {
// FIXME: Remove once Godot 3.1 has been released
float Color::gray() const {
- ERR_EXPLAIN("Color.gray() is deprecated and will be removed in a future version. Use Color.get_v() for a better grayscale approximation.");
- WARN_DEPRECATED;
+ WARN_DEPRECATED_MSG("Color.gray() is deprecated and will be removed in a future version. Use Color.get_v() for a better grayscale approximation.");
return (r + g + b) / 3.0;
}
diff --git a/core/color.h b/core/color.h
index 77f95b5dc9..8fb78d1ced 100644
--- a/core/color.h
+++ b/core/color.h
@@ -33,9 +33,7 @@
#include "core/math/math_funcs.h"
#include "core/ustring.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
struct Color {
union {
diff --git a/core/command_queue_mt.h b/core/command_queue_mt.h
index 3789eda5db..98f5bc56d7 100644
--- a/core/command_queue_mt.h
+++ b/core/command_queue_mt.h
@@ -37,10 +37,6 @@
#include "core/simple_type.h"
#include "core/typedefs.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
#define COMMA(N) _COMMA_##N
#define _COMMA_0
#define _COMMA_1 ,
diff --git a/core/crypto/SCsub b/core/crypto/SCsub
new file mode 100644
index 0000000000..0a3f05d87a
--- /dev/null
+++ b/core/crypto/SCsub
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+
+Import('env')
+
+env_crypto = env.Clone()
+
+is_builtin = env["builtin_mbedtls"]
+has_module = env["module_mbedtls_enabled"]
+
+if is_builtin or not has_module:
+ # Use our headers for builtin or if the module is not going to be compiled.
+ # We decided not to depend on system mbedtls just for these few files that can
+ # be easily extracted.
+ env_crypto.Prepend(CPPPATH=["#thirdparty/mbedtls/include"])
+
+# MbedTLS core functions (for CryptoCore).
+# If the mbedtls module is compiled we don't need to add the .c files with our
+# custom config since they will be built by the module itself.
+# Only if the module is not enabled, we must compile here the required sources
+# to make a "light" build with only the necessary mbedtls files.
+if not has_module:
+ env_thirdparty = env_crypto.Clone()
+ env_thirdparty.disable_warnings()
+ # Custom config file
+ env_thirdparty.Append(CPPDEFINES=[('MBEDTLS_CONFIG_FILE', '\\"thirdparty/mbedtls/include/godot_core_mbedtls_config.h\\"')])
+ thirdparty_mbedtls_dir = "#thirdparty/mbedtls/library/"
+ thirdparty_mbedtls_sources = [
+ "aes.c",
+ "base64.c",
+ "md5.c",
+ "sha1.c",
+ "sha256.c",
+ "godot_core_mbedtls_platform.c"
+ ]
+ thirdparty_mbedtls_sources = [thirdparty_mbedtls_dir + file for file in thirdparty_mbedtls_sources]
+ env_thirdparty.add_source_files(env.core_sources, thirdparty_mbedtls_sources)
+
+env_crypto.add_source_files(env.core_sources, "*.cpp")
diff --git a/core/crypto/crypto.cpp b/core/crypto/crypto.cpp
new file mode 100644
index 0000000000..925a01b36a
--- /dev/null
+++ b/core/crypto/crypto.cpp
@@ -0,0 +1,170 @@
+/*************************************************************************/
+/* crypto.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "crypto.h"
+
+#include "core/engine.h"
+#include "core/io/certs_compressed.gen.h"
+#include "core/io/compression.h"
+
+/// Resources
+
+CryptoKey *(*CryptoKey::_create)() = NULL;
+CryptoKey *CryptoKey::create() {
+ if (_create)
+ return _create();
+ return NULL;
+}
+
+void CryptoKey::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("save", "path"), &CryptoKey::save);
+ ClassDB::bind_method(D_METHOD("load", "path"), &CryptoKey::load);
+}
+
+X509Certificate *(*X509Certificate::_create)() = NULL;
+X509Certificate *X509Certificate::create() {
+ if (_create)
+ return _create();
+ return NULL;
+}
+
+void X509Certificate::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("save", "path"), &X509Certificate::save);
+ ClassDB::bind_method(D_METHOD("load", "path"), &X509Certificate::load);
+}
+
+/// Crypto
+
+void (*Crypto::_load_default_certificates)(String p_path) = NULL;
+Crypto *(*Crypto::_create)() = NULL;
+Crypto *Crypto::create() {
+ if (_create)
+ return _create();
+ return memnew(Crypto);
+}
+
+void Crypto::load_default_certificates(String p_path) {
+
+ if (_load_default_certificates)
+ _load_default_certificates(p_path);
+}
+
+void Crypto::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("generate_random_bytes", "size"), &Crypto::generate_random_bytes);
+ ClassDB::bind_method(D_METHOD("generate_rsa", "size"), &Crypto::generate_rsa);
+ ClassDB::bind_method(D_METHOD("generate_self_signed_certificate", "key", "issuer_name", "not_before", "not_after"), &Crypto::generate_self_signed_certificate, DEFVAL("CN=myserver,O=myorganisation,C=IT"), DEFVAL("20140101000000"), DEFVAL("20340101000000"));
+}
+
+PoolByteArray Crypto::generate_random_bytes(int p_bytes) {
+ ERR_FAIL_V_MSG(PoolByteArray(), "generate_random_bytes is not available when mbedtls module is disabled.");
+}
+
+Ref<CryptoKey> Crypto::generate_rsa(int p_bytes) {
+ ERR_FAIL_V_MSG(NULL, "generate_rsa is not available when mbedtls module is disabled.");
+}
+
+Ref<X509Certificate> Crypto::generate_self_signed_certificate(Ref<CryptoKey> p_key, String p_issuer_name, String p_not_before, String p_not_after) {
+ ERR_FAIL_V_MSG(NULL, "generate_self_signed_certificate is not available when mbedtls module is disabled.");
+}
+
+Crypto::Crypto() {
+}
+
+/// Resource loader/saver
+
+RES ResourceFormatLoaderCrypto::load(const String &p_path, const String &p_original_path, Error *r_error) {
+
+ String el = p_path.get_extension().to_lower();
+ if (el == "crt") {
+ X509Certificate *cert = X509Certificate::create();
+ if (cert)
+ cert->load(p_path);
+ return cert;
+ } else if (el == "key") {
+ CryptoKey *key = CryptoKey::create();
+ if (key)
+ key->load(p_path);
+ return key;
+ }
+ return NULL;
+}
+
+void ResourceFormatLoaderCrypto::get_recognized_extensions(List<String> *p_extensions) const {
+
+ p_extensions->push_back("crt");
+ p_extensions->push_back("key");
+}
+
+bool ResourceFormatLoaderCrypto::handles_type(const String &p_type) const {
+
+ return p_type == "X509Certificate" || p_type == "CryptoKey";
+}
+
+String ResourceFormatLoaderCrypto::get_resource_type(const String &p_path) const {
+
+ String el = p_path.get_extension().to_lower();
+ if (el == "crt")
+ return "X509Certificate";
+ else if (el == "key")
+ return "CryptoKey";
+ return "";
+}
+
+Error ResourceFormatSaverCrypto::save(const String &p_path, const RES &p_resource, uint32_t p_flags) {
+
+ Error err;
+ Ref<X509Certificate> cert = p_resource;
+ Ref<CryptoKey> key = p_resource;
+ if (cert.is_valid()) {
+ err = cert->save(p_path);
+ } else if (key.is_valid()) {
+ err = key->save(p_path);
+ } else {
+ ERR_FAIL_V(ERR_INVALID_PARAMETER);
+ }
+ ERR_FAIL_COND_V(err != OK, err);
+ return OK;
+}
+
+void ResourceFormatSaverCrypto::get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const {
+
+ const X509Certificate *cert = Object::cast_to<X509Certificate>(*p_resource);
+ const CryptoKey *key = Object::cast_to<CryptoKey>(*p_resource);
+ if (cert) {
+ p_extensions->push_back("crt");
+ }
+ if (key) {
+ p_extensions->push_back("key");
+ }
+}
+bool ResourceFormatSaverCrypto::recognize(const RES &p_resource) const {
+
+ return Object::cast_to<X509Certificate>(*p_resource) || Object::cast_to<CryptoKey>(*p_resource);
+}
diff --git a/core/crypto/crypto.h b/core/crypto/crypto.h
new file mode 100644
index 0000000000..2de81f5b57
--- /dev/null
+++ b/core/crypto/crypto.h
@@ -0,0 +1,105 @@
+/*************************************************************************/
+/* crypto.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef CRYPTO_H
+#define CRYPTO_H
+
+#include "core/reference.h"
+#include "core/resource.h"
+
+#include "core/io/resource_loader.h"
+#include "core/io/resource_saver.h"
+
+class CryptoKey : public Resource {
+ GDCLASS(CryptoKey, Resource);
+
+protected:
+ static void _bind_methods();
+ static CryptoKey *(*_create)();
+
+public:
+ static CryptoKey *create();
+ virtual Error load(String p_path) = 0;
+ virtual Error save(String p_path) = 0;
+};
+
+class X509Certificate : public Resource {
+ GDCLASS(X509Certificate, Resource);
+
+protected:
+ static void _bind_methods();
+ static X509Certificate *(*_create)();
+
+public:
+ static X509Certificate *create();
+ virtual Error load(String p_path) = 0;
+ virtual Error load_from_memory(const uint8_t *p_buffer, int p_len) = 0;
+ virtual Error save(String p_path) = 0;
+};
+
+class Crypto : public Reference {
+ GDCLASS(Crypto, Reference);
+
+protected:
+ static void _bind_methods();
+ static Crypto *(*_create)();
+ static void (*_load_default_certificates)(String p_path);
+
+public:
+ static Crypto *create();
+ static void load_default_certificates(String p_path);
+
+ virtual PoolByteArray generate_random_bytes(int p_bytes);
+ virtual Ref<CryptoKey> generate_rsa(int p_bytes);
+ virtual Ref<X509Certificate> generate_self_signed_certificate(Ref<CryptoKey> p_key, String p_issuer_name, String p_not_before, String p_not_after);
+
+ Crypto();
+};
+
+class ResourceFormatLoaderCrypto : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderCrypto, ResourceFormatLoader);
+
+public:
+ virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
+ virtual void get_recognized_extensions(List<String> *p_extensions) const;
+ virtual bool handles_type(const String &p_type) const;
+ virtual String get_resource_type(const String &p_path) const;
+};
+
+class ResourceFormatSaverCrypto : public ResourceFormatSaver {
+ GDCLASS(ResourceFormatSaverCrypto, ResourceFormatSaver);
+
+public:
+ virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0);
+ virtual void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const;
+ virtual bool recognize(const RES &p_resource) const;
+};
+
+#endif // CRYPTO_H
diff --git a/core/math/crypto_core.cpp b/core/crypto/crypto_core.cpp
index d7ba54e469..51c2e3c9e5 100644
--- a/core/math/crypto_core.cpp
+++ b/core/crypto/crypto_core.cpp
@@ -52,7 +52,7 @@ Error CryptoCore::MD5Context::start() {
return ret ? FAILED : OK;
}
-Error CryptoCore::MD5Context::update(uint8_t *p_src, size_t p_len) {
+Error CryptoCore::MD5Context::update(const uint8_t *p_src, size_t p_len) {
int ret = mbedtls_md5_update_ret((mbedtls_md5_context *)ctx, p_src, p_len);
return ret ? FAILED : OK;
}
@@ -62,6 +62,32 @@ Error CryptoCore::MD5Context::finish(unsigned char r_hash[16]) {
return ret ? FAILED : OK;
}
+// SHA1
+CryptoCore::SHA1Context::SHA1Context() {
+ ctx = memalloc(sizeof(mbedtls_sha1_context));
+ mbedtls_sha1_init((mbedtls_sha1_context *)ctx);
+}
+
+CryptoCore::SHA1Context::~SHA1Context() {
+ mbedtls_sha1_free((mbedtls_sha1_context *)ctx);
+ memfree((mbedtls_sha1_context *)ctx);
+}
+
+Error CryptoCore::SHA1Context::start() {
+ int ret = mbedtls_sha1_starts_ret((mbedtls_sha1_context *)ctx);
+ return ret ? FAILED : OK;
+}
+
+Error CryptoCore::SHA1Context::update(const uint8_t *p_src, size_t p_len) {
+ int ret = mbedtls_sha1_update_ret((mbedtls_sha1_context *)ctx, p_src, p_len);
+ return ret ? FAILED : OK;
+}
+
+Error CryptoCore::SHA1Context::finish(unsigned char r_hash[20]) {
+ int ret = mbedtls_sha1_finish_ret((mbedtls_sha1_context *)ctx, r_hash);
+ return ret ? FAILED : OK;
+}
+
// SHA256
CryptoCore::SHA256Context::SHA256Context() {
ctx = memalloc(sizeof(mbedtls_sha256_context));
@@ -78,12 +104,12 @@ Error CryptoCore::SHA256Context::start() {
return ret ? FAILED : OK;
}
-Error CryptoCore::SHA256Context::update(uint8_t *p_src, size_t p_len) {
+Error CryptoCore::SHA256Context::update(const uint8_t *p_src, size_t p_len) {
int ret = mbedtls_sha256_update_ret((mbedtls_sha256_context *)ctx, p_src, p_len);
return ret ? FAILED : OK;
}
-Error CryptoCore::SHA256Context::finish(unsigned char r_hash[16]) {
+Error CryptoCore::SHA256Context::finish(unsigned char r_hash[32]) {
int ret = mbedtls_sha256_finish_ret((mbedtls_sha256_context *)ctx, r_hash);
return ret ? FAILED : OK;
}
diff --git a/core/math/crypto_core.h b/core/crypto/crypto_core.h
index e28cb5a792..c859d612d4 100644
--- a/core/math/crypto_core.h
+++ b/core/crypto/crypto_core.h
@@ -46,10 +46,24 @@ public:
~MD5Context();
Error start();
- Error update(uint8_t *p_src, size_t p_len);
+ Error update(const uint8_t *p_src, size_t p_len);
Error finish(unsigned char r_hash[16]);
};
+ class SHA1Context {
+
+ private:
+ void *ctx; // To include, or not to include...
+
+ public:
+ SHA1Context();
+ ~SHA1Context();
+
+ Error start();
+ Error update(const uint8_t *p_src, size_t p_len);
+ Error finish(unsigned char r_hash[20]);
+ };
+
class SHA256Context {
private:
@@ -60,8 +74,8 @@ public:
~SHA256Context();
Error start();
- Error update(uint8_t *p_src, size_t p_len);
- Error finish(unsigned char r_hash[16]);
+ Error update(const uint8_t *p_src, size_t p_len);
+ Error finish(unsigned char r_hash[32]);
};
class AESContext {
diff --git a/core/crypto/hashing_context.cpp b/core/crypto/hashing_context.cpp
new file mode 100644
index 0000000000..bdccb258dd
--- /dev/null
+++ b/core/crypto/hashing_context.cpp
@@ -0,0 +1,137 @@
+/*************************************************************************/
+/* hashing_context.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "hashing_context.h"
+
+#include "core/crypto/crypto_core.h"
+
+Error HashingContext::start(HashType p_type) {
+ ERR_FAIL_COND_V(ctx != NULL, ERR_ALREADY_IN_USE);
+ _create_ctx(p_type);
+ ERR_FAIL_COND_V(ctx == NULL, ERR_UNAVAILABLE);
+ switch (type) {
+ case HASH_MD5:
+ return ((CryptoCore::MD5Context *)ctx)->start();
+ case HASH_SHA1:
+ return ((CryptoCore::SHA1Context *)ctx)->start();
+ case HASH_SHA256:
+ return ((CryptoCore::SHA256Context *)ctx)->start();
+ }
+ return ERR_UNAVAILABLE;
+}
+
+Error HashingContext::update(PoolByteArray p_chunk) {
+ ERR_FAIL_COND_V(ctx == NULL, ERR_UNCONFIGURED);
+ size_t len = p_chunk.size();
+ PoolByteArray::Read r = p_chunk.read();
+ switch (type) {
+ case HASH_MD5:
+ return ((CryptoCore::MD5Context *)ctx)->update(&r[0], len);
+ case HASH_SHA1:
+ return ((CryptoCore::SHA1Context *)ctx)->update(&r[0], len);
+ case HASH_SHA256:
+ return ((CryptoCore::SHA256Context *)ctx)->update(&r[0], len);
+ }
+ return ERR_UNAVAILABLE;
+}
+
+PoolByteArray HashingContext::finish() {
+ ERR_FAIL_COND_V(ctx == NULL, PoolByteArray());
+ PoolByteArray out;
+ Error err = FAILED;
+ switch (type) {
+ case HASH_MD5:
+ out.resize(16);
+ err = ((CryptoCore::MD5Context *)ctx)->finish(out.write().ptr());
+ break;
+ case HASH_SHA1:
+ out.resize(20);
+ err = ((CryptoCore::SHA1Context *)ctx)->finish(out.write().ptr());
+ break;
+ case HASH_SHA256:
+ out.resize(32);
+ err = ((CryptoCore::SHA256Context *)ctx)->finish(out.write().ptr());
+ break;
+ }
+ _delete_ctx();
+ ERR_FAIL_COND_V(err != OK, PoolByteArray());
+ return out;
+}
+
+void HashingContext::_create_ctx(HashType p_type) {
+ type = p_type;
+ switch (type) {
+ case HASH_MD5:
+ ctx = memnew(CryptoCore::MD5Context);
+ break;
+ case HASH_SHA1:
+ ctx = memnew(CryptoCore::SHA1Context);
+ break;
+ case HASH_SHA256:
+ ctx = memnew(CryptoCore::SHA256Context);
+ break;
+ default:
+ ctx = NULL;
+ }
+}
+
+void HashingContext::_delete_ctx() {
+ return;
+ switch (type) {
+ case HASH_MD5:
+ memdelete((CryptoCore::MD5Context *)ctx);
+ break;
+ case HASH_SHA1:
+ memdelete((CryptoCore::SHA1Context *)ctx);
+ break;
+ case HASH_SHA256:
+ memdelete((CryptoCore::SHA256Context *)ctx);
+ break;
+ }
+ ctx = NULL;
+}
+
+void HashingContext::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("start", "type"), &HashingContext::start);
+ ClassDB::bind_method(D_METHOD("update", "chunk"), &HashingContext::update);
+ ClassDB::bind_method(D_METHOD("finish"), &HashingContext::finish);
+ BIND_ENUM_CONSTANT(HASH_MD5);
+ BIND_ENUM_CONSTANT(HASH_SHA1);
+ BIND_ENUM_CONSTANT(HASH_SHA256);
+}
+
+HashingContext::HashingContext() {
+ ctx = NULL;
+}
+
+HashingContext::~HashingContext() {
+ if (ctx != NULL)
+ _delete_ctx();
+}
diff --git a/core/crypto/hashing_context.h b/core/crypto/hashing_context.h
new file mode 100644
index 0000000000..aa69636f2c
--- /dev/null
+++ b/core/crypto/hashing_context.h
@@ -0,0 +1,66 @@
+/*************************************************************************/
+/* hashing_context.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef HASHING_CONTEXT_H
+#define HASHING_CONTEXT_H
+
+#include "core/reference.h"
+
+class HashingContext : public Reference {
+ GDCLASS(HashingContext, Reference);
+
+public:
+ enum HashType {
+ HASH_MD5,
+ HASH_SHA1,
+ HASH_SHA256
+ };
+
+private:
+ void *ctx;
+ HashType type;
+
+protected:
+ static void _bind_methods();
+ void _create_ctx(HashType p_type);
+ void _delete_ctx();
+
+public:
+ Error start(HashType p_type);
+ Error update(PoolByteArray p_chunk);
+ PoolByteArray finish();
+
+ HashingContext();
+ ~HashingContext();
+};
+
+VARIANT_ENUM_CAST(HashingContext::HashType);
+
+#endif // HASHING_CONTEXT_H
diff --git a/core/engine.cpp b/core/engine.cpp
index 0dd0459403..937439faaf 100644
--- a/core/engine.cpp
+++ b/core/engine.cpp
@@ -197,10 +197,7 @@ void Engine::add_singleton(const Singleton &p_singleton) {
Object *Engine::get_singleton_object(const String &p_name) const {
const Map<StringName, Object *>::Element *E = singleton_ptrs.find(p_name);
- if (!E) {
- ERR_EXPLAIN("Failed to retrieve non-existent singleton '" + p_name + "'");
- ERR_FAIL_V(NULL);
- }
+ ERR_FAIL_COND_V_MSG(!E, NULL, "Failed to retrieve non-existent singleton '" + p_name + "'.");
return E->get();
};
diff --git a/core/hash_map.h b/core/hash_map.h
index 1513d7a65b..81ddc376d0 100644
--- a/core/hash_map.h
+++ b/core/hash_map.h
@@ -151,11 +151,7 @@ private:
return;
Element **new_hash_table = memnew_arr(Element *, ((uint64_t)1 << new_hash_table_power));
- if (!new_hash_table) {
-
- ERR_PRINT("Out of Memory");
- return;
- }
+ ERR_FAIL_COND_MSG(!new_hash_table, "Out of memory.");
for (int i = 0; i < (1 << new_hash_table_power); i++) {
@@ -208,10 +204,7 @@ private:
/* if element doesn't exist, create it */
Element *e = memnew(Element);
- if (!e) {
- ERR_EXPLAIN("Out of memory");
- ERR_FAIL_V(NULL);
- }
+ ERR_FAIL_COND_V_MSG(!e, NULL, "Out of memory.");
uint32_t hash = Hasher::hash(p_key);
uint32_t index = hash & ((1 << hash_table_power) - 1);
e->next = hash_table[index];
@@ -498,10 +491,7 @@ public:
} else { /* get the next key */
const Element *e = get_element(*p_key);
- if (!e) {
- ERR_EXPLAIN("Invalid key supplied")
- ERR_FAIL_V(NULL);
- }
+ ERR_FAIL_COND_V_MSG(!e, NULL, "Invalid key supplied.");
if (e->next) {
/* if there is a "next" in the list, return that */
return &e->next->pair.key;
diff --git a/core/image.cpp b/core/image.cpp
index 5ce744f709..900efb0eb0 100644
--- a/core/image.cpp
+++ b/core/image.cpp
@@ -423,8 +423,7 @@ void Image::convert(Format p_new_format) {
if (format > FORMAT_RGBE9995 || p_new_format > FORMAT_RGBE9995) {
- ERR_EXPLAIN("Cannot convert to <-> from compressed formats. Use compress() and decompress() instead.");
- ERR_FAIL();
+ ERR_FAIL_MSG("Cannot convert to <-> from compressed formats. Use compress() and decompress() instead.");
} else if (format > FORMAT_RGBA8 || p_new_format > FORMAT_RGBA8) {
@@ -754,15 +753,14 @@ static void _scale_lanczos(const uint8_t *__restrict p_src, uint8_t *__restrict
for (int32_t buffer_x = 0; buffer_x < dst_width; buffer_x++) {
- float src_real_x = buffer_x * x_scale;
- int32_t src_x = src_real_x;
-
- int32_t start_x = MAX(0, src_x - half_kernel + 1);
- int32_t end_x = MIN(src_width - 1, src_x + half_kernel);
+ // The corresponding point on the source image
+ float src_x = (buffer_x + 0.5f) * x_scale; // Offset by 0.5 so it uses the pixel's center
+ int32_t start_x = MAX(0, int32_t(src_x) - half_kernel + 1);
+ int32_t end_x = MIN(src_width - 1, int32_t(src_x) + half_kernel);
// Create the kernel used by all the pixels of the column
for (int32_t target_x = start_x; target_x <= end_x; target_x++)
- kernel[target_x - start_x] = _lanczos((src_real_x - target_x) / scale_factor);
+ kernel[target_x - start_x] = _lanczos((target_x + 0.5f - src_x) / scale_factor);
for (int32_t buffer_y = 0; buffer_y < src_height; buffer_y++) {
@@ -805,14 +803,12 @@ static void _scale_lanczos(const uint8_t *__restrict p_src, uint8_t *__restrict
for (int32_t dst_y = 0; dst_y < dst_height; dst_y++) {
- float buffer_real_y = dst_y * y_scale;
- int32_t buffer_y = buffer_real_y;
-
- int32_t start_y = MAX(0, buffer_y - half_kernel + 1);
- int32_t end_y = MIN(src_height - 1, buffer_y + half_kernel);
+ float buffer_y = (dst_y + 0.5f) * y_scale;
+ int32_t start_y = MAX(0, int32_t(buffer_y) - half_kernel + 1);
+ int32_t end_y = MIN(src_height - 1, int32_t(buffer_y) + half_kernel);
for (int32_t target_y = start_y; target_y <= end_y; target_y++)
- kernel[target_y - start_y] = _lanczos((buffer_real_y - target_y) / scale_factor);
+ kernel[target_y - start_y] = _lanczos((target_y + 0.5f - buffer_y) / scale_factor);
for (int32_t dst_x = 0; dst_x < dst_width; dst_x++) {
@@ -867,10 +863,7 @@ bool Image::is_size_po2() const {
void Image::resize_to_po2(bool p_square) {
- if (!_can_modify(format)) {
- ERR_EXPLAIN("Cannot resize in indexed, compressed or custom image formats.");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(!_can_modify(format), "Cannot resize in compressed or custom image formats.");
int w = next_power_of_2(width);
int h = next_power_of_2(height);
@@ -886,15 +879,9 @@ void Image::resize_to_po2(bool p_square) {
void Image::resize(int p_width, int p_height, Interpolation p_interpolation) {
- if (data.size() == 0) {
- ERR_EXPLAIN("Cannot resize image before creating it, use create() or create_from_data() first.");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(data.size() == 0, "Cannot resize image before creating it, use create() or create_from_data() first.");
- if (!_can_modify(format)) {
- ERR_EXPLAIN("Cannot resize in indexed, compressed or custom image formats.");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(!_can_modify(format), "Cannot resize in compressed or custom image formats.");
bool mipmap_aware = p_interpolation == INTERPOLATE_TRILINEAR /* || p_interpolation == INTERPOLATE_TRICUBIC */;
@@ -1107,10 +1094,8 @@ void Image::resize(int p_width, int p_height, Interpolation p_interpolation) {
void Image::crop_from_point(int p_x, int p_y, int p_width, int p_height) {
- if (!_can_modify(format)) {
- ERR_EXPLAIN("Cannot crop in indexed, compressed or custom image formats.");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(!_can_modify(format), "Cannot crop in compressed or custom image formats.");
+
ERR_FAIL_COND(p_x < 0);
ERR_FAIL_COND(p_y < 0);
ERR_FAIL_COND(p_width <= 0);
@@ -1164,10 +1149,7 @@ void Image::crop(int p_width, int p_height) {
void Image::flip_y() {
- if (!_can_modify(format)) {
- ERR_EXPLAIN("Cannot flip_y in indexed, compressed or custom image formats.");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(!_can_modify(format), "Cannot flip_y in compressed or custom image formats.");
bool used_mipmaps = has_mipmaps();
if (used_mipmaps) {
@@ -1200,10 +1182,7 @@ void Image::flip_y() {
void Image::flip_x() {
- if (!_can_modify(format)) {
- ERR_EXPLAIN("Cannot flip_x in indexed, compressed or custom image formats.");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(!_can_modify(format), "Cannot flip_x in compressed or custom image formats.");
bool used_mipmaps = has_mipmaps();
if (used_mipmaps) {
@@ -1462,15 +1441,9 @@ void Image::normalize() {
Error Image::generate_mipmaps(bool p_renormalize) {
- if (!_can_modify(format)) {
- ERR_EXPLAIN("Cannot generate mipmaps in indexed, compressed or custom image formats.");
- ERR_FAIL_V(ERR_UNAVAILABLE);
- }
+ ERR_FAIL_COND_V_MSG(!_can_modify(format), ERR_UNAVAILABLE, "Cannot generate mipmaps in compressed or custom image formats.");
- if (width == 0 || height == 0) {
- ERR_EXPLAIN("Cannot generate mipmaps with width or height equal to 0.");
- ERR_FAIL_V(ERR_UNCONFIGURED);
- }
+ ERR_FAIL_COND_V_MSG(width == 0 || height == 0, ERR_UNCONFIGURED, "Cannot generate mipmaps with width or height equal to 0.");
int mmcount;
@@ -1621,10 +1594,7 @@ void Image::create(int p_width, int p_height, bool p_use_mipmaps, Format p_forma
int mm;
int size = _get_dst_image_size(p_width, p_height, p_format, mm, p_use_mipmaps ? -1 : 0);
- if (size != p_data.size()) {
- ERR_EXPLAIN("Expected data size of " + itos(size) + " bytes in Image::create(), got instead " + itos(p_data.size()) + " bytes.");
- ERR_FAIL_COND(p_data.size() != size);
- }
+ ERR_FAIL_COND_MSG(p_data.size() != size, "Expected data size of " + itos(size) + " bytes in Image::create(), got instead " + itos(p_data.size()) + " bytes.");
height = p_height;
width = p_width;
@@ -2414,10 +2384,7 @@ Color Image::get_pixel(int p_x, int p_y) const {
uint8_t *ptr = write_lock.ptr();
#ifdef DEBUG_ENABLED
- if (!ptr) {
- ERR_EXPLAIN("Image must be locked with 'lock()' before using get_pixel()");
- ERR_FAIL_V(Color());
- }
+ ERR_FAIL_COND_V_MSG(!ptr, Color(), "Image must be locked with 'lock()' before using get_pixel().");
ERR_FAIL_INDEX_V(p_x, width, Color());
ERR_FAIL_INDEX_V(p_y, height, Color());
@@ -2533,8 +2500,7 @@ Color Image::get_pixel(int p_x, int p_y) const {
return Color::from_rgbe9995(((uint32_t *)ptr)[ofs]);
}
default: {
- ERR_EXPLAIN("Can't get_pixel() on compressed image, sorry.");
- ERR_FAIL_V(Color());
+ ERR_FAIL_V_MSG(Color(), "Can't get_pixel() on compressed image, sorry.");
}
}
}
@@ -2547,10 +2513,7 @@ void Image::set_pixel(int p_x, int p_y, const Color &p_color) {
uint8_t *ptr = write_lock.ptr();
#ifdef DEBUG_ENABLED
- if (!ptr) {
- ERR_EXPLAIN("Image must be locked with 'lock()' before using set_pixel()");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(!ptr, "Image must be locked with 'lock()' before using set_pixel().");
ERR_FAIL_INDEX(p_x, width);
ERR_FAIL_INDEX(p_y, height);
@@ -2662,8 +2625,7 @@ void Image::set_pixel(int p_x, int p_y, const Color &p_color) {
} break;
default: {
- ERR_EXPLAIN("Can't set_pixel() on compressed image, sorry.");
- ERR_FAIL();
+ ERR_FAIL_MSG("Can't set_pixel() on compressed image, sorry.");
}
}
}
diff --git a/core/image.h b/core/image.h
index d17571399d..f29a30cda0 100644
--- a/core/image.h
+++ b/core/image.h
@@ -220,9 +220,7 @@ public:
/**
* Resize the image, using the preferred interpolation method.
- * Indexed-Color images always use INTERPOLATE_NEAREST.
*/
-
void resize_to_po2(bool p_square = false);
void resize(int p_width, int p_height, Interpolation p_interpolation = INTERPOLATE_BILINEAR);
void shrink_x2();
diff --git a/core/input_map.cpp b/core/input_map.cpp
index 165999f081..2a8ac435fe 100644
--- a/core/input_map.cpp
+++ b/core/input_map.cpp
@@ -192,10 +192,7 @@ bool InputMap::event_is_action(const Ref<InputEvent> &p_event, const StringName
bool InputMap::event_get_action_status(const Ref<InputEvent> &p_event, const StringName &p_action, bool *p_pressed, float *p_strength) const {
Map<StringName, Action>::Element *E = input_map.find(p_action);
- if (!E) {
- ERR_EXPLAIN("Request for nonexistent InputMap action: " + String(p_action));
- ERR_FAIL_V(false);
- }
+ ERR_FAIL_COND_V_MSG(!E, false, "Request for nonexistent InputMap action: " + String(p_action) + ".");
Ref<InputEventAction> input_event_action = p_event;
if (input_event_action.is_valid()) {
diff --git a/core/io/config_file.cpp b/core/io/config_file.cpp
index f7fb72c089..9063e028be 100644
--- a/core/io/config_file.cpp
+++ b/core/io/config_file.cpp
@@ -86,10 +86,7 @@ void ConfigFile::set_value(const String &p_section, const String &p_key, const V
Variant ConfigFile::get_value(const String &p_section, const String &p_key, Variant p_default) const {
if (!values.has(p_section) || !values[p_section].has(p_key)) {
- if (p_default.get_type() == Variant::NIL) {
- ERR_EXPLAIN("Couldn't find the given section/key and no default was given");
- ERR_FAIL_V(p_default);
- }
+ ERR_FAIL_COND_V_MSG(p_default.get_type() == Variant::NIL, p_default, "Couldn't find the given section/key and no default was given.");
return p_default;
}
return values[p_section][p_key];
@@ -204,7 +201,7 @@ Error ConfigFile::load(const String &p_path) {
FileAccess *f = FileAccess::open(p_path, FileAccess::READ, &err);
if (!f)
- return ERR_CANT_OPEN;
+ return err;
return _internal_load(p_path, f);
}
@@ -271,7 +268,7 @@ Error ConfigFile::_internal_load(const String &p_path, FileAccess *f) {
memdelete(f);
return OK;
} else if (err != OK) {
- ERR_PRINTS("ConfgFile::load - " + p_path + ":" + itos(lines) + " error: " + error_text);
+ ERR_PRINTS("ConfgFile::load - " + p_path + ":" + itos(lines) + " error: " + error_text + ".");
memdelete(f);
return err;
}
diff --git a/core/io/file_access_buffered.cpp b/core/io/file_access_buffered.cpp
index 15523a49a9..f72ad61da6 100644
--- a/core/io/file_access_buffered.cpp
+++ b/core/io/file_access_buffered.cpp
@@ -87,10 +87,8 @@ bool FileAccessBuffered::eof_reached() const {
}
uint8_t FileAccessBuffered::get_8() const {
- if (!file.open) {
- ERR_EXPLAIN("Can't get data, when file is not opened.");
- ERR_FAIL_V(0);
- }
+
+ ERR_FAIL_COND_V_MSG(!file.open, 0, "Can't get data, when file is not opened.");
uint8_t byte = 0;
if (cache_data_left() >= 1) {
@@ -104,10 +102,8 @@ uint8_t FileAccessBuffered::get_8() const {
}
int FileAccessBuffered::get_buffer(uint8_t *p_dest, int p_length) const {
- if (!file.open) {
- ERR_EXPLAIN("Can't get buffer, when file is not opened.");
- ERR_FAIL_V(-1);
- }
+
+ ERR_FAIL_COND_V_MSG(!file.open, -1, "Can't get buffer, when file is not opened.");
if (p_length > cache_size) {
diff --git a/core/io/file_access_buffered_fa.h b/core/io/file_access_buffered_fa.h
index 6e806e7b3f..c8cee04208 100644
--- a/core/io/file_access_buffered_fa.h
+++ b/core/io/file_access_buffered_fa.h
@@ -40,10 +40,7 @@ class FileAccessBufferedFA : public FileAccessBuffered {
int read_data_block(int p_offset, int p_size, uint8_t *p_dest = 0) const {
- if (!f.is_open()) {
- ERR_EXPLAIN("Can't read data block, when file is not opened.");
- ERR_FAIL_V(-1);
- }
+ ERR_FAIL_COND_V_MSG(!f.is_open(), -1, "Can't read data block when file is not opened.");
((T *)&f)->seek(p_offset);
diff --git a/core/io/file_access_encrypted.cpp b/core/io/file_access_encrypted.cpp
index ccee6aeb15..77decc107d 100644
--- a/core/io/file_access_encrypted.cpp
+++ b/core/io/file_access_encrypted.cpp
@@ -30,7 +30,7 @@
#include "file_access_encrypted.h"
-#include "core/math/crypto_core.h"
+#include "core/crypto/crypto_core.h"
#include "core/os/copymem.h"
#include "core/print_string.h"
#include "core/variant.h"
@@ -94,8 +94,7 @@ Error FileAccessEncrypted::open_and_parse(FileAccess *p_base, const Vector<uint8
unsigned char hash[16];
ERR_FAIL_COND_V(CryptoCore::md5(data.ptr(), data.size(), hash) != OK, ERR_BUG);
- ERR_EXPLAIN("The MD5 sum of the decrypted file does not match the expected value. It could be that the file is corrupt, or that the provided decryption key is invalid.");
- ERR_FAIL_COND_V(String::md5(hash) != String::md5(md5d), ERR_FILE_CORRUPT);
+ ERR_FAIL_COND_V_MSG(String::md5(hash) != String::md5(md5d), ERR_FILE_CORRUPT, "The MD5 sum of the decrypted file does not match the expected value. It could be that the file is corrupt, or that the provided decryption key is invalid.");
file = p_base;
}
@@ -298,7 +297,7 @@ uint32_t FileAccessEncrypted::_get_unix_permissions(const String &p_file) {
}
Error FileAccessEncrypted::_set_unix_permissions(const String &p_file, uint32_t p_permissions) {
- ERR_PRINT("Setting UNIX permissions on encrypted files is not implemented yet");
+ ERR_PRINT("Setting UNIX permissions on encrypted files is not implemented yet.");
return ERR_UNAVAILABLE;
}
diff --git a/core/io/file_access_pack.cpp b/core/io/file_access_pack.cpp
index ca66b34e17..d49d36c2b9 100644
--- a/core/io/file_access_pack.cpp
+++ b/core/io/file_access_pack.cpp
@@ -90,7 +90,7 @@ void PackedData::add_path(const String &pkg_path, const String &path, uint64_t o
}
}
String filename = path.get_file();
- // Don't add as a file if the path points to a directoryy
+ // Don't add as a file if the path points to a directory
if (!filename.empty()) {
cd->files.insert(filename);
}
@@ -171,10 +171,8 @@ bool PackedSourcePCK::try_open_pack(const String &p_path) {
uint32_t ver_minor = f->get_32();
f->get_32(); // ver_rev
- ERR_EXPLAIN("Pack version unsupported: " + itos(version));
- ERR_FAIL_COND_V(version != PACK_VERSION, false);
- ERR_EXPLAIN("Pack created with a newer version of the engine: " + itos(ver_major) + "." + itos(ver_minor));
- ERR_FAIL_COND_V(ver_major > VERSION_MAJOR || (ver_major == VERSION_MAJOR && ver_minor > VERSION_MINOR), false);
+ ERR_FAIL_COND_V_MSG(version != PACK_VERSION, false, "Pack version unsupported: " + itos(version) + ".");
+ ERR_FAIL_COND_V_MSG(ver_major > VERSION_MAJOR || (ver_major == VERSION_MAJOR && ver_minor > VERSION_MINOR), false, "Pack created with a newer version of the engine: " + itos(ver_major) + "." + itos(ver_minor) + ".");
for (int i = 0; i < 16; i++) {
//reserved
@@ -322,10 +320,9 @@ bool FileAccessPack::file_exists(const String &p_name) {
FileAccessPack::FileAccessPack(const String &p_path, const PackedData::PackedFile &p_file) :
pf(p_file),
f(FileAccess::open(pf.pack, FileAccess::READ)) {
- if (!f) {
- ERR_EXPLAIN("Can't open pack-referenced file: " + String(pf.pack));
- ERR_FAIL_COND(!f);
- }
+
+ ERR_FAIL_COND_MSG(!f, "Can't open pack-referenced file: " + String(pf.pack) + ".");
+
f->seek(pf.offset);
pos = 0;
eof = false;
@@ -463,11 +460,15 @@ String DirAccessPack::get_current_dir() {
bool DirAccessPack::file_exists(String p_file) {
+ p_file = fix_path(p_file);
+
return current->files.has(p_file);
}
bool DirAccessPack::dir_exists(String p_dir) {
+ p_dir = fix_path(p_dir);
+
return current->subdirs.has(p_dir);
}
diff --git a/core/io/image_loader.h b/core/io/image_loader.h
index f1fccc5230..af6b0551a3 100644
--- a/core/io/image_loader.h
+++ b/core/io/image_loader.h
@@ -37,10 +37,6 @@
#include "core/os/file_access.h"
#include "core/ustring.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class ImageLoader;
class ImageFormatLoader {
diff --git a/core/io/ip_address.cpp b/core/io/ip_address.cpp
index 9305afac5f..df4be9b9fd 100644
--- a/core/io/ip_address.cpp
+++ b/core/io/ip_address.cpp
@@ -81,8 +81,7 @@ static void _parse_hex(const String &p_string, int p_start, uint8_t *p_dst) {
} else if (c == ':') {
break;
} else {
- ERR_EXPLAIN("Invalid character in ipv6 address: " + p_string);
- ERR_FAIL();
+ ERR_FAIL_MSG("Invalid character in IPv6 address: " + p_string + ".");
};
ret = ret << 4;
ret += n;
@@ -126,9 +125,7 @@ void IP_Address::_parse_ipv6(const String &p_string) {
++parts_count;
};
} else {
-
- ERR_EXPLAIN("Invalid character in IPv6 address: " + p_string);
- ERR_FAIL();
+ ERR_FAIL_MSG("Invalid character in IPv6 address: " + p_string + ".");
};
};
@@ -166,10 +163,7 @@ void IP_Address::_parse_ipv4(const String &p_string, int p_start, uint8_t *p_ret
};
int slices = ip.get_slice_count(".");
- if (slices != 4) {
- ERR_EXPLAIN("Invalid IP Address String: " + ip);
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(slices != 4, "Invalid IP address string: " + ip + ".");
for (int i = 0; i < 4; i++) {
p_ret[i] = ip.get_slicec('.', i).to_int();
}
@@ -229,7 +223,7 @@ IP_Address::IP_Address(const String &p_string) {
valid = true;
} else {
- ERR_PRINT("Invalid IP address");
+ ERR_PRINT("Invalid IP address.");
}
}
diff --git a/core/io/marshalls.cpp b/core/io/marshalls.cpp
index dc5581ea01..b386feb14c 100644
--- a/core/io/marshalls.cpp
+++ b/core/io/marshalls.cpp
@@ -377,11 +377,6 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int
}
} break;
- /*case Variant::RESOURCE: {
-
- ERR_EXPLAIN("Can't marshallize resources");
- ERR_FAIL_V(ERR_INVALID_DATA); //no, i'm sorry, no go
- } break;*/
case Variant::_RID: {
r_variant = RID();
@@ -1066,11 +1061,6 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo
r_len += 4 * 4;
} break;
- /*case Variant::RESOURCE: {
-
- ERR_EXPLAIN("Can't marshallize resources");
- ERR_FAIL_V(ERR_INVALID_DATA); //no, i'm sorry, no go
- } break;*/
case Variant::_RID: {
} break;
diff --git a/core/io/multiplayer_api.cpp b/core/io/multiplayer_api.cpp
index 33dc4dbde4..d20133642b 100644
--- a/core/io/multiplayer_api.cpp
+++ b/core/io/multiplayer_api.cpp
@@ -146,8 +146,7 @@ void MultiplayerAPI::set_network_peer(const Ref<NetworkedMultiplayerPeer> &p_pee
network_peer = p_peer;
- ERR_EXPLAIN("Supplied NetworkedNetworkPeer must be connecting or connected.");
- ERR_FAIL_COND(p_peer.is_valid() && p_peer->get_connection_status() == NetworkedMultiplayerPeer::CONNECTION_DISCONNECTED);
+ ERR_FAIL_COND_MSG(p_peer.is_valid() && p_peer->get_connection_status() == NetworkedMultiplayerPeer::CONNECTION_DISCONNECTED, "Supplied NetworkedNetworkPeer must be connecting or connected.");
if (network_peer.is_valid()) {
network_peer->connect("peer_connected", this, "_add_peer");
@@ -164,10 +163,8 @@ Ref<NetworkedMultiplayerPeer> MultiplayerAPI::get_network_peer() const {
void MultiplayerAPI::_process_packet(int p_from, const uint8_t *p_packet, int p_packet_len) {
- ERR_EXPLAIN("Multiplayer root node was not initialized. If you are using custom multiplayer, remember to set the root node via MultiplayerAPI.set_root_node before using it");
- ERR_FAIL_COND(root_node == NULL);
- ERR_EXPLAIN("Invalid packet received. Size too small.");
- ERR_FAIL_COND(p_packet_len < 1);
+ ERR_FAIL_COND_MSG(root_node == NULL, "Multiplayer root node was not initialized. If you are using custom multiplayer, remember to set the root node via MultiplayerAPI.set_root_node before using it.");
+ ERR_FAIL_COND_MSG(p_packet_len < 1, "Invalid packet received. Size too small.");
uint8_t packet_type = p_packet[0];
@@ -186,13 +183,11 @@ void MultiplayerAPI::_process_packet(int p_from, const uint8_t *p_packet, int p_
case NETWORK_COMMAND_REMOTE_CALL:
case NETWORK_COMMAND_REMOTE_SET: {
- ERR_EXPLAIN("Invalid packet received. Size too small.");
- ERR_FAIL_COND(p_packet_len < 6);
+ ERR_FAIL_COND_MSG(p_packet_len < 6, "Invalid packet received. Size too small.");
Node *node = _process_get_node(p_from, p_packet, p_packet_len);
- ERR_EXPLAIN("Invalid packet received. Requested node was not found.");
- ERR_FAIL_COND(node == NULL);
+ ERR_FAIL_COND_MSG(node == NULL, "Invalid packet received. Requested node was not found.");
// Detect cstring end.
int len_end = 5;
@@ -202,8 +197,7 @@ void MultiplayerAPI::_process_packet(int p_from, const uint8_t *p_packet, int p_
}
}
- ERR_EXPLAIN("Invalid packet received. Size too small.");
- ERR_FAIL_COND(len_end >= p_packet_len);
+ ERR_FAIL_COND_MSG(len_end >= p_packet_len, "Invalid packet received. Size too small.");
StringName name = String::utf8((const char *)&p_packet[5]);
@@ -235,8 +229,7 @@ Node *MultiplayerAPI::_process_get_node(int p_from, const uint8_t *p_packet, int
int ofs = target & 0x7FFFFFFF;
- ERR_EXPLAIN("Invalid packet received. Size smaller than declared.");
- ERR_FAIL_COND_V(ofs >= p_packet_len, NULL);
+ ERR_FAIL_COND_V_MSG(ofs >= p_packet_len, NULL, "Invalid packet received. Size smaller than declared.");
String paths;
paths.parse_utf8((const char *)&p_packet[ofs], p_packet_len - ofs);
@@ -246,33 +239,30 @@ Node *MultiplayerAPI::_process_get_node(int p_from, const uint8_t *p_packet, int
node = root_node->get_node(np);
if (!node)
- ERR_PRINTS("Failed to get path from RPC: " + String(np));
+ ERR_PRINTS("Failed to get path from RPC: " + String(np) + ".");
} else {
// Use cached path.
int id = target;
Map<int, PathGetCache>::Element *E = path_get_cache.find(p_from);
- ERR_EXPLAIN("Invalid packet received. Requests invalid peer cache.");
- ERR_FAIL_COND_V(!E, NULL);
+ ERR_FAIL_COND_V_MSG(!E, NULL, "Invalid packet received. Requests invalid peer cache.");
Map<int, PathGetCache::NodeInfo>::Element *F = E->get().nodes.find(id);
- ERR_EXPLAIN("Invalid packet received. Unabled to find requested cached node.");
- ERR_FAIL_COND_V(!F, NULL);
+ ERR_FAIL_COND_V_MSG(!F, NULL, "Invalid packet received. Unabled to find requested cached node.");
PathGetCache::NodeInfo *ni = &F->get();
// Do proper caching later.
node = root_node->get_node(ni->path);
if (!node)
- ERR_PRINTS("Failed to get cached path from RPC: " + String(ni->path));
+ ERR_PRINTS("Failed to get cached path from RPC: " + String(ni->path) + ".");
}
return node;
}
void MultiplayerAPI::_process_rpc(Node *p_node, const StringName &p_name, int p_from, const uint8_t *p_packet, int p_packet_len, int p_offset) {
- ERR_EXPLAIN("Invalid packet received. Size too small.");
- ERR_FAIL_COND(p_offset >= p_packet_len);
+ ERR_FAIL_COND_MSG(p_offset >= p_packet_len, "Invalid packet received. Size too small.");
// Check that remote can call the RPC on this node.
RPCMode rpc_mode = RPC_MODE_DISABLED;
@@ -284,8 +274,7 @@ void MultiplayerAPI::_process_rpc(Node *p_node, const StringName &p_name, int p_
}
bool can_call = _can_call_mode(p_node, rpc_mode, p_from);
- ERR_EXPLAIN("RPC '" + String(p_name) + "' is not allowed on node " + p_node->get_path() + " from: " + itos(p_from) + ". Mode is " + itos((int)rpc_mode) + ", master is " + itos(p_node->get_network_master()) + ".");
- ERR_FAIL_COND(!can_call);
+ ERR_FAIL_COND_MSG(!can_call, "RPC '" + String(p_name) + "' is not allowed on node " + p_node->get_path() + " from: " + itos(p_from) + ". Mode is " + itos((int)rpc_mode) + ", master is " + itos(p_node->get_network_master()) + ".");
int argc = p_packet[p_offset];
Vector<Variant> args;
@@ -297,13 +286,11 @@ void MultiplayerAPI::_process_rpc(Node *p_node, const StringName &p_name, int p_
for (int i = 0; i < argc; i++) {
- ERR_EXPLAIN("Invalid packet received. Size too small.");
- ERR_FAIL_COND(p_offset >= p_packet_len);
+ ERR_FAIL_COND_MSG(p_offset >= p_packet_len, "Invalid packet received. Size too small.");
int vlen;
Error err = decode_variant(args.write[i], &p_packet[p_offset], p_packet_len - p_offset, &vlen, allow_object_decoding || network_peer->is_object_decoding_allowed());
- ERR_EXPLAIN("Invalid packet received. Unable to decode RPC argument.");
- ERR_FAIL_COND(err != OK);
+ ERR_FAIL_COND_MSG(err != OK, "Invalid packet received. Unable to decode RPC argument.");
argp.write[i] = &args[i];
p_offset += vlen;
@@ -321,8 +308,7 @@ void MultiplayerAPI::_process_rpc(Node *p_node, const StringName &p_name, int p_
void MultiplayerAPI::_process_rset(Node *p_node, const StringName &p_name, int p_from, const uint8_t *p_packet, int p_packet_len, int p_offset) {
- ERR_EXPLAIN("Invalid packet received. Size too small.");
- ERR_FAIL_COND(p_offset >= p_packet_len);
+ ERR_FAIL_COND_MSG(p_offset >= p_packet_len, "Invalid packet received. Size too small.");
// Check that remote can call the RSET on this node.
RPCMode rset_mode = RPC_MODE_DISABLED;
@@ -334,28 +320,25 @@ void MultiplayerAPI::_process_rset(Node *p_node, const StringName &p_name, int p
}
bool can_call = _can_call_mode(p_node, rset_mode, p_from);
- ERR_EXPLAIN("RSET '" + String(p_name) + "' is not allowed on node " + p_node->get_path() + " from: " + itos(p_from) + ". Mode is " + itos((int)rset_mode) + ", master is " + itos(p_node->get_network_master()) + ".");
- ERR_FAIL_COND(!can_call);
+ ERR_FAIL_COND_MSG(!can_call, "RSET '" + String(p_name) + "' is not allowed on node " + p_node->get_path() + " from: " + itos(p_from) + ". Mode is " + itos((int)rset_mode) + ", master is " + itos(p_node->get_network_master()) + ".");
Variant value;
Error err = decode_variant(value, &p_packet[p_offset], p_packet_len - p_offset, NULL, allow_object_decoding || network_peer->is_object_decoding_allowed());
- ERR_EXPLAIN("Invalid packet received. Unable to decode RSET value.");
- ERR_FAIL_COND(err != OK);
+ ERR_FAIL_COND_MSG(err != OK, "Invalid packet received. Unable to decode RSET value.");
bool valid;
p_node->set(p_name, value, &valid);
if (!valid) {
- String error = "Error setting remote property '" + String(p_name) + "', not found in object of type " + p_node->get_class();
+ String error = "Error setting remote property '" + String(p_name) + "', not found in object of type " + p_node->get_class() + ".";
ERR_PRINTS(error);
}
}
void MultiplayerAPI::_process_simplify_path(int p_from, const uint8_t *p_packet, int p_packet_len) {
- ERR_EXPLAIN("Invalid packet received. Size too small.");
- ERR_FAIL_COND(p_packet_len < 5);
+ ERR_FAIL_COND_MSG(p_packet_len < 5, "Invalid packet received. Size too small.");
int id = decode_uint32(&p_packet[1]);
String paths;
@@ -390,8 +373,7 @@ void MultiplayerAPI::_process_simplify_path(int p_from, const uint8_t *p_packet,
void MultiplayerAPI::_process_confirm_path(int p_from, const uint8_t *p_packet, int p_packet_len) {
- ERR_EXPLAIN("Invalid packet received. Size too small.");
- ERR_FAIL_COND(p_packet_len < 2);
+ ERR_FAIL_COND_MSG(p_packet_len < 2, "Invalid packet received. Size too small.");
String paths;
paths.parse_utf8((const char *)&p_packet[1], p_packet_len - 1);
@@ -399,12 +381,10 @@ void MultiplayerAPI::_process_confirm_path(int p_from, const uint8_t *p_packet,
NodePath path = paths;
PathSentCache *psc = path_send_cache.getptr(path);
- ERR_EXPLAIN("Invalid packet received. Tries to confirm a path which was not found in cache.");
- ERR_FAIL_COND(!psc);
+ ERR_FAIL_COND_MSG(!psc, "Invalid packet received. Tries to confirm a path which was not found in cache.");
Map<int, bool>::Element *E = psc->confirmed_peers.find(p_from);
- ERR_EXPLAIN("Invalid packet received. Source peer was not found in cache for the given path.");
- ERR_FAIL_COND(!E);
+ ERR_FAIL_COND_MSG(!E, "Invalid packet received. Source peer was not found in cache for the given path.");
E->get() = true;
}
@@ -460,39 +440,22 @@ bool MultiplayerAPI::_send_confirm_path(NodePath p_path, PathSentCache *psc, int
void MultiplayerAPI::_send_rpc(Node *p_from, int p_to, bool p_unreliable, bool p_set, const StringName &p_name, const Variant **p_arg, int p_argcount) {
- if (network_peer.is_null()) {
- ERR_EXPLAIN("Attempt to remote call/set when networking is not active in SceneTree.");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(network_peer.is_null(), "Attempt to remote call/set when networking is not active in SceneTree.");
- if (network_peer->get_connection_status() == NetworkedMultiplayerPeer::CONNECTION_CONNECTING) {
- ERR_EXPLAIN("Attempt to remote call/set when networking is not connected yet in SceneTree.");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(network_peer->get_connection_status() == NetworkedMultiplayerPeer::CONNECTION_CONNECTING, "Attempt to remote call/set when networking is not connected yet in SceneTree.");
- if (network_peer->get_connection_status() == NetworkedMultiplayerPeer::CONNECTION_DISCONNECTED) {
- ERR_EXPLAIN("Attempt to remote call/set when networking is disconnected.");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(network_peer->get_connection_status() == NetworkedMultiplayerPeer::CONNECTION_DISCONNECTED, "Attempt to remote call/set when networking is disconnected.");
- if (p_argcount > 255) {
- ERR_EXPLAIN("Too many arguments >255.");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(p_argcount > 255, "Too many arguments >255.");
if (p_to != 0 && !connected_peers.has(ABS(p_to))) {
- if (p_to == network_peer->get_unique_id()) {
- ERR_EXPLAIN("Attempt to remote call/set yourself! unique ID: " + itos(network_peer->get_unique_id()));
- } else {
- ERR_EXPLAIN("Attempt to remote call unexisting ID: " + itos(p_to));
- }
+ ERR_FAIL_COND_MSG(p_to == network_peer->get_unique_id(), "Attempt to remote call/set yourself! unique ID: " + itos(network_peer->get_unique_id()) + ".");
- ERR_FAIL();
+ ERR_FAIL_MSG("Attempt to remote call unexisting ID: " + itos(p_to) + ".");
}
NodePath from_path = (root_node->get_path()).rel_path_to(p_from->get_path());
- ERR_EXPLAIN("Unable to send RPC. Relative path is empty. THIS IS LIKELY A BUG IN THE ENGINE!");
- ERR_FAIL_COND(from_path.is_empty());
+ ERR_FAIL_COND_MSG(from_path.is_empty(), "Unable to send RPC. Relative path is empty. THIS IS LIKELY A BUG IN THE ENGINE!");
// See if the path is cached.
PathSentCache *psc = path_send_cache.getptr(from_path);
@@ -530,8 +493,7 @@ void MultiplayerAPI::_send_rpc(Node *p_from, int p_to, bool p_unreliable, bool p
if (p_set) {
// Set argument.
Error err = encode_variant(*p_arg[0], NULL, len, allow_object_decoding || network_peer->is_object_decoding_allowed());
- ERR_EXPLAIN("Unable to encode RSET value. THIS IS LIKELY A BUG IN THE ENGINE!");
- ERR_FAIL_COND(err != OK);
+ ERR_FAIL_COND_MSG(err != OK, "Unable to encode RSET value. THIS IS LIKELY A BUG IN THE ENGINE!");
MAKE_ROOM(ofs + len);
encode_variant(*p_arg[0], &(packet_cache.write[ofs]), len, allow_object_decoding || network_peer->is_object_decoding_allowed());
ofs += len;
@@ -543,8 +505,7 @@ void MultiplayerAPI::_send_rpc(Node *p_from, int p_to, bool p_unreliable, bool p
ofs += 1;
for (int i = 0; i < p_argcount; i++) {
Error err = encode_variant(*p_arg[i], NULL, len, allow_object_decoding || network_peer->is_object_decoding_allowed());
- ERR_EXPLAIN("Unable to encode RPC argument. THIS IS LIKELY A BUG IN THE ENGINE!");
- ERR_FAIL_COND(err != OK);
+ ERR_FAIL_COND_MSG(err != OK, "Unable to encode RPC argument. THIS IS LIKELY A BUG IN THE ENGINE!");
MAKE_ROOM(ofs + len);
encode_variant(*p_arg[i], &(packet_cache.write[ofs]), len, allow_object_decoding || network_peer->is_object_decoding_allowed());
ofs += len;
@@ -626,12 +587,9 @@ void MultiplayerAPI::_server_disconnected() {
void MultiplayerAPI::rpcp(Node *p_node, int p_peer_id, bool p_unreliable, const StringName &p_method, const Variant **p_arg, int p_argcount) {
- ERR_EXPLAIN("Trying to call an RPC while no network peer is active.");
- ERR_FAIL_COND(!network_peer.is_valid());
- ERR_EXPLAIN("Trying to call an RPC on a node which is not inside SceneTree.");
- ERR_FAIL_COND(!p_node->is_inside_tree());
- ERR_EXPLAIN("Trying to call an RPC via a network peer which is not connected.");
- ERR_FAIL_COND(network_peer->get_connection_status() != NetworkedMultiplayerPeer::CONNECTION_CONNECTED);
+ ERR_FAIL_COND_MSG(!network_peer.is_valid(), "Trying to call an RPC while no network peer is active.");
+ ERR_FAIL_COND_MSG(!p_node->is_inside_tree(), "Trying to call an RPC on a node which is not inside SceneTree.");
+ ERR_FAIL_COND_MSG(network_peer->get_connection_status() != NetworkedMultiplayerPeer::CONNECTION_CONNECTED, "Trying to call an RPC via a network peer which is not connected.");
int node_id = network_peer->get_unique_id();
bool skip_rpc = node_id == p_peer_id;
@@ -668,7 +626,7 @@ void MultiplayerAPI::rpcp(Node *p_node, int p_peer_id, bool p_unreliable, const
rpc_sender_id = temp_id;
if (ce.error != Variant::CallError::CALL_OK) {
String error = Variant::get_call_error_text(p_node, p_method, p_arg, p_argcount, ce);
- error = "rpc() aborted in local call: - " + error;
+ error = "rpc() aborted in local call: - " + error + ".";
ERR_PRINTS(error);
return;
}
@@ -683,24 +641,20 @@ void MultiplayerAPI::rpcp(Node *p_node, int p_peer_id, bool p_unreliable, const
rpc_sender_id = temp_id;
if (ce.error != Variant::CallError::CALL_OK) {
String error = Variant::get_call_error_text(p_node, p_method, p_arg, p_argcount, ce);
- error = "rpc() aborted in script local call: - " + error;
+ error = "rpc() aborted in script local call: - " + error + ".";
ERR_PRINTS(error);
return;
}
}
- ERR_EXPLAIN("RPC '" + p_method + "' on yourself is not allowed by selected mode");
- ERR_FAIL_COND(skip_rpc && !(call_local_native || call_local_script));
+ ERR_FAIL_COND_MSG(skip_rpc && !(call_local_native || call_local_script), "RPC '" + p_method + "' on yourself is not allowed by selected mode.");
}
void MultiplayerAPI::rsetp(Node *p_node, int p_peer_id, bool p_unreliable, const StringName &p_property, const Variant &p_value) {
- ERR_EXPLAIN("Trying to RSET while no network peer is active.");
- ERR_FAIL_COND(!network_peer.is_valid());
- ERR_EXPLAIN("Trying to RSET on a node which is not inside SceneTree.");
- ERR_FAIL_COND(!p_node->is_inside_tree());
- ERR_EXPLAIN("Trying to send an RSET via a network peer which is not connected.");
- ERR_FAIL_COND(network_peer->get_connection_status() != NetworkedMultiplayerPeer::CONNECTION_CONNECTED);
+ ERR_FAIL_COND_MSG(!network_peer.is_valid(), "Trying to RSET while no network peer is active.");
+ ERR_FAIL_COND_MSG(!p_node->is_inside_tree(), "Trying to RSET on a node which is not inside SceneTree.");
+ ERR_FAIL_COND_MSG(network_peer->get_connection_status() != NetworkedMultiplayerPeer::CONNECTION_CONNECTED, "Trying to send an RSET via a network peer which is not connected.");
int node_id = network_peer->get_unique_id();
bool is_master = p_node->is_network_master();
@@ -724,7 +678,7 @@ void MultiplayerAPI::rsetp(Node *p_node, int p_peer_id, bool p_unreliable, const
rpc_sender_id = temp_id;
if (!valid) {
- String error = "rset() aborted in local set, property not found: - " + String(p_property);
+ String error = "rset() aborted in local set, property not found: - " + String(p_property) + ".";
ERR_PRINTS(error);
return;
}
@@ -742,7 +696,7 @@ void MultiplayerAPI::rsetp(Node *p_node, int p_peer_id, bool p_unreliable, const
rpc_sender_id = temp_id;
if (!valid) {
- String error = "rset() aborted in local script set, property not found: - " + String(p_property);
+ String error = "rset() aborted in local script set, property not found: - " + String(p_property) + ".";
ERR_PRINTS(error);
return;
}
@@ -751,8 +705,7 @@ void MultiplayerAPI::rsetp(Node *p_node, int p_peer_id, bool p_unreliable, const
}
if (skip_rset) {
- ERR_EXPLAIN("RSET for '" + p_property + "' on yourself is not allowed by selected mode");
- ERR_FAIL_COND(!set_local);
+ ERR_FAIL_COND_MSG(!set_local, "RSET for '" + p_property + "' on yourself is not allowed by selected mode.");
return;
}
@@ -763,12 +716,9 @@ void MultiplayerAPI::rsetp(Node *p_node, int p_peer_id, bool p_unreliable, const
Error MultiplayerAPI::send_bytes(PoolVector<uint8_t> p_data, int p_to, NetworkedMultiplayerPeer::TransferMode p_mode) {
- ERR_EXPLAIN("Trying to send an empty raw packet.");
- ERR_FAIL_COND_V(p_data.size() < 1, ERR_INVALID_DATA);
- ERR_EXPLAIN("Trying to send a raw packet while no network peer is active.");
- ERR_FAIL_COND_V(!network_peer.is_valid(), ERR_UNCONFIGURED);
- ERR_EXPLAIN("Trying to send a raw packet via a network peer which is not connected.");
- ERR_FAIL_COND_V(network_peer->get_connection_status() != NetworkedMultiplayerPeer::CONNECTION_CONNECTED, ERR_UNCONFIGURED);
+ ERR_FAIL_COND_V_MSG(p_data.size() < 1, ERR_INVALID_DATA, "Trying to send an empty raw packet.");
+ ERR_FAIL_COND_V_MSG(!network_peer.is_valid(), ERR_UNCONFIGURED, "Trying to send a raw packet while no network peer is active.");
+ ERR_FAIL_COND_V_MSG(network_peer->get_connection_status() != NetworkedMultiplayerPeer::CONNECTION_CONNECTED, ERR_UNCONFIGURED, "Trying to send a raw packet via a network peer which is not connected.");
MAKE_ROOM(p_data.size() + 1);
PoolVector<uint8_t>::Read r = p_data.read();
@@ -783,8 +733,7 @@ Error MultiplayerAPI::send_bytes(PoolVector<uint8_t> p_data, int p_to, Networked
void MultiplayerAPI::_process_raw(int p_from, const uint8_t *p_packet, int p_packet_len) {
- ERR_EXPLAIN("Invalid packet received. Size too small.");
- ERR_FAIL_COND(p_packet_len < 2);
+ ERR_FAIL_COND_MSG(p_packet_len < 2, "Invalid packet received. Size too small.");
PoolVector<uint8_t> out;
int len = p_packet_len - 1;
@@ -798,37 +747,32 @@ void MultiplayerAPI::_process_raw(int p_from, const uint8_t *p_packet, int p_pac
int MultiplayerAPI::get_network_unique_id() const {
- ERR_EXPLAIN("No network peer is assigned. Unable to get unique network ID.");
- ERR_FAIL_COND_V(!network_peer.is_valid(), 0);
+ ERR_FAIL_COND_V_MSG(!network_peer.is_valid(), 0, "No network peer is assigned. Unable to get unique network ID.");
return network_peer->get_unique_id();
}
bool MultiplayerAPI::is_network_server() const {
// XXX Maybe fail silently? Maybe should actually return true to make development of both local and online multiplayer easier?
- ERR_EXPLAIN("No network peer is assigned. I can't be a server.");
- ERR_FAIL_COND_V(!network_peer.is_valid(), false);
+ ERR_FAIL_COND_V_MSG(!network_peer.is_valid(), false, "No network peer is assigned. I can't be a server.");
return network_peer->is_server();
}
void MultiplayerAPI::set_refuse_new_network_connections(bool p_refuse) {
- ERR_EXPLAIN("No network peer is assigned. Unable to set 'refuse_new_connections'.");
- ERR_FAIL_COND(!network_peer.is_valid());
+ ERR_FAIL_COND_MSG(!network_peer.is_valid(), "No network peer is assigned. Unable to set 'refuse_new_connections'.");
network_peer->set_refuse_new_connections(p_refuse);
}
bool MultiplayerAPI::is_refusing_new_network_connections() const {
- ERR_EXPLAIN("No network peer is assigned. Unable to get 'refuse_new_connections'.");
- ERR_FAIL_COND_V(!network_peer.is_valid(), false);
+ ERR_FAIL_COND_V_MSG(!network_peer.is_valid(), false, "No network peer is assigned. Unable to get 'refuse_new_connections'.");
return network_peer->is_refusing_new_connections();
}
Vector<int> MultiplayerAPI::get_network_connected_peers() const {
- ERR_EXPLAIN("No network peer is assigned. Assume no peers are connected.");
- ERR_FAIL_COND_V(!network_peer.is_valid(), Vector<int>());
+ ERR_FAIL_COND_V_MSG(!network_peer.is_valid(), Vector<int>(), "No network peer is assigned. Assume no peers are connected.");
Vector<int> ret;
for (Set<int>::Element *E = connected_peers.front(); E; E = E->next()) {
diff --git a/core/io/packet_peer.cpp b/core/io/packet_peer.cpp
index 1e4ea715b3..1c792c43d1 100644
--- a/core/io/packet_peer.cpp
+++ b/core/io/packet_peer.cpp
@@ -280,8 +280,7 @@ Ref<StreamPeer> PacketPeerStream::get_stream_peer() const {
void PacketPeerStream::set_input_buffer_max_size(int p_max_size) {
//warning may lose packets
- ERR_EXPLAIN("Buffer in use, resizing would cause loss of data");
- ERR_FAIL_COND(ring_buffer.data_left());
+ ERR_FAIL_COND_MSG(ring_buffer.data_left(), "Buffer in use, resizing would cause loss of data.");
ring_buffer.resize(nearest_shift(p_max_size + 4));
input_buffer.resize(next_power_of_2(p_max_size + 4));
}
diff --git a/core/io/pck_packer.cpp b/core/io/pck_packer.cpp
index c16d89d695..1c89bc6268 100644
--- a/core/io/pck_packer.cpp
+++ b/core/io/pck_packer.cpp
@@ -64,10 +64,7 @@ Error PCKPacker::pck_start(const String &p_file, int p_alignment) {
file = FileAccess::open(p_file, FileAccess::WRITE);
- if (!file) {
- ERR_EXPLAIN("Can't open file to write: " + String(p_file));
- ERR_FAIL_V(ERR_CANT_CREATE);
- }
+ ERR_FAIL_COND_V_MSG(!file, ERR_CANT_CREATE, "Can't open file to write: " + String(p_file) + ".");
alignment = p_alignment;
diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp
index 146480e5a2..0ad2479b05 100644
--- a/core/io/resource_format_binary.cpp
+++ b/core/io/resource_format_binary.cpp
@@ -490,8 +490,7 @@ Error ResourceInteractiveLoaderBinary::parse_variant(Variant &r_v) {
#endif
} else {
- ERR_EXPLAIN("Vector2 size is NOT 8!");
- ERR_FAIL_V(ERR_UNAVAILABLE);
+ ERR_FAIL_V_MSG(ERR_UNAVAILABLE, "Vector2 size is NOT 8!");
}
w.release();
r_v = array;
@@ -518,8 +517,7 @@ Error ResourceInteractiveLoaderBinary::parse_variant(Variant &r_v) {
#endif
} else {
- ERR_EXPLAIN("Vector3 size is NOT 12!");
- ERR_FAIL_V(ERR_UNAVAILABLE);
+ ERR_FAIL_V_MSG(ERR_UNAVAILABLE, "Vector3 size is NOT 12!");
}
w.release();
r_v = array;
@@ -546,8 +544,7 @@ Error ResourceInteractiveLoaderBinary::parse_variant(Variant &r_v) {
#endif
} else {
- ERR_EXPLAIN("Color size is NOT 16!");
- ERR_FAIL_V(ERR_UNAVAILABLE);
+ ERR_FAIL_V_MSG(ERR_UNAVAILABLE, "Color size is NOT 16!");
}
w.release();
r_v = array;
@@ -571,7 +568,7 @@ Error ResourceInteractiveLoaderBinary::parse_variant(Variant &r_v) {
const uint32_t current_version = 0;
if (format_version > current_version) {
- ERR_PRINT("Format version for encoded binary image is too new");
+ ERR_PRINT("Format version for encoded binary image is too new.");
return ERR_PARSE_ERROR;
}
@@ -655,8 +652,7 @@ Error ResourceInteractiveLoaderBinary::poll() {
} else {
error = ERR_FILE_MISSING_DEPENDENCIES;
- ERR_EXPLAIN("Can't load dependency: " + path);
- ERR_FAIL_V(error);
+ ERR_FAIL_V_MSG(error, "Can't load dependency: " + path + ".");
}
} else {
@@ -711,16 +707,15 @@ Error ResourceInteractiveLoaderBinary::poll() {
Object *obj = ClassDB::instance(t);
if (!obj) {
error = ERR_FILE_CORRUPT;
- ERR_EXPLAIN(local_path + ":Resource of unrecognized type in file: " + t);
- ERR_FAIL_V(ERR_FILE_CORRUPT);
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, local_path + ":Resource of unrecognized type in file: " + t + ".");
}
Resource *r = Object::cast_to<Resource>(obj);
if (!r) {
+ String obj_class = obj->get_class();
error = ERR_FILE_CORRUPT;
- ERR_EXPLAIN(local_path + ":Resource type in resource field not a resource, type is: " + obj->get_class());
memdelete(obj); //bye
- ERR_FAIL_V(ERR_FILE_CORRUPT);
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, local_path + ":Resource type in resource field not a resource, type is: " + obj_class + ".");
}
RES res = RES(r);
@@ -850,8 +845,7 @@ void ResourceInteractiveLoaderBinary::open(FileAccess *p_f) {
//not normal
error = ERR_FILE_UNRECOGNIZED;
- ERR_EXPLAIN("Unrecognized binary resource file: " + local_path);
- ERR_FAIL();
+ ERR_FAIL_MSG("Unrecognized binary resource file: " + local_path + ".");
}
bool big_endian = f->get_32();
@@ -877,8 +871,7 @@ void ResourceInteractiveLoaderBinary::open(FileAccess *p_f) {
if (ver_format > FORMAT_VERSION || ver_major > VERSION_MAJOR) {
f->close();
- ERR_EXPLAIN("File Format '" + itos(FORMAT_VERSION) + "." + itos(ver_major) + "." + itos(ver_minor) + "' is too new! Please upgrade to a new engine version: " + local_path);
- ERR_FAIL();
+ ERR_FAIL_MSG("File format '" + itos(FORMAT_VERSION) + "." + itos(ver_major) + "." + itos(ver_minor) + "' is too new! Please upgrade to a new engine version: " + local_path + ".");
}
type = get_unicode_string();
@@ -926,8 +919,7 @@ void ResourceInteractiveLoaderBinary::open(FileAccess *p_f) {
if (f->eof_reached()) {
error = ERR_FILE_CORRUPT;
- ERR_EXPLAIN("Premature End Of File: " + local_path);
- ERR_FAIL();
+ ERR_FAIL_MSG("Premature end of file (EOF): " + local_path + ".");
}
}
@@ -1084,8 +1076,7 @@ Error ResourceFormatLoaderBinary::rename_dependencies(const String &p_path, cons
//error=ERR_FILE_UNRECOGNIZED;
memdelete(f);
- ERR_EXPLAIN("Unrecognized binary resource file: " + local_path);
- ERR_FAIL_V(ERR_FILE_UNRECOGNIZED);
+ ERR_FAIL_V_MSG(ERR_FILE_UNRECOGNIZED, "Unrecognized binary resource file: " + local_path + ".");
} else {
fw = FileAccess::open(p_path + ".depren", FileAccess::WRITE);
if (!fw) {
@@ -1122,7 +1113,7 @@ Error ResourceFormatLoaderBinary::rename_dependencies(const String &p_path, cons
memdelete(da);
//use the old approach
- WARN_PRINT(("This file is old, so it can't refactor dependencies, opening and resaving: " + p_path).utf8().get_data());
+ WARN_PRINTS("This file is old, so it can't refactor dependencies, opening and resaving: " + p_path + ".");
Error err;
f = FileAccess::open(p_path, FileAccess::READ, &err);
@@ -1153,8 +1144,7 @@ Error ResourceFormatLoaderBinary::rename_dependencies(const String &p_path, cons
memdelete(f);
memdelete(fw);
- ERR_EXPLAIN("File Format '" + itos(FORMAT_VERSION) + "." + itos(ver_major) + "." + itos(ver_minor) + "' is too new! Please upgrade to a new engine version: " + local_path);
- ERR_FAIL_V(ERR_FILE_UNRECOGNIZED);
+ ERR_FAIL_V_MSG(ERR_FILE_UNRECOGNIZED, "File format '" + itos(FORMAT_VERSION) + "." + itos(ver_major) + "." + itos(ver_minor) + "' is too new! Please upgrade to a new engine version: " + local_path + ".");
}
// Since we're not actually converting the file contents, leave the version
@@ -1477,7 +1467,7 @@ void ResourceFormatSaverBinaryInstance::write_variant(FileAccess *f, const Varia
case Variant::_RID: {
f->store_32(VARIANT_RID);
- WARN_PRINT("Can't save RIDs");
+ WARN_PRINT("Can't save RIDs.");
RID val = p_property;
f->store_32(val.get_id());
} break;
@@ -1497,8 +1487,7 @@ void ResourceFormatSaverBinaryInstance::write_variant(FileAccess *f, const Varia
if (!resource_set.has(res)) {
f->store_32(OBJECT_EMPTY);
- ERR_EXPLAIN("Resource was not pre cached for the resource section, most likely due to circular refedence.");
- ERR_FAIL();
+ ERR_FAIL_MSG("Resource was not pre cached for the resource section, most likely due to circular reference.");
}
f->store_32(OBJECT_INTERNAL_RESOURCE);
@@ -1629,8 +1618,7 @@ void ResourceFormatSaverBinaryInstance::write_variant(FileAccess *f, const Varia
} break;
default: {
- ERR_EXPLAIN("Invalid variant");
- ERR_FAIL();
+ ERR_FAIL_MSG("Invalid variant.");
}
}
}
@@ -1798,6 +1786,7 @@ Error ResourceFormatSaverBinaryInstance::save(const String &p_path, const RES &p
if (f->get_error() != OK && f->get_error() != ERR_FILE_EOF) {
f->close();
+ memdelete(f);
return ERR_CANT_CREATE;
}
@@ -1950,10 +1939,12 @@ Error ResourceFormatSaverBinaryInstance::save(const String &p_path, const RES &p
if (f->get_error() != OK && f->get_error() != ERR_FILE_EOF) {
f->close();
+ memdelete(f);
return ERR_CANT_CREATE;
}
f->close();
+ memdelete(f);
return OK;
}
diff --git a/core/io/resource_loader.cpp b/core/io/resource_loader.cpp
index 35af58ad07..9e954890bc 100644
--- a/core/io/resource_loader.cpp
+++ b/core/io/resource_loader.cpp
@@ -275,12 +275,9 @@ RES ResourceLoader::_load(const String &p_path, const String &p_original_path, c
return res;
}
- if (found) {
- ERR_EXPLAIN("Failed loading resource: " + p_path);
- } else {
- ERR_EXPLAIN("No loader found for resource: " + p_path);
- }
- ERR_FAIL_V(RES());
+ ERR_FAIL_COND_V_MSG(found, RES(), "Failed loading resource: " + p_path + ".");
+
+ ERR_FAIL_V_MSG(RES(), "No loader found for resource: " + p_path + ".");
}
bool ResourceLoader::_add_to_loading_map(const String &p_path) {
@@ -355,10 +352,7 @@ RES ResourceLoader::load(const String &p_path, const String &p_type_hint, bool p
{
bool success = _add_to_loading_map(local_path);
- if (!success) {
- ERR_EXPLAIN("Resource: '" + local_path + "' is already being loaded. Cyclic reference?");
- ERR_FAIL_V(RES());
- }
+ ERR_FAIL_COND_V_MSG(!success, RES(), "Resource: '" + local_path + "' is already being loaded. Cyclic reference?");
}
//lock first if possible
@@ -395,8 +389,7 @@ RES ResourceLoader::load(const String &p_path, const String &p_type_hint, bool p
if (!p_no_cache) {
_remove_from_loading_map(local_path);
}
- ERR_EXPLAIN("Remapping '" + local_path + "'failed.");
- ERR_FAIL_V(RES());
+ ERR_FAIL_V_MSG(RES(), "Remapping '" + local_path + "' failed.");
}
print_verbose("Loading resource: " + path);
@@ -479,10 +472,7 @@ Ref<ResourceInteractiveLoader> ResourceLoader::load_interactive(const String &p_
if (!p_no_cache) {
bool success = _add_to_loading_map(local_path);
- if (!success) {
- ERR_EXPLAIN("Resource: '" + local_path + "' is already being loaded. Cyclic reference?");
- ERR_FAIL_V(RES());
- }
+ ERR_FAIL_COND_V_MSG(!success, RES(), "Resource: '" + local_path + "' is already being loaded. Cyclic reference?");
if (ResourceCache::has(local_path)) {
@@ -503,8 +493,7 @@ Ref<ResourceInteractiveLoader> ResourceLoader::load_interactive(const String &p_
if (!p_no_cache) {
_remove_from_loading_map(local_path);
}
- ERR_EXPLAIN("Remapping '" + local_path + "'failed.");
- ERR_FAIL_V(RES());
+ ERR_FAIL_V_MSG(RES(), "Remapping '" + local_path + "' failed.");
}
print_verbose("Loading resource: " + path);
@@ -534,12 +523,9 @@ Ref<ResourceInteractiveLoader> ResourceLoader::load_interactive(const String &p_
_remove_from_loading_map(local_path);
}
- if (found) {
- ERR_EXPLAIN("Failed loading resource: " + path);
- } else {
- ERR_EXPLAIN("No loader found for resource: " + path);
- }
- ERR_FAIL_V(Ref<ResourceInteractiveLoader>());
+ ERR_FAIL_COND_V_MSG(found, Ref<ResourceInteractiveLoader>(), "Failed loading resource: " + path + ".");
+
+ ERR_FAIL_V_MSG(Ref<ResourceInteractiveLoader>(), "No loader found for resource: " + path + ".");
}
void ResourceLoader::add_resource_format_loader(Ref<ResourceFormatLoader> p_format_loader, bool p_at_front) {
@@ -801,7 +787,7 @@ String ResourceLoader::_path_remap(const String &p_path, bool *r_translation_rem
if (err == ERR_FILE_EOF) {
break;
} else if (err != OK) {
- ERR_PRINTS("Parse error: " + p_path + ".remap:" + itos(lines) + " error: " + error_text);
+ ERR_PRINTS("Parse error: " + p_path + ".remap:" + itos(lines) + " error: " + error_text + ".");
break;
}
@@ -932,13 +918,11 @@ bool ResourceLoader::add_custom_resource_format_loader(String script_path) {
Ref<Script> s = res;
StringName ibt = s->get_instance_base_type();
bool valid_type = ClassDB::is_parent_class(ibt, "ResourceFormatLoader");
- ERR_EXPLAIN("Script does not inherit a CustomResourceLoader: " + script_path);
- ERR_FAIL_COND_V(!valid_type, false);
+ ERR_FAIL_COND_V_MSG(!valid_type, false, "Script does not inherit a CustomResourceLoader: " + script_path + ".");
Object *obj = ClassDB::instance(ibt);
- ERR_EXPLAIN("Cannot instance script as custom resource loader, expected 'ResourceFormatLoader' inheritance, got: " + String(ibt));
- ERR_FAIL_COND_V(obj == NULL, false);
+ ERR_FAIL_COND_V_MSG(obj == NULL, false, "Cannot instance script as custom resource loader, expected 'ResourceFormatLoader' inheritance, got: " + String(ibt) + ".");
ResourceFormatLoader *crl = Object::cast_to<ResourceFormatLoader>(obj);
crl->set_script(s.get_ref_ptr());
diff --git a/core/io/resource_loader.h b/core/io/resource_loader.h
index 70e7bdc224..93df8cadb0 100644
--- a/core/io/resource_loader.h
+++ b/core/io/resource_loader.h
@@ -33,9 +33,6 @@
#include "core/os/thread.h"
#include "core/resource.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class ResourceInteractiveLoader : public Reference {
diff --git a/core/io/resource_saver.cpp b/core/io/resource_saver.cpp
index 369cd93442..a9ad62afe6 100644
--- a/core/io/resource_saver.cpp
+++ b/core/io/resource_saver.cpp
@@ -214,13 +214,11 @@ bool ResourceSaver::add_custom_resource_format_saver(String script_path) {
Ref<Script> s = res;
StringName ibt = s->get_instance_base_type();
bool valid_type = ClassDB::is_parent_class(ibt, "ResourceFormatSaver");
- ERR_EXPLAIN("Script does not inherit a CustomResourceSaver: " + script_path);
- ERR_FAIL_COND_V(!valid_type, false);
+ ERR_FAIL_COND_V_MSG(!valid_type, false, "Script does not inherit a CustomResourceSaver: " + script_path + ".");
Object *obj = ClassDB::instance(ibt);
- ERR_EXPLAIN("Cannot instance script as custom resource saver, expected 'ResourceFormatSaver' inheritance, got: " + String(ibt));
- ERR_FAIL_COND_V(obj == NULL, false);
+ ERR_FAIL_COND_V_MSG(obj == NULL, false, "Cannot instance script as custom resource saver, expected 'ResourceFormatSaver' inheritance, got: " + String(ibt) + ".");
ResourceFormatSaver *crl = Object::cast_to<ResourceFormatSaver>(obj);
crl->set_script(s.get_ref_ptr());
diff --git a/core/io/resource_saver.h b/core/io/resource_saver.h
index 0fba47a5e8..20e05d827a 100644
--- a/core/io/resource_saver.h
+++ b/core/io/resource_saver.h
@@ -33,10 +33,6 @@
#include "core/resource.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class ResourceFormatSaver : public Reference {
GDCLASS(ResourceFormatSaver, Reference);
diff --git a/core/io/stream_peer_ssl.cpp b/core/io/stream_peer_ssl.cpp
index ccce48ccd7..f2eaf57acc 100644
--- a/core/io/stream_peer_ssl.cpp
+++ b/core/io/stream_peer_ssl.cpp
@@ -30,10 +30,7 @@
#include "stream_peer_ssl.h"
-#include "core/io/certs_compressed.gen.h"
-#include "core/io/compression.h"
-#include "core/os/file_access.h"
-#include "core/project_settings.h"
+#include "core/engine.h"
StreamPeerSSL *(*StreamPeerSSL::_create)() = NULL;
@@ -44,22 +41,8 @@ StreamPeerSSL *StreamPeerSSL::create() {
return NULL;
}
-StreamPeerSSL::LoadCertsFromMemory StreamPeerSSL::load_certs_func = NULL;
bool StreamPeerSSL::available = false;
-void StreamPeerSSL::load_certs_from_memory(const PoolByteArray &p_memory) {
- if (load_certs_func)
- load_certs_func(p_memory);
-}
-
-void StreamPeerSSL::load_certs_from_file(String p_path) {
- if (p_path != "") {
- PoolByteArray certs = get_cert_file_as_array(p_path);
- if (certs.size() > 0)
- load_certs_func(certs);
- }
-}
-
bool StreamPeerSSL::is_available() {
return available;
}
@@ -72,56 +55,11 @@ bool StreamPeerSSL::is_blocking_handshake_enabled() const {
return blocking_handshake;
}
-PoolByteArray StreamPeerSSL::get_cert_file_as_array(String p_path) {
-
- PoolByteArray out;
- FileAccess *f = FileAccess::open(p_path, FileAccess::READ);
- if (f) {
- int flen = f->get_len();
- out.resize(flen + 1);
- PoolByteArray::Write w = out.write();
- f->get_buffer(w.ptr(), flen);
- w[flen] = 0; // Make sure it ends with string terminator
- memdelete(f);
-#ifdef DEBUG_ENABLED
- print_verbose(vformat("Loaded certs from '%s'.", p_path));
-#endif
- }
-
- return out;
-}
-
-PoolByteArray StreamPeerSSL::get_project_cert_array() {
-
- PoolByteArray out;
- String certs_path = GLOBAL_DEF("network/ssl/certificates", "");
- ProjectSettings::get_singleton()->set_custom_property_info("network/ssl/certificates", PropertyInfo(Variant::STRING, "network/ssl/certificates", PROPERTY_HINT_FILE, "*.crt"));
-
- if (certs_path != "") {
- // Use certs defined in project settings.
- return get_cert_file_as_array(certs_path);
- }
-#ifdef BUILTIN_CERTS_ENABLED
- else {
- // Use builtin certs only if user did not override it in project settings.
- out.resize(_certs_uncompressed_size + 1);
- PoolByteArray::Write w = out.write();
- Compression::decompress(w.ptr(), _certs_uncompressed_size, _certs_compressed, _certs_compressed_size, Compression::MODE_DEFLATE);
- w[_certs_uncompressed_size] = 0; // Make sure it ends with string terminator
-#ifdef DEBUG_ENABLED
- print_verbose("Loaded builtin certs");
-#endif
- }
-#endif
-
- return out;
-}
-
void StreamPeerSSL::_bind_methods() {
ClassDB::bind_method(D_METHOD("poll"), &StreamPeerSSL::poll);
- ClassDB::bind_method(D_METHOD("accept_stream", "base"), &StreamPeerSSL::accept_stream);
- ClassDB::bind_method(D_METHOD("connect_to_stream", "stream", "validate_certs", "for_hostname"), &StreamPeerSSL::connect_to_stream, DEFVAL(false), DEFVAL(String()));
+ ClassDB::bind_method(D_METHOD("accept_stream", "stream", "private_key", "certificate", "chain"), &StreamPeerSSL::accept_stream, DEFVAL(Ref<X509Certificate>()));
+ ClassDB::bind_method(D_METHOD("connect_to_stream", "stream", "validate_certs", "for_hostname", "valid_certificate"), &StreamPeerSSL::connect_to_stream, DEFVAL(false), DEFVAL(String()), DEFVAL(Ref<X509Certificate>()));
ClassDB::bind_method(D_METHOD("get_status"), &StreamPeerSSL::get_status);
ClassDB::bind_method(D_METHOD("disconnect_from_stream"), &StreamPeerSSL::disconnect_from_stream);
ClassDB::bind_method(D_METHOD("set_blocking_handshake_enabled", "enabled"), &StreamPeerSSL::set_blocking_handshake_enabled);
diff --git a/core/io/stream_peer_ssl.h b/core/io/stream_peer_ssl.h
index 482576c4c6..dedc35b9ac 100644
--- a/core/io/stream_peer_ssl.h
+++ b/core/io/stream_peer_ssl.h
@@ -31,19 +31,16 @@
#ifndef STREAM_PEER_SSL_H
#define STREAM_PEER_SSL_H
+#include "core/crypto/crypto.h"
#include "core/io/stream_peer.h"
class StreamPeerSSL : public StreamPeer {
GDCLASS(StreamPeerSSL, StreamPeer);
-public:
- typedef void (*LoadCertsFromMemory)(const PoolByteArray &p_certs);
-
protected:
static StreamPeerSSL *(*_create)();
static void _bind_methods();
- static LoadCertsFromMemory load_certs_func;
static bool available;
bool blocking_handshake;
@@ -61,18 +58,14 @@ public:
bool is_blocking_handshake_enabled() const;
virtual void poll() = 0;
- virtual Error accept_stream(Ref<StreamPeer> p_base) = 0;
- virtual Error connect_to_stream(Ref<StreamPeer> p_base, bool p_validate_certs = false, const String &p_for_hostname = String()) = 0;
+ virtual Error accept_stream(Ref<StreamPeer> p_base, Ref<CryptoKey> p_key, Ref<X509Certificate> p_cert, Ref<X509Certificate> p_ca_chain = Ref<X509Certificate>()) = 0;
+ virtual Error connect_to_stream(Ref<StreamPeer> p_base, bool p_validate_certs = false, const String &p_for_hostname = String(), Ref<X509Certificate> p_valid_cert = Ref<X509Certificate>()) = 0;
virtual Status get_status() const = 0;
virtual void disconnect_from_stream() = 0;
static StreamPeerSSL *create();
- static PoolByteArray get_cert_file_as_array(String p_path);
- static PoolByteArray get_project_cert_array();
- static void load_certs_from_file(String p_path);
- static void load_certs_from_memory(const PoolByteArray &p_memory);
static bool is_available();
StreamPeerSSL();
diff --git a/core/io/translation_loader_po.cpp b/core/io/translation_loader_po.cpp
index 67a0a905bd..e8e71c10ca 100644
--- a/core/io/translation_loader_po.cpp
+++ b/core/io/translation_loader_po.cpp
@@ -67,8 +67,7 @@ RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error, const S
if (status == STATUS_READING_ID) {
memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + " Unexpected EOF while reading 'msgid' at file: ");
- ERR_FAIL_V(RES());
+ ERR_FAIL_V_MSG(RES(), p_path + ":" + itos(line) + " Unexpected EOF while reading 'msgid' at file: ");
} else {
break;
}
@@ -79,8 +78,7 @@ RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error, const S
if (status == STATUS_READING_ID) {
memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + " Unexpected 'msgid', was expecting 'msgstr' while parsing: ");
- ERR_FAIL_V(RES());
+ ERR_FAIL_V_MSG(RES(), p_path + ":" + itos(line) + " Unexpected 'msgid', was expecting 'msgstr' while parsing: ");
}
if (msg_id != "") {
@@ -102,8 +100,7 @@ RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error, const S
if (status != STATUS_READING_ID) {
memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + " Unexpected 'msgstr', was expecting 'msgid' while parsing: ");
- ERR_FAIL_V(RES());
+ ERR_FAIL_V_MSG(RES(), p_path + ":" + itos(line) + " Unexpected 'msgstr', was expecting 'msgid' while parsing: ");
}
l = l.substr(6, l.length()).strip_edges();
@@ -118,11 +115,7 @@ RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error, const S
continue; //nothing to read or comment
}
- if (!l.begins_with("\"") || status == STATUS_NONE) {
- //not a string? failure!
- ERR_EXPLAIN(p_path + ":" + itos(line) + " Invalid line '" + l + "' while parsing: ");
- ERR_FAIL_V(RES());
- }
+ ERR_FAIL_COND_V_MSG(!l.begins_with("\"") || status == STATUS_NONE, RES(), p_path + ":" + itos(line) + " Invalid line '" + l + "' while parsing: ");
l = l.substr(1, l.length());
//find final quote
@@ -135,10 +128,7 @@ RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error, const S
}
}
- if (end_pos == -1) {
- ERR_EXPLAIN(p_path + ":" + itos(line) + " Expected '\"' at end of message while parsing file: ");
- ERR_FAIL_V(RES());
- }
+ ERR_FAIL_COND_V_MSG(end_pos == -1, RES(), p_path + ":" + itos(line) + " Expected '\"' at end of message while parsing file: ");
l = l.substr(0, end_pos);
l = l.c_unescape();
@@ -163,10 +153,7 @@ RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error, const S
config = msg_str;
}
- if (config == "") {
- ERR_EXPLAIN("No config found in file: " + p_path);
- ERR_FAIL_V(RES());
- }
+ ERR_FAIL_COND_V_MSG(config == "", RES(), "No config found in file: " + p_path + ".");
Vector<String> configs = config.split("\n");
for (int i = 0; i < configs.size(); i++) {
diff --git a/core/io/xml_parser.cpp b/core/io/xml_parser.cpp
index 82527d3f38..9487947365 100644
--- a/core/io/xml_parser.cpp
+++ b/core/io/xml_parser.cpp
@@ -443,10 +443,8 @@ String XMLParser::get_attribute_value(const String &p_name) const {
}
}
- if (idx < 0) {
- ERR_EXPLAIN("Attribute not found: " + p_name);
- }
- ERR_FAIL_COND_V(idx < 0, "");
+ ERR_FAIL_COND_V_MSG(idx < 0, "", "Attribute not found: " + p_name + ".");
+
return attributes[idx].value;
}
diff --git a/core/map.h b/core/map.h
index c8197639f2..c87ee42e1b 100644
--- a/core/map.h
+++ b/core/map.h
@@ -33,10 +33,6 @@
#include "core/set.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
// based on the very nice implementation of rb-trees by:
// https://web.archive.org/web/20120507164830/http://web.mit.edu/~emin/www/source_code/red_black_tree/index.html
diff --git a/core/math/SCsub b/core/math/SCsub
index 0995298a4b..be438fcfbe 100644
--- a/core/math/SCsub
+++ b/core/math/SCsub
@@ -2,37 +2,6 @@
Import('env')
-env_math = env.Clone() # Maybe make one specific for crypto?
-
-is_builtin = env["builtin_mbedtls"]
-has_module = env["module_mbedtls_enabled"]
-
-if is_builtin or not has_module:
- # Use our headers for builtin or if the module is not going to be compiled.
- # We decided not to depend on system mbedtls just for these few files that can
- # be easily extracted.
- env_math.Prepend(CPPPATH=["#thirdparty/mbedtls/include"])
-
-# MbedTLS core functions (for CryptoCore).
-# If the mbedtls module is compiled we don't need to add the .c files with our
-# custom config since they will be built by the module itself.
-# Only if the module is not enabled, we must compile here the required sources
-# to make a "light" build with only the necessary mbedtls files.
-if not has_module:
- env_thirdparty = env_math.Clone()
- env_thirdparty.disable_warnings()
- # Custom config file
- env_thirdparty.Append(CPPDEFINES=[('MBEDTLS_CONFIG_FILE', '\\"thirdparty/mbedtls/include/godot_core_mbedtls_config.h\\"')])
- thirdparty_mbedtls_dir = "#thirdparty/mbedtls/library/"
- thirdparty_mbedtls_sources = [
- "aes.c",
- "base64.c",
- "md5.c",
- "sha1.c",
- "sha256.c",
- "godot_core_mbedtls_platform.c"
- ]
- thirdparty_mbedtls_sources = [thirdparty_mbedtls_dir + file for file in thirdparty_mbedtls_sources]
- env_thirdparty.add_source_files(env.core_sources, thirdparty_mbedtls_sources)
+env_math = env.Clone()
env_math.add_source_files(env.core_sources, "*.cpp")
diff --git a/core/math/a_star.cpp b/core/math/a_star.cpp
index b61119d8df..60b7326c29 100644
--- a/core/math/a_star.cpp
+++ b/core/math/a_star.cpp
@@ -40,7 +40,17 @@ int AStar::get_available_point_id() const {
return 1;
}
- return points.back()->key() + 1;
+ // calculate our new next available point id if bigger than before or next id already contained in set of points.
+ if (points.has(last_free_id)) {
+ int cur_new_id = last_free_id;
+ while (points.has(cur_new_id)) {
+ cur_new_id++;
+ }
+ int &non_const = const_cast<int &>(last_free_id);
+ non_const = cur_new_id;
+ }
+
+ return last_free_id;
}
void AStar::add_point(int p_id, const Vector3 &p_pos, real_t p_weight_scale) {
@@ -48,7 +58,10 @@ void AStar::add_point(int p_id, const Vector3 &p_pos, real_t p_weight_scale) {
ERR_FAIL_COND(p_id < 0);
ERR_FAIL_COND(p_weight_scale < 1);
- if (!points.has(p_id)) {
+ Point *found_pt;
+ bool p_exists = points.lookup(p_id, found_pt);
+
+ if (!p_exists) {
Point *pt = memnew(Point);
pt->id = p_id;
pt->pos = p_pos;
@@ -57,84 +70,98 @@ void AStar::add_point(int p_id, const Vector3 &p_pos, real_t p_weight_scale) {
pt->open_pass = 0;
pt->closed_pass = 0;
pt->enabled = true;
- points[p_id] = pt;
+ points.set(p_id, pt);
} else {
- points[p_id]->pos = p_pos;
- points[p_id]->weight_scale = p_weight_scale;
+ found_pt->pos = p_pos;
+ found_pt->weight_scale = p_weight_scale;
}
}
Vector3 AStar::get_point_position(int p_id) const {
- ERR_FAIL_COND_V(!points.has(p_id), Vector3());
+ Point *p;
+ bool p_exists = points.lookup(p_id, p);
+ ERR_FAIL_COND_V(!p_exists, Vector3());
- return points[p_id]->pos;
+ return p->pos;
}
void AStar::set_point_position(int p_id, const Vector3 &p_pos) {
- ERR_FAIL_COND(!points.has(p_id));
+ Point *p;
+ bool p_exists = points.lookup(p_id, p);
+ ERR_FAIL_COND(!p_exists);
- points[p_id]->pos = p_pos;
+ p->pos = p_pos;
}
real_t AStar::get_point_weight_scale(int p_id) const {
- ERR_FAIL_COND_V(!points.has(p_id), 0);
+ Point *p;
+ bool p_exists = points.lookup(p_id, p);
+ ERR_FAIL_COND_V(!p_exists, 0);
- return points[p_id]->weight_scale;
+ return p->weight_scale;
}
void AStar::set_point_weight_scale(int p_id, real_t p_weight_scale) {
- ERR_FAIL_COND(!points.has(p_id));
+ Point *p;
+ bool p_exists = points.lookup(p_id, p);
+ ERR_FAIL_COND(!p_exists);
ERR_FAIL_COND(p_weight_scale < 1);
- points[p_id]->weight_scale = p_weight_scale;
+ p->weight_scale = p_weight_scale;
}
void AStar::remove_point(int p_id) {
- ERR_FAIL_COND(!points.has(p_id));
-
- Point *p = points[p_id];
+ Point *p;
+ bool p_exists = points.lookup(p_id, p);
+ ERR_FAIL_COND(!p_exists);
- for (Set<Point *>::Element *E = p->neighbours.front(); E; E = E->next()) {
+ for (OAHashMap<int, Point *>::Iterator it = p->neighbours.iter(); it.valid; it = p->neighbours.next_iter(it)) {
- Segment s(p_id, E->get()->id);
+ Segment s(p_id, (*it.key));
segments.erase(s);
- E->get()->neighbours.erase(p);
- E->get()->unlinked_neighbours.erase(p);
+ (*it.value)->neighbours.remove(p->id);
+ (*it.value)->unlinked_neighbours.remove(p->id);
}
- for (Set<Point *>::Element *E = p->unlinked_neighbours.front(); E; E = E->next()) {
+ for (OAHashMap<int, Point *>::Iterator it = p->unlinked_neighbours.iter(); it.valid; it = p->unlinked_neighbours.next_iter(it)) {
- Segment s(p_id, E->get()->id);
+ Segment s(p_id, (*it.key));
segments.erase(s);
- E->get()->neighbours.erase(p);
- E->get()->unlinked_neighbours.erase(p);
+ (*it.value)->neighbours.remove(p->id);
+ (*it.value)->unlinked_neighbours.remove(p->id);
}
memdelete(p);
- points.erase(p_id);
+ points.remove(p_id);
+ last_free_id = p_id;
}
void AStar::connect_points(int p_id, int p_with_id, bool bidirectional) {
- ERR_FAIL_COND(!points.has(p_id));
- ERR_FAIL_COND(!points.has(p_with_id));
ERR_FAIL_COND(p_id == p_with_id);
- Point *a = points[p_id];
- Point *b = points[p_with_id];
- a->neighbours.insert(b);
+ Point *a;
+ bool from_exists = points.lookup(p_id, a);
+ ERR_FAIL_COND(!from_exists);
+
+ Point *b;
+ bool to_exists = points.lookup(p_with_id, b);
+ ERR_FAIL_COND(!to_exists);
- if (bidirectional)
- b->neighbours.insert(a);
- else
- b->unlinked_neighbours.insert(a);
+ a->neighbours.set(b->id, b);
+
+ if (bidirectional) {
+ b->neighbours.set(a->id, a);
+ } else {
+ b->unlinked_neighbours.set(a->id, a);
+ }
Segment s(p_id, p_with_id);
if (s.from == p_id) {
@@ -147,6 +174,7 @@ void AStar::connect_points(int p_id, int p_with_id, bool bidirectional) {
segments.insert(s);
}
+
void AStar::disconnect_points(int p_id, int p_with_id) {
Segment s(p_id, p_with_id);
@@ -154,12 +182,18 @@ void AStar::disconnect_points(int p_id, int p_with_id) {
segments.erase(s);
- Point *a = points[p_id];
- Point *b = points[p_with_id];
- a->neighbours.erase(b);
- a->unlinked_neighbours.erase(b);
- b->neighbours.erase(a);
- b->unlinked_neighbours.erase(a);
+ Point *a;
+ bool a_exists = points.lookup(p_id, a);
+ CRASH_COND(!a_exists);
+
+ Point *b;
+ bool b_exists = points.lookup(p_with_id, b);
+ CRASH_COND(!b_exists);
+
+ a->neighbours.remove(b->id);
+ a->unlinked_neighbours.remove(b->id);
+ b->neighbours.remove(a->id);
+ b->unlinked_neighbours.remove(a->id);
}
bool AStar::has_point(int p_id) const {
@@ -171,8 +205,8 @@ Array AStar::get_points() {
Array point_list;
- for (const Map<int, Point *>::Element *E = points.front(); E; E = E->next()) {
- point_list.push_back(E->key());
+ for (OAHashMap<int, Point *>::Iterator it = points.iter(); it.valid; it = points.next_iter(it)) {
+ point_list.push_back(*(it.key));
}
return point_list;
@@ -180,14 +214,14 @@ Array AStar::get_points() {
PoolVector<int> AStar::get_point_connections(int p_id) {
- ERR_FAIL_COND_V(!points.has(p_id), PoolVector<int>());
+ Point *p;
+ bool p_exists = points.lookup(p_id, p);
+ ERR_FAIL_COND_V(!p_exists, PoolVector<int>());
PoolVector<int> point_list;
- Point *p = points[p_id];
-
- for (Set<Point *>::Element *E = p->neighbours.front(); E; E = E->next()) {
- point_list.push_back(E->get()->id);
+ for (OAHashMap<int, Point *>::Iterator it = p->neighbours.iter(); it.valid; it = p->neighbours.next_iter(it)) {
+ point_list.push_back((*it.key));
}
return point_list;
@@ -201,27 +235,41 @@ bool AStar::are_points_connected(int p_id, int p_with_id) const {
void AStar::clear() {
- for (const Map<int, Point *>::Element *E = points.front(); E; E = E->next()) {
-
- memdelete(E->get());
+ last_free_id = 0;
+ for (OAHashMap<int, Point *>::Iterator it = points.iter(); it.valid; it = points.next_iter(it)) {
+ memdelete(*(it.value));
}
segments.clear();
points.clear();
}
+int AStar::get_point_count() const {
+ return points.get_num_elements();
+}
+
+int AStar::get_point_capacity() const {
+ return points.get_capacity();
+}
+
+void AStar::reserve_space(int p_num_nodes) {
+ ERR_FAIL_COND_MSG(p_num_nodes <= 0, "New capacity must be greater than 0, was: " + itos(p_num_nodes) + ".");
+ ERR_FAIL_COND_MSG((uint32_t)p_num_nodes < points.get_capacity(), "New capacity must be greater than current capacity: " + itos(points.get_capacity()) + ", new was: " + itos(p_num_nodes) + ".");
+ points.reserve(p_num_nodes);
+}
+
int AStar::get_closest_point(const Vector3 &p_point) const {
int closest_id = -1;
real_t closest_dist = 1e20;
- for (const Map<int, Point *>::Element *E = points.front(); E; E = E->next()) {
+ for (OAHashMap<int, Point *>::Iterator it = points.iter(); it.valid; it = points.next_iter(it)) {
+
+ if (!(*it.value)->enabled) continue; // Disabled points should not be considered.
- if (!E->get()->enabled)
- continue; //Disabled points should not be considered
- real_t d = p_point.distance_squared_to(E->get()->pos);
+ real_t d = p_point.distance_squared_to((*it.value)->pos);
if (closest_id < 0 || d < closest_dist) {
closest_dist = d;
- closest_id = E->key();
+ closest_id = *(it.key);
}
}
@@ -230,8 +278,8 @@ int AStar::get_closest_point(const Vector3 &p_point) const {
Vector3 AStar::get_closest_position_in_segment(const Vector3 &p_point) const {
- real_t closest_dist = 1e20;
bool found = false;
+ real_t closest_dist = 1e20;
Vector3 closest_point;
for (const Set<Segment>::Element *E = segments.front(); E; E = E->next()) {
@@ -262,8 +310,7 @@ bool AStar::_solve(Point *begin_point, Point *end_point) {
pass++;
- if (!end_point->enabled)
- return false;
+ if (!end_point->enabled) return false;
bool found_route = false;
@@ -272,13 +319,9 @@ bool AStar::_solve(Point *begin_point, Point *end_point) {
begin_point->g_score = 0;
begin_point->f_score = _estimate_cost(begin_point->id, end_point->id);
-
open_list.push_back(begin_point);
- while (true) {
-
- if (open_list.size() == 0) // No path found
- break;
+ while (!open_list.empty()) {
Point *p = open_list[0]; // The currently processed point
@@ -291,24 +334,23 @@ bool AStar::_solve(Point *begin_point, Point *end_point) {
open_list.remove(open_list.size() - 1);
p->closed_pass = pass; // Mark the point as closed
- for (Set<Point *>::Element *E = p->neighbours.front(); E; E = E->next()) {
+ for (OAHashMap<int, Point *>::Iterator it = p->neighbours.iter(); it.valid; it = p->neighbours.next_iter(it)) {
- Point *e = E->get(); // The neighbour point
+ Point *e = *(it.value); // The neighbour point
- if (!e->enabled || e->closed_pass == pass)
+ if (!e->enabled || e->closed_pass == pass) {
continue;
+ }
real_t tentative_g_score = p->g_score + _compute_cost(p->id, e->id) * e->weight_scale;
bool new_point = false;
- if (e->open_pass != pass) { // The point wasn't inside the open list
-
+ if (e->open_pass != pass) { // The point wasn't inside the open list.
e->open_pass = pass;
open_list.push_back(e);
new_point = true;
- } else if (tentative_g_score >= e->g_score) { // The new path is worse than the previous
-
+ } else if (tentative_g_score >= e->g_score) { // The new path is worse than the previous.
continue;
}
@@ -316,10 +358,11 @@ bool AStar::_solve(Point *begin_point, Point *end_point) {
e->g_score = tentative_g_score;
e->f_score = e->g_score + _estimate_cost(e->id, end_point->id);
- if (new_point) // The position of the new points is already known
+ if (new_point) { // The position of the new points is already known.
sorter.push_heap(0, open_list.size() - 1, 0, e, open_list.ptrw());
- else
+ } else {
sorter.push_heap(0, open_list.find(e), 0, e, open_list.ptrw());
+ }
}
}
@@ -331,7 +374,15 @@ float AStar::_estimate_cost(int p_from_id, int p_to_id) {
if (get_script_instance() && get_script_instance()->has_method(SceneStringNames::get_singleton()->_estimate_cost))
return get_script_instance()->call(SceneStringNames::get_singleton()->_estimate_cost, p_from_id, p_to_id);
- return points[p_from_id]->pos.distance_to(points[p_to_id]->pos);
+ Point *from_point;
+ bool from_exists = points.lookup(p_from_id, from_point);
+ CRASH_COND(!from_exists);
+
+ Point *to_point;
+ bool to_exists = points.lookup(p_to_id, to_point);
+ CRASH_COND(!to_exists);
+
+ return from_point->pos.distance_to(to_point->pos);
}
float AStar::_compute_cost(int p_from_id, int p_to_id) {
@@ -339,16 +390,26 @@ float AStar::_compute_cost(int p_from_id, int p_to_id) {
if (get_script_instance() && get_script_instance()->has_method(SceneStringNames::get_singleton()->_compute_cost))
return get_script_instance()->call(SceneStringNames::get_singleton()->_compute_cost, p_from_id, p_to_id);
- return points[p_from_id]->pos.distance_to(points[p_to_id]->pos);
+ Point *from_point;
+ bool from_exists = points.lookup(p_from_id, from_point);
+ CRASH_COND(!from_exists);
+
+ Point *to_point;
+ bool to_exists = points.lookup(p_to_id, to_point);
+ CRASH_COND(!to_exists);
+
+ return from_point->pos.distance_to(to_point->pos);
}
PoolVector<Vector3> AStar::get_point_path(int p_from_id, int p_to_id) {
- ERR_FAIL_COND_V(!points.has(p_from_id), PoolVector<Vector3>());
- ERR_FAIL_COND_V(!points.has(p_to_id), PoolVector<Vector3>());
+ Point *a;
+ bool from_exists = points.lookup(p_from_id, a);
+ ERR_FAIL_COND_V(!from_exists, PoolVector<Vector3>());
- Point *a = points[p_from_id];
- Point *b = points[p_to_id];
+ Point *b;
+ bool to_exists = points.lookup(p_to_id, b);
+ ERR_FAIL_COND_V(!to_exists, PoolVector<Vector3>());
if (a == b) {
PoolVector<Vector3> ret;
@@ -360,11 +421,8 @@ PoolVector<Vector3> AStar::get_point_path(int p_from_id, int p_to_id) {
Point *end_point = b;
bool found_route = _solve(begin_point, end_point);
+ if (!found_route) return PoolVector<Vector3>();
- if (!found_route)
- return PoolVector<Vector3>();
-
- // Midpoints
Point *p = end_point;
int pc = 1; // Begin point
while (p != begin_point) {
@@ -393,11 +451,13 @@ PoolVector<Vector3> AStar::get_point_path(int p_from_id, int p_to_id) {
PoolVector<int> AStar::get_id_path(int p_from_id, int p_to_id) {
- ERR_FAIL_COND_V(!points.has(p_from_id), PoolVector<int>());
- ERR_FAIL_COND_V(!points.has(p_to_id), PoolVector<int>());
+ Point *a;
+ bool from_exists = points.lookup(p_from_id, a);
+ ERR_FAIL_COND_V(!from_exists, PoolVector<int>());
- Point *a = points[p_from_id];
- Point *b = points[p_to_id];
+ Point *b;
+ bool to_exists = points.lookup(p_to_id, b);
+ ERR_FAIL_COND_V(!to_exists, PoolVector<int>());
if (a == b) {
PoolVector<int> ret;
@@ -409,11 +469,8 @@ PoolVector<int> AStar::get_id_path(int p_from_id, int p_to_id) {
Point *end_point = b;
bool found_route = _solve(begin_point, end_point);
+ if (!found_route) return PoolVector<int>();
- if (!found_route)
- return PoolVector<int>();
-
- // Midpoints
Point *p = end_point;
int pc = 1; // Begin point
while (p != begin_point) {
@@ -442,16 +499,20 @@ PoolVector<int> AStar::get_id_path(int p_from_id, int p_to_id) {
void AStar::set_point_disabled(int p_id, bool p_disabled) {
- ERR_FAIL_COND(!points.has(p_id));
+ Point *p;
+ bool p_exists = points.lookup(p_id, p);
+ ERR_FAIL_COND(!p_exists);
- points[p_id]->enabled = !p_disabled;
+ p->enabled = !p_disabled;
}
bool AStar::is_point_disabled(int p_id) const {
- ERR_FAIL_COND_V(!points.has(p_id), false);
+ Point *p;
+ bool p_exists = points.lookup(p_id, p);
+ ERR_FAIL_COND_V(!p_exists, false);
- return !points[p_id]->enabled;
+ return !p->enabled;
}
void AStar::_bind_methods() {
@@ -474,6 +535,9 @@ void AStar::_bind_methods() {
ClassDB::bind_method(D_METHOD("disconnect_points", "id", "to_id"), &AStar::disconnect_points);
ClassDB::bind_method(D_METHOD("are_points_connected", "id", "to_id"), &AStar::are_points_connected);
+ ClassDB::bind_method(D_METHOD("get_point_count"), &AStar::get_point_count);
+ ClassDB::bind_method(D_METHOD("get_point_capacity"), &AStar::get_point_capacity);
+ ClassDB::bind_method(D_METHOD("reserve_space", "num_nodes"), &AStar::reserve_space);
ClassDB::bind_method(D_METHOD("clear"), &AStar::clear);
ClassDB::bind_method(D_METHOD("get_closest_point", "to_position"), &AStar::get_closest_point);
@@ -487,13 +551,11 @@ void AStar::_bind_methods() {
}
AStar::AStar() {
-
+ last_free_id = 0;
pass = 1;
}
AStar::~AStar() {
-
- pass = 1;
clear();
}
@@ -560,10 +622,22 @@ bool AStar2D::are_points_connected(int p_id, int p_with_id) const {
return astar.are_points_connected(p_id, p_with_id);
}
+int AStar2D::get_point_count() const {
+ return astar.get_point_count();
+}
+
+int AStar2D::get_point_capacity() const {
+ return astar.get_point_capacity();
+}
+
void AStar2D::clear() {
astar.clear();
}
+void AStar2D::reserve_space(int p_num_nodes) {
+ astar.reserve_space(p_num_nodes);
+}
+
int AStar2D::get_closest_point(const Vector2 &p_point) const {
return astar.get_closest_point(Vector3(p_point.x, p_point.y, 0));
}
@@ -614,6 +688,9 @@ void AStar2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("disconnect_points", "id", "to_id"), &AStar2D::disconnect_points);
ClassDB::bind_method(D_METHOD("are_points_connected", "id", "to_id"), &AStar2D::are_points_connected);
+ ClassDB::bind_method(D_METHOD("get_point_count"), &AStar2D::get_point_count);
+ ClassDB::bind_method(D_METHOD("get_point_capacity"), &AStar2D::get_point_capacity);
+ ClassDB::bind_method(D_METHOD("reserve_space", "num_nodes"), &AStar2D::reserve_space);
ClassDB::bind_method(D_METHOD("clear"), &AStar2D::clear);
ClassDB::bind_method(D_METHOD("get_closest_point", "to_position"), &AStar2D::get_closest_point);
diff --git a/core/math/a_star.h b/core/math/a_star.h
index ec333efc1d..ec2a06f07f 100644
--- a/core/math/a_star.h
+++ b/core/math/a_star.h
@@ -31,8 +31,8 @@
#ifndef ASTAR_H
#define ASTAR_H
+#include "core/oa_hash_map.h"
#include "core/reference.h"
-#include "core/self_list.h"
/**
A* pathfinding algorithm
@@ -44,19 +44,21 @@ class AStar : public Reference {
GDCLASS(AStar, Reference);
- uint64_t pass;
-
struct Point {
+ Point() :
+ neighbours(4u),
+ unlinked_neighbours(4u) {}
+
int id;
Vector3 pos;
real_t weight_scale;
bool enabled;
- Set<Point *> neighbours;
- Set<Point *> unlinked_neighbours;
+ OAHashMap<int, Point *> neighbours;
+ OAHashMap<int, Point *> unlinked_neighbours;
- // Used for pathfinding
+ // Used for pathfinding.
Point *prev_point;
real_t g_score;
real_t f_score;
@@ -64,16 +66,15 @@ class AStar : public Reference {
uint64_t closed_pass;
};
- Map<int, Point *> points;
-
struct SortPoints {
- _FORCE_INLINE_ bool operator()(const Point *A, const Point *B) const { // Returns true when the Point A is worse than Point B
- if (A->f_score > B->f_score)
+ _FORCE_INLINE_ bool operator()(const Point *A, const Point *B) const { // Returns true when the Point A is worse than Point B.
+ if (A->f_score > B->f_score) {
return true;
- else if (A->f_score < B->f_score)
+ } else if (A->f_score < B->f_score) {
return false;
- else
- return A->g_score < B->g_score; // If the f_costs are the same then prioritize the points that are further away from the start
+ } else {
+ return A->g_score < B->g_score; // If the f_costs are the same then prioritize the points that are further away from the start.
+ }
}
};
@@ -101,6 +102,10 @@ class AStar : public Reference {
}
};
+ int last_free_id;
+ uint64_t pass;
+
+ OAHashMap<int, Point *> points;
Set<Segment> segments;
bool _solve(Point *begin_point, Point *end_point);
@@ -131,6 +136,9 @@ public:
void disconnect_points(int p_id, int p_with_id);
bool are_points_connected(int p_id, int p_with_id) const;
+ int get_point_count() const;
+ int get_point_capacity() const;
+ void reserve_space(int p_num_nodes);
void clear();
int get_closest_point(const Vector3 &p_point) const;
@@ -170,6 +178,9 @@ public:
void disconnect_points(int p_id, int p_with_id);
bool are_points_connected(int p_id, int p_with_id) const;
+ int get_point_count() const;
+ int get_point_capacity() const;
+ void reserve_space(int p_num_nodes);
void clear();
int get_closest_point(const Vector2 &p_point) const;
diff --git a/core/math/basis.cpp b/core/math/basis.cpp
index 400f342018..2985959113 100644
--- a/core/math/basis.cpp
+++ b/core/math/basis.cpp
@@ -618,10 +618,7 @@ Basis::operator String() const {
Quat Basis::get_quat() const {
#ifdef MATH_CHECKS
- if (!is_rotation()) {
- ERR_EXPLAIN("Basis must be normalized in order to be casted to a Quaternion. Use get_rotation_quat() or call orthonormalized() instead.");
- ERR_FAIL_V(Quat());
- }
+ ERR_FAIL_COND_V_MSG(!is_rotation(), Quat(), "Basis must be normalized in order to be casted to a Quaternion. Use get_rotation_quat() or call orthonormalized() instead.");
#endif
/* Allow getting a quaternion from an unnormalized transform */
Basis m = *this;
diff --git a/core/math/basis.h b/core/math/basis.h
index d3adad3d90..053effda69 100644
--- a/core/math/basis.h
+++ b/core/math/basis.h
@@ -36,10 +36,6 @@
#include "core/math/quat.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class Basis {
public:
Vector3 elements[3];
diff --git a/core/math/bsp_tree.h b/core/math/bsp_tree.h
index a7a3697990..90b5e8322a 100644
--- a/core/math/bsp_tree.h
+++ b/core/math/bsp_tree.h
@@ -38,9 +38,7 @@
#include "core/pool_vector.h"
#include "core/variant.h"
#include "core/vector.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class BSP_Tree {
public:
enum {
diff --git a/core/math/camera_matrix.h b/core/math/camera_matrix.h
index 3bcf48f5da..63cc88553d 100644
--- a/core/math/camera_matrix.h
+++ b/core/math/camera_matrix.h
@@ -34,10 +34,6 @@
#include "core/math/rect2.h"
#include "core/math/transform.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
struct CameraMatrix {
enum Planes {
diff --git a/core/math/delaunay.h b/core/math/delaunay.h
index ed52c506db..3f8013a3e6 100644
--- a/core/math/delaunay.h
+++ b/core/math/delaunay.h
@@ -80,11 +80,11 @@ public:
}
static bool edge_compare(const Vector<Vector2> &p_vertices, const Edge &p_a, const Edge &p_b) {
- if (Math::is_zero_approx(p_vertices[p_a.edge[0]].distance_to(p_vertices[p_b.edge[0]])) && Math::is_zero_approx(p_vertices[p_a.edge[1]].distance_to(p_vertices[p_b.edge[1]]))) {
+ if (p_vertices[p_a.edge[0]] == p_vertices[p_b.edge[0]] && p_vertices[p_a.edge[1]] == p_vertices[p_b.edge[1]]) {
return true;
}
- if (Math::is_zero_approx(p_vertices[p_a.edge[0]].distance_to(p_vertices[p_b.edge[1]])) && Math::is_zero_approx(p_vertices[p_a.edge[1]].distance_to(p_vertices[p_b.edge[0]]))) {
+ if (p_vertices[p_a.edge[0]] == p_vertices[p_b.edge[1]] && p_vertices[p_a.edge[1]] == p_vertices[p_b.edge[0]]) {
return true;
}
diff --git a/core/math/expression.cpp b/core/math/expression.cpp
index 15eea1d308..46f81ce5c3 100644
--- a/core/math/expression.cpp
+++ b/core/math/expression.cpp
@@ -2161,10 +2161,8 @@ Error Expression::parse(const String &p_expression, const Vector<String> &p_inpu
}
Variant Expression::execute(Array p_inputs, Object *p_base, bool p_show_error) {
- if (error_set) {
- ERR_EXPLAIN("There was previously a parse error: " + error_str);
- ERR_FAIL_V(Variant());
- }
+
+ ERR_FAIL_COND_V_MSG(error_set, Variant(), "There was previously a parse error: " + error_str + ".");
execution_error = false;
Variant output;
@@ -2173,10 +2171,7 @@ Variant Expression::execute(Array p_inputs, Object *p_base, bool p_show_error) {
if (err) {
execution_error = true;
error_str = error_txt;
- if (p_show_error) {
- ERR_EXPLAIN(error_str);
- ERR_FAIL_V(Variant());
- }
+ ERR_FAIL_COND_V_MSG(p_show_error, Variant(), error_str);
}
return output;
diff --git a/core/math/geometry.cpp b/core/math/geometry.cpp
index 8314cb827c..f37db90929 100644
--- a/core/math/geometry.cpp
+++ b/core/math/geometry.cpp
@@ -34,9 +34,10 @@
#include "thirdparty/misc/clipper.hpp"
#include "thirdparty/misc/triangulator.h"
-#define SCALE_FACTOR 100000.0 // based on CMP_EPSILON
+#define SCALE_FACTOR 100000.0 // Based on CMP_EPSILON.
-/* this implementation is very inefficient, commenting unless bugs happen. See the other one.
+// This implementation is very inefficient, commenting unless bugs happen. See the other one.
+/*
bool Geometry::is_point_in_polygon(const Vector2 &p_point, const Vector<Vector2> &p_polygon) {
Vector<int> indices = Geometry::triangulate_polygon(p_polygon);
@@ -124,8 +125,8 @@ struct _FaceClassify {
};
static bool _connect_faces(_FaceClassify *p_faces, int len, int p_group) {
- /* connect faces, error will occur if an edge is shared between more than 2 faces */
- /* clear connections */
+ // Connect faces, error will occur if an edge is shared between more than 2 faces.
+ // Clear connections.
bool error = false;
@@ -195,13 +196,6 @@ static bool _connect_faces(_FaceClassify *p_faces, int len, int p_group) {
if (p_faces[i].links[j].face == -1)
p_faces[i].valid = false;
}
- /*printf("face %i is valid: %i, group %i. connected to %i:%i,%i:%i,%i:%i\n",i,p_faces[i].valid,p_faces[i].group,
- p_faces[i].links[0].face,
- p_faces[i].links[0].edge,
- p_faces[i].links[1].face,
- p_faces[i].links[1].edge,
- p_faces[i].links[2].face,
- p_faces[i].links[2].edge);*/
}
return error;
}
@@ -249,10 +243,10 @@ PoolVector<PoolVector<Face3> > Geometry::separate_objects(PoolVector<Face3> p_ar
if (error) {
- ERR_FAIL_COND_V(error, PoolVector<PoolVector<Face3> >()); // invalid geometry
+ ERR_FAIL_COND_V(error, PoolVector<PoolVector<Face3> >()); // Invalid geometry.
}
- /* group connected faces in separate objects */
+ // Group connected faces in separate objects.
int group = 0;
for (int i = 0; i < len; i++) {
@@ -264,7 +258,7 @@ PoolVector<PoolVector<Face3> > Geometry::separate_objects(PoolVector<Face3> p_ar
}
}
- /* group connected faces in separate objects */
+ // Group connected faces in separate objects.
for (int i = 0; i < len; i++) {
@@ -376,7 +370,7 @@ static inline void _plot_face(uint8_t ***p_cell_status, int x, int y, int z, int
static inline void _mark_outside(uint8_t ***p_cell_status, int x, int y, int z, int len_x, int len_y, int len_z) {
if (p_cell_status[x][y][z] & 3)
- return; // nothing to do, already used and/or visited
+ return; // Nothing to do, already used and/or visited.
p_cell_status[x][y][z] = _CELL_PREV_FIRST;
@@ -384,29 +378,20 @@ static inline void _mark_outside(uint8_t ***p_cell_status, int x, int y, int z,
uint8_t &c = p_cell_status[x][y][z];
- //printf("at %i,%i,%i\n",x,y,z);
-
if ((c & _CELL_STEP_MASK) == _CELL_STEP_NONE) {
- /* Haven't been in here, mark as outside */
+ // Haven't been in here, mark as outside.
p_cell_status[x][y][z] |= _CELL_EXTERIOR;
- //printf("not marked as anything, marking exterior\n");
}
- //printf("cell step is %i\n",(c&_CELL_STEP_MASK));
-
if ((c & _CELL_STEP_MASK) != _CELL_STEP_DONE) {
- /* if not done, increase step */
+ // If not done, increase step.
c += 1 << 2;
- //printf("incrementing cell step\n");
}
if ((c & _CELL_STEP_MASK) == _CELL_STEP_DONE) {
- /* Go back */
- //printf("done, going back a cell\n");
-
+ // Go back.
switch (c & _CELL_PREV_MASK) {
case _CELL_PREV_FIRST: {
- //printf("at end, finished marking\n");
return;
} break;
case _CELL_PREV_Y_POS: {
@@ -440,8 +425,6 @@ static inline void _mark_outside(uint8_t ***p_cell_status, int x, int y, int z,
continue;
}
- //printf("attempting new cell!\n");
-
int next_x = x, next_y = y, next_z = z;
uint8_t prev = 0;
@@ -475,8 +458,6 @@ static inline void _mark_outside(uint8_t ***p_cell_status, int x, int y, int z,
default: ERR_FAIL();
}
- //printf("testing if new cell will be ok...!\n");
-
if (next_x < 0 || next_x >= len_x)
continue;
if (next_y < 0 || next_y >= len_y)
@@ -484,13 +465,9 @@ static inline void _mark_outside(uint8_t ***p_cell_status, int x, int y, int z,
if (next_z < 0 || next_z >= len_z)
continue;
- //printf("testing if new cell is traversable\n");
-
if (p_cell_status[next_x][next_y][next_z] & 3)
continue;
- //printf("move to it\n");
-
x = next_x;
y = next_y;
z = next_z;
@@ -507,17 +484,6 @@ static inline void _build_faces(uint8_t ***p_cell_status, int x, int y, int z, i
if (p_cell_status[x][y][z] & _CELL_EXTERIOR)
return;
-/* static const Vector3 vertices[8]={
- Vector3(0,0,0),
- Vector3(0,0,1),
- Vector3(0,1,0),
- Vector3(0,1,1),
- Vector3(1,0,0),
- Vector3(1,0,1),
- Vector3(1,1,0),
- Vector3(1,1,1),
- };
-*/
#define vert(m_idx) Vector3(((m_idx)&4) >> 2, ((m_idx)&2) >> 1, (m_idx)&1)
static const uint8_t indices[6][4] = {
@@ -529,22 +495,6 @@ static inline void _build_faces(uint8_t ***p_cell_status, int x, int y, int z, i
{ 0, 4, 6, 2 },
};
- /*
-
- {0,1,2,3},
- {0,1,4,5},
- {0,2,4,6},
- {4,5,6,7},
- {2,3,7,6},
- {1,3,5,7},
-
- {0,2,3,1},
- {0,1,5,4},
- {0,4,6,2},
- {7,6,4,5},
- {7,3,2,6},
- {7,5,1,3},
-*/
for (int i = 0; i < 6; i++) {
@@ -607,9 +557,9 @@ PoolVector<Face3> Geometry::wrap_geometry(PoolVector<Face3> p_array, real_t *p_e
}
}
- global_aabb.grow_by(0.01); // avoid numerical error
+ global_aabb.grow_by(0.01); // Avoid numerical error.
- // determine amount of cells in grid axis
+ // Determine amount of cells in grid axis.
int div_x, div_y, div_z;
if (global_aabb.size.x / _MIN_SIZE < _MAX_LENGTH)
@@ -632,7 +582,7 @@ PoolVector<Face3> Geometry::wrap_geometry(PoolVector<Face3> p_array, real_t *p_e
voxelsize.y /= div_y;
voxelsize.z /= div_z;
- // create and initialize cells to zero
+ // Create and initialize cells to zero.
uint8_t ***cell_status = memnew_arr(uint8_t **, div_x);
for (int i = 0; i < div_x; i++) {
@@ -650,7 +600,7 @@ PoolVector<Face3> Geometry::wrap_geometry(PoolVector<Face3> p_array, real_t *p_e
}
}
- // plot faces into cells
+ // Plot faces into cells.
for (int i = 0; i < face_count; i++) {
@@ -662,7 +612,7 @@ PoolVector<Face3> Geometry::wrap_geometry(PoolVector<Face3> p_array, real_t *p_e
_plot_face(cell_status, 0, 0, 0, div_x, div_y, div_z, voxelsize, f);
}
- // determine which cells connect to the outside by traversing the outside and recursively flood-fill marking
+ // Determine which cells connect to the outside by traversing the outside and recursively flood-fill marking.
for (int i = 0; i < div_x; i++) {
@@ -691,7 +641,7 @@ PoolVector<Face3> Geometry::wrap_geometry(PoolVector<Face3> p_array, real_t *p_e
}
}
- // build faces for the inside-outside cell divisors
+ // Build faces for the inside-outside cell divisors.
PoolVector<Face3> wrapped_faces;
@@ -706,7 +656,7 @@ PoolVector<Face3> Geometry::wrap_geometry(PoolVector<Face3> p_array, real_t *p_e
}
}
- // transform face vertices to global coords
+ // Transform face vertices to global coords.
int wrapped_faces_count = wrapped_faces.size();
PoolVector<Face3>::Write wrapped_facesw = wrapped_faces.write();
@@ -753,7 +703,7 @@ Vector<Vector<Vector2> > Geometry::decompose_polygon_in_convex(Vector<Point2> po
inp.SetOrientation(TRIANGULATOR_CCW);
in_poly.push_back(inp);
TriangulatorPartition tpart;
- if (tpart.ConvexPartition_HM(&in_poly, &out_poly) == 0) { //failed!
+ if (tpart.ConvexPartition_HM(&in_poly, &out_poly) == 0) { // Failed.
ERR_PRINT("Convex decomposing failed!");
return decomp;
}
@@ -781,7 +731,7 @@ Geometry::MeshData Geometry::build_convex_mesh(const PoolVector<Plane> &p_planes
#define SUBPLANE_SIZE 1024.0
- real_t subplane_size = 1024.0; // should compute this from the actual plane
+ real_t subplane_size = 1024.0; // Should compute this from the actual plane.
for (int i = 0; i < p_planes.size(); i++) {
Plane p = p_planes[i];
@@ -789,7 +739,7 @@ Geometry::MeshData Geometry::build_convex_mesh(const PoolVector<Plane> &p_planes
Vector3 ref = Vector3(0.0, 1.0, 0.0);
if (ABS(p.normal.dot(ref)) > 0.95)
- ref = Vector3(0.0, 0.0, 1.0); // change axis
+ ref = Vector3(0.0, 0.0, 1.0); // Change axis.
Vector3 right = p.normal.cross(ref).normalized();
Vector3 up = p.normal.cross(right).normalized();
@@ -827,20 +777,20 @@ Geometry::MeshData Geometry::build_convex_mesh(const PoolVector<Plane> &p_planes
real_t dist0 = clip.distance_to(edge0_A);
real_t dist1 = clip.distance_to(edge1_A);
- if (dist0 <= 0) { // behind plane
+ if (dist0 <= 0) { // Behind plane.
new_vertices.push_back(vertices[k]);
}
- // check for different sides and non coplanar
+ // Check for different sides and non coplanar.
if ((dist0 * dist1) < 0) {
- // calculate intersection
+ // Calculate intersection.
Vector3 rel = edge1_A - edge0_A;
real_t den = clip.normal.dot(rel);
if (Math::is_zero_approx(den))
- continue; // point too short
+ continue; // Point too short.
real_t dist = -(clip.normal.dot(edge0_A) - clip.d) / den;
Vector3 inters = edge0_A + rel * dist;
@@ -854,11 +804,11 @@ Geometry::MeshData Geometry::build_convex_mesh(const PoolVector<Plane> &p_planes
if (vertices.size() < 3)
continue;
- //result is a clockwise face
+ // Result is a clockwise face.
MeshData::Face face;
- // add face indices
+ // Add face indices.
for (int j = 0; j < vertices.size(); j++) {
int idx = -1;
@@ -882,7 +832,7 @@ Geometry::MeshData Geometry::build_convex_mesh(const PoolVector<Plane> &p_planes
face.plane = p;
mesh.faces.push_back(face);
- //add edge
+ // Add edge.
for (int j = 0; j < face.indices.size(); j++) {
@@ -972,7 +922,7 @@ PoolVector<Plane> Geometry::build_sphere_planes(real_t p_radius, int p_lats, int
for (int j = 1; j <= p_lats; j++) {
- //todo this is stupid, fix
+ // FIXME: This is stupid.
Vector3 angle = normal.linear_interpolate(axis, j / (real_t)p_lats).normalized();
Vector3 pos = angle * p_radius;
planes.push_back(Plane(pos, angle));
@@ -1032,12 +982,12 @@ struct _AtlasWorkRectResult {
void Geometry::make_atlas(const Vector<Size2i> &p_rects, Vector<Point2i> &r_result, Size2i &r_size) {
- //super simple, almost brute force scanline stacking fitter
- //it's pretty basic for now, but it tries to make sure that the aspect ratio of the
- //resulting atlas is somehow square. This is necessary because video cards have limits
- //on texture size (usually 2048 or 4096), so the more square a texture, the more chances
- //it will work in every hardware.
- // for example, it will prioritize a 1024x1024 atlas (works everywhere) instead of a
+ // Super simple, almost brute force scanline stacking fitter.
+ // It's pretty basic for now, but it tries to make sure that the aspect ratio of the
+ // resulting atlas is somehow square. This is necessary because video cards have limits.
+ // On texture size (usually 2048 or 4096), so the more square a texture, the more chances.
+ // It will work in every hardware.
+ // For example, it will prioritize a 1024x1024 atlas (works everywhere) instead of a
// 256x8192 atlas (won't work anywhere).
ERR_FAIL_COND(p_rects.size() == 0);
@@ -1066,7 +1016,7 @@ void Geometry::make_atlas(const Vector<Size2i> &p_rects, Vector<Point2i> &r_resu
for (int j = 0; j < w; j++)
hmax.write[j] = 0;
- //place them
+ // Place them.
int ofs = 0;
int limit_h = 0;
for (int j = 0; j < wrects.size(); j++) {
@@ -1101,7 +1051,7 @@ void Geometry::make_atlas(const Vector<Size2i> &p_rects, Vector<Point2i> &r_resu
if (end_w > max_w)
max_w = end_w;
- if (ofs == 0 || end_h > limit_h) //while h limit not reached, keep stacking
+ if (ofs == 0 || end_h > limit_h) // While h limit not reached, keep stacking.
ofs += wrects[j].s.width;
}
@@ -1112,7 +1062,7 @@ void Geometry::make_atlas(const Vector<Size2i> &p_rects, Vector<Point2i> &r_resu
results.push_back(result);
}
- //find the result with the best aspect ratio
+ // Find the result with the best aspect ratio.
int best = -1;
real_t best_aspect = 1e20;
@@ -1152,7 +1102,7 @@ Vector<Vector<Point2> > Geometry::_polypaths_do_operation(PolyBooleanOperation p
}
Path path_a, path_b;
- // Need to scale points (Clipper's requirement for robust computation)
+ // Need to scale points (Clipper's requirement for robust computation).
for (int i = 0; i != p_polypath_a.size(); ++i) {
path_a << IntPoint(p_polypath_a[i].x * SCALE_FACTOR, p_polypath_a[i].y * SCALE_FACTOR);
}
@@ -1160,19 +1110,19 @@ Vector<Vector<Point2> > Geometry::_polypaths_do_operation(PolyBooleanOperation p
path_b << IntPoint(p_polypath_b[i].x * SCALE_FACTOR, p_polypath_b[i].y * SCALE_FACTOR);
}
Clipper clp;
- clp.AddPath(path_a, ptSubject, !is_a_open); // forward compatible with Clipper 10.0.0
- clp.AddPath(path_b, ptClip, true); // polylines cannot be set as clip
+ clp.AddPath(path_a, ptSubject, !is_a_open); // Forward compatible with Clipper 10.0.0.
+ clp.AddPath(path_b, ptClip, true); // Polylines cannot be set as clip.
Paths paths;
if (is_a_open) {
- PolyTree tree; // needed to populate polylines
+ PolyTree tree; // Needed to populate polylines.
clp.Execute(op, tree);
OpenPathsFromPolyTree(tree, paths);
} else {
- clp.Execute(op, paths); // works on closed polygons only
+ clp.Execute(op, paths); // Works on closed polygons only.
}
- // Have to scale points down now
+ // Have to scale points down now.
Vector<Vector<Point2> > polypaths;
for (Paths::size_type i = 0; i < paths.size(); ++i) {
@@ -1214,16 +1164,16 @@ Vector<Vector<Point2> > Geometry::_polypath_offset(const Vector<Point2> &p_polyp
ClipperOffset co;
Path path;
- // Need to scale points (Clipper's requirement for robust computation)
+ // Need to scale points (Clipper's requirement for robust computation).
for (int i = 0; i != p_polypath.size(); ++i) {
path << IntPoint(p_polypath[i].x * SCALE_FACTOR, p_polypath[i].y * SCALE_FACTOR);
}
co.AddPath(path, jt, et);
Paths paths;
- co.Execute(paths, p_delta * SCALE_FACTOR); // inflate/deflate
+ co.Execute(paths, p_delta * SCALE_FACTOR); // Inflate/deflate.
- // Have to scale points down now
+ // Have to scale points down now.
Vector<Vector<Point2> > polypaths;
for (Paths::size_type i = 0; i < paths.size(); ++i) {
diff --git a/core/math/geometry.h b/core/math/geometry.h
index e4f3ff799e..8b0a51c651 100644
--- a/core/math/geometry.h
+++ b/core/math/geometry.h
@@ -41,47 +41,43 @@
#include "core/print_string.h"
#include "core/vector.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class Geometry {
Geometry();
public:
static real_t get_closest_points_between_segments(const Vector2 &p1, const Vector2 &q1, const Vector2 &p2, const Vector2 &q2, Vector2 &c1, Vector2 &c2) {
- Vector2 d1 = q1 - p1; // Direction vector of segment S1
- Vector2 d2 = q2 - p2; // Direction vector of segment S2
+ Vector2 d1 = q1 - p1; // Direction vector of segment S1.
+ Vector2 d2 = q2 - p2; // Direction vector of segment S2.
Vector2 r = p1 - p2;
- real_t a = d1.dot(d1); // Squared length of segment S1, always nonnegative
- real_t e = d2.dot(d2); // Squared length of segment S2, always nonnegative
+ real_t a = d1.dot(d1); // Squared length of segment S1, always nonnegative.
+ real_t e = d2.dot(d2); // Squared length of segment S2, always nonnegative.
real_t f = d2.dot(r);
real_t s, t;
- // Check if either or both segments degenerate into points
+ // Check if either or both segments degenerate into points.
if (a <= CMP_EPSILON && e <= CMP_EPSILON) {
- // Both segments degenerate into points
+ // Both segments degenerate into points.
c1 = p1;
c2 = p2;
return Math::sqrt((c1 - c2).dot(c1 - c2));
}
if (a <= CMP_EPSILON) {
- // First segment degenerates into a point
+ // First segment degenerates into a point.
s = 0.0;
t = f / e; // s = 0 => t = (b*s + f) / e = f / e
t = CLAMP(t, 0.0, 1.0);
} else {
real_t c = d1.dot(r);
if (e <= CMP_EPSILON) {
- // Second segment degenerates into a point
+ // Second segment degenerates into a point.
t = 0.0;
s = CLAMP(-c / a, 0.0, 1.0); // t = 0 => s = (b*t - c) / a = -c / a
} else {
- // The general nondegenerate case starts here
+ // The general nondegenerate case starts here.
real_t b = d1.dot(d2);
- real_t denom = a * e - b * b; // Always nonnegative
+ real_t denom = a * e - b * b; // Always nonnegative.
// If segments not parallel, compute closest point on L1 to L2 and
- // clamp to segment S1. Else pick arbitrary s (here 0)
+ // clamp to segment S1. Else pick arbitrary s (here 0).
if (denom != 0.0) {
s = CLAMP((b * f - c * e) / denom, 0.0, 1.0);
} else
@@ -92,7 +88,7 @@ public:
//If t in [0,1] done. Else clamp t, recompute s for the new value
// of t using s = Dot((P2 + D2*t) - P1,D1) / Dot(D1,D1)= (t*b - c) / a
- // and clamp s to [0, 1]
+ // and clamp s to [0, 1].
if (t < 0.0) {
t = 0.0;
s = CLAMP(-c / a, 0.0, 1.0);
@@ -109,14 +105,14 @@ public:
static void get_closest_points_between_segments(const Vector3 &p1, const Vector3 &p2, const Vector3 &q1, const Vector3 &q2, Vector3 &c1, Vector3 &c2) {
-//do the function 'd' as defined by pb. I think is is dot product of some sort
+// Do the function 'd' as defined by pb. I think is is dot product of some sort.
#define d_of(m, n, o, p) ((m.x - n.x) * (o.x - p.x) + (m.y - n.y) * (o.y - p.y) + (m.z - n.z) * (o.z - p.z))
- //calculate the parametric position on the 2 curves, mua and mub
+ // Calculate the parametric position on the 2 curves, mua and mub.
real_t mua = (d_of(p1, q1, q2, q1) * d_of(q2, q1, p2, p1) - d_of(p1, q1, p2, p1) * d_of(q2, q1, q2, q1)) / (d_of(p2, p1, p2, p1) * d_of(q2, q1, q2, q1) - d_of(q2, q1, p2, p1) * d_of(q2, q1, p2, p1));
real_t mub = (d_of(p1, q1, q2, q1) + mua * d_of(q2, q1, p2, p1)) / d_of(q2, q1, q2, q1);
- //clip the value between [0..1] constraining the solution to lie on the original curves
+ // Clip the value between [0..1] constraining the solution to lie on the original curves.
if (mua < 0) mua = 0;
if (mub < 0) mub = 0;
if (mua > 1) mua = 1;
@@ -129,38 +125,38 @@ public:
Vector3 u = p_to_a - p_from_a;
Vector3 v = p_to_b - p_from_b;
Vector3 w = p_from_a - p_to_a;
- real_t a = u.dot(u); // always >= 0
+ real_t a = u.dot(u); // Always >= 0
real_t b = u.dot(v);
- real_t c = v.dot(v); // always >= 0
+ real_t c = v.dot(v); // Always >= 0
real_t d = u.dot(w);
real_t e = v.dot(w);
- real_t D = a * c - b * b; // always >= 0
+ real_t D = a * c - b * b; // Always >= 0
real_t sc, sN, sD = D; // sc = sN / sD, default sD = D >= 0
real_t tc, tN, tD = D; // tc = tN / tD, default tD = D >= 0
- // compute the line parameters of the two closest points
- if (D < CMP_EPSILON) { // the lines are almost parallel
- sN = 0.0; // force using point P0 on segment S1
- sD = 1.0; // to prevent possible division by 0.0 later
+ // Compute the line parameters of the two closest points.
+ if (D < CMP_EPSILON) { // The lines are almost parallel.
+ sN = 0.0; // Force using point P0 on segment S1
+ sD = 1.0; // to prevent possible division by 0.0 later.
tN = e;
tD = c;
- } else { // get the closest points on the infinite lines
+ } else { // Get the closest points on the infinite lines
sN = (b * e - c * d);
tN = (a * e - b * d);
- if (sN < 0.0) { // sc < 0 => the s=0 edge is visible
+ if (sN < 0.0) { // sc < 0 => the s=0 edge is visible.
sN = 0.0;
tN = e;
tD = c;
- } else if (sN > sD) { // sc > 1 => the s=1 edge is visible
+ } else if (sN > sD) { // sc > 1 => the s=1 edge is visible.
sN = sD;
tN = e + b;
tD = c;
}
}
- if (tN < 0.0) { // tc < 0 => the t=0 edge is visible
+ if (tN < 0.0) { // tc < 0 => the t=0 edge is visible.
tN = 0.0;
- // recompute sc for this edge
+ // Recompute sc for this edge.
if (-d < 0.0)
sN = 0.0;
else if (-d > a)
@@ -169,9 +165,9 @@ public:
sN = -d;
sD = a;
}
- } else if (tN > tD) { // tc > 1 => the t=1 edge is visible
+ } else if (tN > tD) { // tc > 1 => the t=1 edge is visible.
tN = tD;
- // recompute sc for this edge
+ // Recompute sc for this edge.
if ((-d + b) < 0.0)
sN = 0;
else if ((-d + b) > a)
@@ -181,14 +177,14 @@ public:
sD = a;
}
}
- // finally do the division to get sc and tc
+ // Finally do the division to get sc and tc.
sc = (Math::is_zero_approx(sN) ? 0.0 : sN / sD);
tc = (Math::is_zero_approx(tN) ? 0.0 : tN / tD);
- // get the difference of the two closest points
+ // Get the difference of the two closest points.
Vector3 dP = w + (sc * u) - (tc * v); // = S1(sc) - S2(tc)
- return dP.length(); // return the closest distance
+ return dP.length(); // Return the closest distance.
}
static inline bool ray_intersects_triangle(const Vector3 &p_from, const Vector3 &p_dir, const Vector3 &p_v0, const Vector3 &p_v1, const Vector3 &p_v2, Vector3 *r_res = 0) {
@@ -196,7 +192,7 @@ public:
Vector3 e2 = p_v2 - p_v0;
Vector3 h = p_dir.cross(e2);
real_t a = e1.dot(h);
- if (Math::is_zero_approx(a)) // parallel test
+ if (Math::is_zero_approx(a)) // Parallel test.
return false;
real_t f = 1.0 / a;
@@ -214,16 +210,15 @@ public:
if (v < 0.0 || u + v > 1.0)
return false;
- // at this stage we can compute t to find out where
- // the intersection point is on the line
+ // At this stage we can compute t to find out where
+ // the intersection point is on the line.
real_t t = f * e2.dot(q);
if (t > 0.00001) { // ray intersection
if (r_res)
*r_res = p_from + p_dir * t;
return true;
- } else // this means that there is a line intersection
- // but not a ray intersection
+ } else // This means that there is a line intersection but not a ray intersection.
return false;
}
@@ -234,7 +229,7 @@ public:
Vector3 e2 = p_v2 - p_v0;
Vector3 h = rel.cross(e2);
real_t a = e1.dot(h);
- if (Math::is_zero_approx(a)) // parallel test
+ if (Math::is_zero_approx(a)) // Parallel test.
return false;
real_t f = 1.0 / a;
@@ -252,16 +247,15 @@ public:
if (v < 0.0 || u + v > 1.0)
return false;
- // at this stage we can compute t to find out where
- // the intersection point is on the line
+ // At this stage we can compute t to find out where
+ // the intersection point is on the line.
real_t t = f * e2.dot(q);
- if (t > CMP_EPSILON && t <= 1.0) { // ray intersection
+ if (t > CMP_EPSILON && t <= 1.0) { // Ray intersection.
if (r_res)
*r_res = p_from + rel * t;
return true;
- } else // this means that there is a line intersection
- // but not a ray intersection
+ } else // This means that there is a line intersection but not a ray intersection.
return false;
}
@@ -271,13 +265,11 @@ public:
Vector3 rel = (p_to - p_from);
real_t rel_l = rel.length();
if (rel_l < CMP_EPSILON)
- return false; // both points are the same
+ return false; // Both points are the same.
Vector3 normal = rel / rel_l;
real_t sphere_d = normal.dot(sphere_pos);
- //Vector3 ray_closest=normal*sphere_d;
-
real_t ray_distance = sphere_pos.distance_to(normal * sphere_d);
if (ray_distance >= p_sphere_radius)
@@ -289,7 +281,7 @@ public:
if (inters_d2 >= CMP_EPSILON)
inters_d -= Math::sqrt(inters_d2);
- // check in segment
+ // Check in segment.
if (inters_d < 0 || inters_d > rel_l)
return false;
@@ -308,9 +300,9 @@ public:
Vector3 rel = (p_to - p_from);
real_t rel_l = rel.length();
if (rel_l < CMP_EPSILON)
- return false; // both points are the same
+ return false; // Both points are the same.
- // first check if they are parallel
+ // First check if they are parallel.
Vector3 normal = (rel / rel_l);
Vector3 crs = normal.cross(Vector3(0, 0, 1));
real_t crs_l = crs.length();
@@ -318,8 +310,7 @@ public:
Vector3 z_dir;
if (crs_l < CMP_EPSILON) {
- //blahblah parallel
- z_dir = Vector3(1, 0, 0); //any x/y vector ok
+ z_dir = Vector3(1, 0, 0); // Any x/y vector OK.
} else {
z_dir = crs / crs_l;
}
@@ -327,12 +318,12 @@ public:
real_t dist = z_dir.dot(p_from);
if (dist >= p_radius)
- return false; // too far away
+ return false; // Too far away.
- // convert to 2D
+ // Convert to 2D.
real_t w2 = p_radius * p_radius - dist * dist;
if (w2 < CMP_EPSILON)
- return false; //avoid numerical error
+ return false; // Avoid numerical error.
Size2 size(Math::sqrt(w2), p_height * 0.5);
Vector3 x_dir = z_dir.cross(Vector3(0, 0, 1)).normalized();
@@ -379,7 +370,7 @@ public:
return false;
}
- // convert to 3D again
+ // Convert to 3D again.
Vector3 result = p_from + (rel * min);
Vector3 res_normal = result;
@@ -420,19 +411,18 @@ public:
real_t den = p.normal.dot(dir);
- //printf("den is %i\n",den);
if (Math::abs(den) <= CMP_EPSILON)
- continue; // ignore parallel plane
+ continue; // Ignore parallel plane.
real_t dist = -p.distance_to(p_from) / den;
if (den > 0) {
- //backwards facing plane
+ // Backwards facing plane.
if (dist < max)
max = dist;
} else {
- //front facing plane
+ // Front facing plane.
if (dist > min) {
min = dist;
min_index = i;
@@ -440,8 +430,8 @@ public:
}
}
- if (max <= min || min < 0 || min > rel_l || min_index == -1) // exit conditions
- return false; // no intersection
+ if (max <= min || min < 0 || min > rel_l || min_index == -1) // Exit conditions.
+ return false; // No intersection.
if (p_res)
*p_res = p_from + dir * min;
@@ -457,16 +447,16 @@ public:
Vector3 n = p_segment[1] - p_segment[0];
real_t l2 = n.length_squared();
if (l2 < 1e-20)
- return p_segment[0]; // both points are the same, just give any
+ return p_segment[0]; // Both points are the same, just give any.
real_t d = n.dot(p) / l2;
if (d <= 0.0)
- return p_segment[0]; // before first point
+ return p_segment[0]; // Before first point.
else if (d >= 1.0)
- return p_segment[1]; // after first point
+ return p_segment[1]; // After first point.
else
- return p_segment[0] + n * d; // inside
+ return p_segment[0] + n * d; // Inside.
}
static Vector3 get_closest_point_to_segment_uncapped(const Vector3 &p_point, const Vector3 *p_segment) {
@@ -475,11 +465,11 @@ public:
Vector3 n = p_segment[1] - p_segment[0];
real_t l2 = n.length_squared();
if (l2 < 1e-20)
- return p_segment[0]; // both points are the same, just give any
+ return p_segment[0]; // Both points are the same, just give any.
real_t d = n.dot(p) / l2;
- return p_segment[0] + n * d; // inside
+ return p_segment[0] + n * d; // Inside.
}
static Vector2 get_closest_point_to_segment_2d(const Vector2 &p_point, const Vector2 *p_segment) {
@@ -488,16 +478,16 @@ public:
Vector2 n = p_segment[1] - p_segment[0];
real_t l2 = n.length_squared();
if (l2 < 1e-20)
- return p_segment[0]; // both points are the same, just give any
+ return p_segment[0]; // Both points are the same, just give any.
real_t d = n.dot(p) / l2;
if (d <= 0.0)
- return p_segment[0]; // before first point
+ return p_segment[0]; // Before first point.
else if (d >= 1.0)
- return p_segment[1]; // after first point
+ return p_segment[1]; // After first point.
else
- return p_segment[0] + n * d; // inside
+ return p_segment[0] + n * d; // Inside.
}
static bool is_point_in_triangle(const Vector2 &s, const Vector2 &a, const Vector2 &b, const Vector2 &c) {
@@ -512,27 +502,25 @@ public:
return (cn.cross(an) > 0) == orientation;
}
- //static bool is_point_in_polygon(const Vector2 &p_point, const Vector<Vector2> &p_polygon);
-
static Vector2 get_closest_point_to_segment_uncapped_2d(const Vector2 &p_point, const Vector2 *p_segment) {
Vector2 p = p_point - p_segment[0];
Vector2 n = p_segment[1] - p_segment[0];
real_t l2 = n.length_squared();
if (l2 < 1e-20)
- return p_segment[0]; // both points are the same, just give any
+ return p_segment[0]; // Both points are the same, just give any.
real_t d = n.dot(p) / l2;
- return p_segment[0] + n * d; // inside
+ return p_segment[0] + n * d; // Inside.
}
static bool line_intersects_line_2d(const Vector2 &p_from_a, const Vector2 &p_dir_a, const Vector2 &p_from_b, const Vector2 &p_dir_b, Vector2 &r_result) {
- // see http://paulbourke.net/geometry/pointlineplane/
+ // See http://paulbourke.net/geometry/pointlineplane/
const real_t denom = p_dir_b.y * p_dir_a.x - p_dir_b.x * p_dir_a.y;
- if (Math::is_zero_approx(denom)) { // parallel?
+ if (Math::is_zero_approx(denom)) { // Parallel?
return false;
}
@@ -560,11 +548,11 @@ public:
real_t ABpos = D.x + (C.x - D.x) * D.y / (D.y - C.y);
- // Fail if segment C-D crosses line A-B outside of segment A-B.
+ // Fail if segment C-D crosses line A-B outside of segment A-B.
if (ABpos < 0 || ABpos > 1.0)
return false;
- // (4) Apply the discovered position to line A-B in the original coordinate system.
+ // (4) Apply the discovered position to line A-B in the original coordinate system.
if (r_result)
*r_result = p_from_a + B * ABpos;
@@ -597,7 +585,7 @@ public:
real_t d = p_normal.dot(p_sphere_pos) - p_normal.dot(p_triangle[0]);
- if (d > p_sphere_radius || d < -p_sphere_radius) // not touching the plane of the face, return
+ if (d > p_sphere_radius || d < -p_sphere_radius) // Not touching the plane of the face, return.
return false;
Vector3 contact = p_sphere_pos - (p_normal * d);
@@ -617,25 +605,25 @@ public:
for (int i = 0; i < 3; i++) {
- // check edge cylinder
+ // Check edge cylinder.
Vector3 n1 = verts[i] - verts[i + 1];
Vector3 n2 = p_sphere_pos - verts[i + 1];
- ///@TODO i could discard by range here to make the algorithm quicker? dunno..
+ ///@TODO Maybe discard by range here to make the algorithm quicker.
- // check point within cylinder radius
+ // Check point within cylinder radius.
Vector3 axis = n1.cross(n2).cross(n1);
- axis.normalize(); // ugh
+ axis.normalize();
real_t ad = axis.dot(n2);
if (ABS(ad) > p_sphere_radius) {
- // no chance with this edge, too far away
+ // No chance with this edge, too far away.
continue;
}
- // check point within edge capsule cylinder
+ // Check point within edge capsule cylinder.
/** 4th TEST INSIDE EDGE POINTS **/
real_t sphere_at = n1.dot(n2);
@@ -644,8 +632,7 @@ public:
r_triangle_contact = p_sphere_pos - axis * (axis.dot(n2));
r_sphere_contact = p_sphere_pos - axis * p_sphere_radius;
- // point inside here
- //printf("solved inside edge\n");
+ // Point inside here.
return true;
}
@@ -655,48 +642,51 @@ public:
Vector3 n = (p_sphere_pos - verts[i + 1]).normalized();
- //r_triangle_contact=verts[i+1]+n*p_sphere_radius;p_sphere_pos+axis*(p_sphere_radius-axis.dot(n2));
r_triangle_contact = verts[i + 1];
r_sphere_contact = p_sphere_pos - n * p_sphere_radius;
- //printf("solved inside point segment 1\n");
return true;
}
if (n2.distance_squared_to(n1) < r2) {
Vector3 n = (p_sphere_pos - verts[i]).normalized();
- //r_triangle_contact=verts[i]+n*p_sphere_radius;p_sphere_pos+axis*(p_sphere_radius-axis.dot(n2));
r_triangle_contact = verts[i];
r_sphere_contact = p_sphere_pos - n * p_sphere_radius;
- //printf("solved inside point segment 1\n");
return true;
}
- break; // It's pointless to continue at this point, so save some cpu cycles
+ break; // It's pointless to continue at this point, so save some CPU cycles.
}
return false;
}
+ static inline bool is_point_in_circle(const Vector2 &p_point, const Vector2 &p_circle_pos, real_t p_circle_radius) {
+
+ return p_point.distance_squared_to(p_circle_pos) <= p_circle_radius * p_circle_radius;
+ }
+
static real_t segment_intersects_circle(const Vector2 &p_from, const Vector2 &p_to, const Vector2 &p_circle_pos, real_t p_circle_radius) {
Vector2 line_vec = p_to - p_from;
Vector2 vec_to_line = p_from - p_circle_pos;
- /* create a quadratic formula of the form ax^2 + bx + c = 0 */
+ // Create a quadratic formula of the form ax^2 + bx + c = 0
real_t a, b, c;
a = line_vec.dot(line_vec);
b = 2 * vec_to_line.dot(line_vec);
c = vec_to_line.dot(vec_to_line) - p_circle_radius * p_circle_radius;
- /* solve for t */
+ // Solve for t.
real_t sqrtterm = b * b - 4 * a * c;
- /* if the term we intend to square root is less than 0 then the answer won't be real, so it definitely won't be t in the range 0 to 1 */
+ // If the term we intend to square root is less than 0 then the answer won't be real,
+ // so it definitely won't be t in the range 0 to 1.
if (sqrtterm < 0) return -1;
- /* if we can assume that the line segment starts outside the circle (e.g. for continuous time collision detection) then the following can be skipped and we can just return the equivalent of res1 */
+ // If we can assume that the line segment starts outside the circle (e.g. for continuous time collision detection)
+ // then the following can be skipped and we can just return the equivalent of res1.
sqrtterm = Math::sqrt(sqrtterm);
real_t res1 = (-b - sqrtterm) / (2 * a);
real_t res2 = (-b + sqrtterm) / (2 * a);
@@ -722,7 +712,6 @@ public:
int outside_count = 0;
for (int a = 0; a < polygon.size(); a++) {
- //real_t p_plane.d = (*this) * polygon[a];
real_t dist = p_plane.distance_to(polygon[a]);
if (dist < -CMP_POINT_IN_PLANE_EPSILON) {
location_cache[a] = LOC_INSIDE;
@@ -739,11 +728,11 @@ public:
if (outside_count == 0) {
- return polygon; // no changes
+ return polygon; // No changes.
} else if (inside_count == 0) {
- return Vector<Vector3>(); //empty
+ return Vector<Vector3>(); // Empty.
}
long previous = polygon.size() - 1;
@@ -838,22 +827,11 @@ public:
static Vector<Vector<Point2> > offset_polyline_2d(const Vector<Vector2> &p_polygon, real_t p_delta, PolyJoinType p_join_type, PolyEndType p_end_type) {
- ERR_EXPLAIN("Attempt to offset a polyline like a polygon (use offset_polygon_2d instead).");
- ERR_FAIL_COND_V(p_end_type == END_POLYGON, Vector<Vector<Point2> >());
+ ERR_FAIL_COND_V_MSG(p_end_type == END_POLYGON, Vector<Vector<Point2> >(), "Attempt to offset a polyline like a polygon (use offset_polygon_2d instead).");
return _polypath_offset(p_polygon, p_delta, p_join_type, p_end_type);
}
- static Vector<Point2> transform_points_2d(const Vector<Point2> &p_points, const Transform2D &p_mat) {
-
- Vector<Point2> points;
-
- for (int i = 0; i < p_points.size(); ++i) {
- points.push_back(p_mat.xform(p_points[i]));
- }
- return points;
- }
-
static Vector<int> triangulate_delaunay_2d(const Vector<Vector2> &p_points) {
Vector<Delaunay2D::Triangle> tr = Delaunay2D::triangulate(p_points);
@@ -899,7 +877,7 @@ public:
return sum > 0.0f;
}
- /* alternate implementation that should be faster */
+ // Alternate implementation that should be faster.
static bool is_point_in_polygon(const Vector2 &p_point, const Vector<Vector2> &p_polygon) {
int c = p_polygon.size();
if (c < 3)
@@ -915,7 +893,8 @@ public:
further_away_opposite.y = MIN(p[i].y, further_away_opposite.y);
}
- further_away += (further_away - further_away_opposite) * Vector2(1.221313, 1.512312); // make point outside that won't intersect with points in segment from p_point
+ // Make point outside that won't intersect with points in segment from p_point.
+ further_away += (further_away - further_away_opposite) * Vector2(1.221313, 1.512312);
int intersections = 0;
for (int i = 0; i < c; i++) {
@@ -931,7 +910,8 @@ public:
static PoolVector<PoolVector<Face3> > separate_objects(PoolVector<Face3> p_array);
- static PoolVector<Face3> wrap_geometry(PoolVector<Face3> p_array, real_t *p_error = NULL); ///< create a "wrap" that encloses the given geometry
+ // Create a "wrap" that encloses the given geometry.
+ static PoolVector<Face3> wrap_geometry(PoolVector<Face3> p_array, real_t *p_error = NULL);
struct MeshData {
@@ -1013,17 +993,17 @@ public:
Vector<Point2> H;
H.resize(2 * n);
- // Sort points lexicographically
+ // Sort points lexicographically.
P.sort();
- // Build lower hull
+ // Build lower hull.
for (int i = 0; i < n; ++i) {
while (k >= 2 && vec2_cross(H[k - 2], H[k - 1], P[i]) <= 0)
k--;
H.write[k++] = P[i];
}
- // Build upper hull
+ // Build upper hull.
for (int i = n - 2, t = k + 1; i >= 0; i--) {
while (k >= t && vec2_cross(H[k - 2], H[k - 1], P[i]) <= 0)
k--;
diff --git a/core/math/math_funcs.h b/core/math/math_funcs.h
index af845ca01e..9078abea68 100644
--- a/core/math/math_funcs.h
+++ b/core/math/math_funcs.h
@@ -300,6 +300,11 @@ public:
}
static _ALWAYS_INLINE_ bool is_equal_approx(real_t a, real_t b) {
+ // Check for exact equality first, required to handle "infinity" values.
+ if (a == b) {
+ return true;
+ }
+ // Then check for approximate equality.
real_t tolerance = CMP_EPSILON * abs(a);
if (tolerance < CMP_EPSILON) {
tolerance = CMP_EPSILON;
@@ -308,6 +313,11 @@ public:
}
static _ALWAYS_INLINE_ bool is_equal_approx(real_t a, real_t b, real_t tolerance) {
+ // Check for exact equality first, required to handle "infinity" values.
+ if (a == b) {
+ return true;
+ }
+ // Then check for approximate equality.
return abs(a - b) < tolerance;
}
diff --git a/core/math/octree.h b/core/math/octree.h
index d6fc9776bc..db15c8a1f8 100644
--- a/core/math/octree.h
+++ b/core/math/octree.h
@@ -38,10 +38,6 @@
#include "core/print_string.h"
#include "core/variant.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
typedef uint32_t OctreeElementID;
#define OCTREE_ELEMENT_INVALID_ID 0
@@ -568,10 +564,7 @@ void Octree<T, use_pairs, AL>::_ensure_valid_root(const AABB &p_aabb) {
while (!base.encloses(p_aabb)) {
- if (base.size.x > OCTREE_SIZE_LIMIT) {
- ERR_EXPLAIN("Octree upper size limit reeached, does the AABB supplied contain NAN?");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(base.size.x > OCTREE_SIZE_LIMIT, "Octree upper size limit reached, does the AABB supplied contain NAN?");
Octant *gp = memnew_allocator(Octant, AL);
octant_count++;
diff --git a/core/math/quat.h b/core/math/quat.h
index 8ed2fa7cc2..3d6602e466 100644
--- a/core/math/quat.h
+++ b/core/math/quat.h
@@ -38,10 +38,6 @@
#include "core/math/math_funcs.h"
#include "core/ustring.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class Quat {
public:
real_t x, y, z, w;
diff --git a/core/math/transform.h b/core/math/transform.h
index df0a036218..90e2b07583 100644
--- a/core/math/transform.h
+++ b/core/math/transform.h
@@ -34,10 +34,7 @@
#include "core/math/aabb.h"
#include "core/math/basis.h"
#include "core/math/plane.h"
-
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+#include "core/pool_vector.h"
class Transform {
public:
@@ -86,6 +83,9 @@ public:
_FORCE_INLINE_ AABB xform(const AABB &p_aabb) const;
_FORCE_INLINE_ AABB xform_inv(const AABB &p_aabb) const;
+ _FORCE_INLINE_ PoolVector<Vector3> xform(const PoolVector<Vector3> &p_array) const;
+ _FORCE_INLINE_ PoolVector<Vector3> xform_inv(const PoolVector<Vector3> &p_array) const;
+
void operator*=(const Transform &p_transform);
Transform operator*(const Transform &p_transform) const;
@@ -158,22 +158,29 @@ _FORCE_INLINE_ Plane Transform::xform_inv(const Plane &p_plane) const {
}
_FORCE_INLINE_ AABB Transform::xform(const AABB &p_aabb) const {
- /* define vertices */
- Vector3 x = basis.get_axis(0) * p_aabb.size.x;
- Vector3 y = basis.get_axis(1) * p_aabb.size.y;
- Vector3 z = basis.get_axis(2) * p_aabb.size.z;
- Vector3 pos = xform(p_aabb.position);
- //could be even further optimized
- AABB new_aabb;
- new_aabb.position = pos;
- new_aabb.expand_to(pos + x);
- new_aabb.expand_to(pos + y);
- new_aabb.expand_to(pos + z);
- new_aabb.expand_to(pos + x + y);
- new_aabb.expand_to(pos + x + z);
- new_aabb.expand_to(pos + y + z);
- new_aabb.expand_to(pos + x + y + z);
- return new_aabb;
+
+ /* http://dev.theomader.com/transform-bounding-boxes/ */
+ Vector3 min = p_aabb.position;
+ Vector3 max = p_aabb.position + p_aabb.size;
+ Vector3 tmin, tmax;
+ for (int i = 0; i < 3; i++) {
+ tmin[i] = tmax[i] = origin[i];
+ for (int j = 0; j < 3; j++) {
+ real_t e = basis[i][j] * min[j];
+ real_t f = basis[i][j] * max[j];
+ if (e < f) {
+ tmin[i] += e;
+ tmax[i] += f;
+ } else {
+ tmin[i] += f;
+ tmax[i] += e;
+ }
+ }
+ }
+ AABB r_aabb;
+ r_aabb.position = tmin;
+ r_aabb.size = tmax - tmin;
+ return r_aabb;
}
_FORCE_INLINE_ AABB Transform::xform_inv(const AABB &p_aabb) const {
@@ -202,4 +209,32 @@ _FORCE_INLINE_ AABB Transform::xform_inv(const AABB &p_aabb) const {
return ret;
}
+PoolVector<Vector3> Transform::xform(const PoolVector<Vector3> &p_array) const {
+
+ PoolVector<Vector3> array;
+ array.resize(p_array.size());
+
+ PoolVector<Vector3>::Read r = p_array.read();
+ PoolVector<Vector3>::Write w = array.write();
+
+ for (int i = 0; i < p_array.size(); ++i) {
+ w[i] = xform(r[i]);
+ }
+ return array;
+}
+
+PoolVector<Vector3> Transform::xform_inv(const PoolVector<Vector3> &p_array) const {
+
+ PoolVector<Vector3> array;
+ array.resize(p_array.size());
+
+ PoolVector<Vector3>::Read r = p_array.read();
+ PoolVector<Vector3>::Write w = array.write();
+
+ for (int i = 0; i < p_array.size(); ++i) {
+ w[i] = xform_inv(r[i]);
+ }
+ return array;
+}
+
#endif // TRANSFORM_H
diff --git a/core/math/transform_2d.h b/core/math/transform_2d.h
index c44678674a..e8b44ab197 100644
--- a/core/math/transform_2d.h
+++ b/core/math/transform_2d.h
@@ -32,6 +32,7 @@
#define TRANSFORM_2D_H
#include "core/math/rect2.h" // also includes vector2, math_funcs, and ustring
+#include "core/pool_vector.h"
struct Transform2D {
// Warning #1: basis of Transform2D is stored differently from Basis. In terms of elements array, the basis matrix looks like "on paper":
@@ -110,6 +111,8 @@ struct Transform2D {
_FORCE_INLINE_ Vector2 xform_inv(const Vector2 &p_vec) const;
_FORCE_INLINE_ Rect2 xform(const Rect2 &p_rect) const;
_FORCE_INLINE_ Rect2 xform_inv(const Rect2 &p_rect) const;
+ _FORCE_INLINE_ PoolVector<Vector2> xform(const PoolVector<Vector2> &p_array) const;
+ _FORCE_INLINE_ PoolVector<Vector2> xform_inv(const PoolVector<Vector2> &p_array) const;
operator String() const;
@@ -199,4 +202,32 @@ Rect2 Transform2D::xform_inv(const Rect2 &p_rect) const {
return new_rect;
}
+PoolVector<Vector2> Transform2D::xform(const PoolVector<Vector2> &p_array) const {
+
+ PoolVector<Vector2> array;
+ array.resize(p_array.size());
+
+ PoolVector<Vector2>::Read r = p_array.read();
+ PoolVector<Vector2>::Write w = array.write();
+
+ for (int i = 0; i < p_array.size(); ++i) {
+ w[i] = xform(r[i]);
+ }
+ return array;
+}
+
+PoolVector<Vector2> Transform2D::xform_inv(const PoolVector<Vector2> &p_array) const {
+
+ PoolVector<Vector2> array;
+ array.resize(p_array.size());
+
+ PoolVector<Vector2>::Read r = p_array.read();
+ PoolVector<Vector2>::Write w = array.write();
+
+ for (int i = 0; i < p_array.size(); ++i) {
+ w[i] = xform_inv(r[i]);
+ }
+ return array;
+}
+
#endif // TRANSFORM_2D_H
diff --git a/core/math/vector2.cpp b/core/math/vector2.cpp
index 779a28be66..972bccc0ac 100644
--- a/core/math/vector2.cpp
+++ b/core/math/vector2.cpp
@@ -98,6 +98,11 @@ real_t Vector2::cross(const Vector2 &p_other) const {
return x * p_other.y - y * p_other.x;
}
+Vector2 Vector2::sign() const {
+
+ return Vector2(SGN(x), SGN(y));
+}
+
Vector2 Vector2::floor() const {
return Vector2(Math::floor(x), Math::floor(y));
@@ -121,6 +126,14 @@ Vector2 Vector2::rotated(real_t p_by) const {
return v;
}
+Vector2 Vector2::posmod(const real_t p_mod) const {
+ return Vector2(Math::fposmod(x, p_mod), Math::fposmod(y, p_mod));
+}
+
+Vector2 Vector2::posmodv(const Vector2 &p_modv) const {
+ return Vector2(Math::fposmod(x, p_modv.x), Math::fposmod(y, p_modv.y));
+}
+
Vector2 Vector2::project(const Vector2 &p_b) const {
return p_b * (dot(p_b) / p_b.length_squared());
}
diff --git a/core/math/vector2.h b/core/math/vector2.h
index 78a1641c1e..1a73831891 100644
--- a/core/math/vector2.h
+++ b/core/math/vector2.h
@@ -38,6 +38,11 @@ struct Vector2i;
struct Vector2 {
+ enum Axis {
+ AXIS_X,
+ AXIS_Y,
+ };
+
union {
real_t x;
real_t width;
@@ -69,6 +74,8 @@ struct Vector2 {
real_t dot(const Vector2 &p_other) const;
real_t cross(const Vector2 &p_other) const;
+ Vector2 posmod(const real_t p_mod) const;
+ Vector2 posmodv(const Vector2 &p_modv) const;
Vector2 project(const Vector2 &p_b) const;
Vector2 plane_project(real_t p_d, const Vector2 &p_vec) const;
@@ -107,8 +114,10 @@ struct Vector2 {
bool operator==(const Vector2 &p_vec2) const;
bool operator!=(const Vector2 &p_vec2) const;
- bool operator<(const Vector2 &p_vec2) const { return (Math::is_equal_approx(x, p_vec2.x)) ? (y < p_vec2.y) : (x < p_vec2.x); }
- bool operator<=(const Vector2 &p_vec2) const { return (Math::is_equal_approx(x, p_vec2.x)) ? (y <= p_vec2.y) : (x < p_vec2.x); }
+ bool operator<(const Vector2 &p_vec2) const { return Math::is_equal_approx(x, p_vec2.x) ? (y < p_vec2.y) : (x < p_vec2.x); }
+ bool operator>(const Vector2 &p_vec2) const { return Math::is_equal_approx(x, p_vec2.x) ? (y > p_vec2.y) : (x > p_vec2.x); }
+ bool operator<=(const Vector2 &p_vec2) const { return Math::is_equal_approx(x, p_vec2.x) ? (y <= p_vec2.y) : (x < p_vec2.x); }
+ bool operator>=(const Vector2 &p_vec2) const { return Math::is_equal_approx(x, p_vec2.x) ? (y >= p_vec2.y) : (x > p_vec2.x); }
real_t angle() const;
@@ -129,6 +138,7 @@ struct Vector2 {
return Vector2(y, -x);
}
+ Vector2 sign() const;
Vector2 floor() const;
Vector2 ceil() const;
Vector2 round() const;
@@ -141,10 +151,7 @@ struct Vector2 {
x = p_x;
y = p_y;
}
- _FORCE_INLINE_ Vector2() {
- x = 0;
- y = 0;
- }
+ _FORCE_INLINE_ Vector2() { x = y = 0; }
};
_FORCE_INLINE_ Vector2 Vector2::plane_project(real_t p_d, const Vector2 &p_vec) const {
@@ -262,6 +269,11 @@ typedef Vector2 Point2;
struct Vector2i {
+ enum Axis {
+ AXIS_X,
+ AXIS_Y,
+ };
+
union {
int x;
int width;
diff --git a/core/math/vector3.h b/core/math/vector3.h
index 45bdfee487..c68b075613 100644
--- a/core/math/vector3.h
+++ b/core/math/vector3.h
@@ -31,9 +31,7 @@
#ifndef VECTOR3_H
#define VECTOR3_H
-#include "core/math/math_defs.h"
#include "core/math/math_funcs.h"
-#include "core/typedefs.h"
#include "core/ustring.h"
class Basis;
@@ -110,6 +108,8 @@ struct Vector3 {
_FORCE_INLINE_ real_t distance_to(const Vector3 &p_b) const;
_FORCE_INLINE_ real_t distance_squared_to(const Vector3 &p_b) const;
+ _FORCE_INLINE_ Vector3 posmod(const real_t p_mod) const;
+ _FORCE_INLINE_ Vector3 posmodv(const Vector3 &p_modv) const;
_FORCE_INLINE_ Vector3 project(const Vector3 &p_b) const;
_FORCE_INLINE_ real_t angle_to(const Vector3 &p_b) const;
@@ -141,15 +141,17 @@ struct Vector3 {
_FORCE_INLINE_ bool operator!=(const Vector3 &p_v) const;
_FORCE_INLINE_ bool operator<(const Vector3 &p_v) const;
_FORCE_INLINE_ bool operator<=(const Vector3 &p_v) const;
+ _FORCE_INLINE_ bool operator>(const Vector3 &p_v) const;
+ _FORCE_INLINE_ bool operator>=(const Vector3 &p_v) const;
operator String() const;
- _FORCE_INLINE_ Vector3() { x = y = z = 0; }
_FORCE_INLINE_ Vector3(real_t p_x, real_t p_y, real_t p_z) {
x = p_x;
y = p_y;
z = p_z;
}
+ _FORCE_INLINE_ Vector3() { x = y = z = 0; }
};
// Should be included after class definition, otherwise we get circular refs
@@ -233,6 +235,14 @@ real_t Vector3::distance_squared_to(const Vector3 &p_b) const {
return (p_b - *this).length_squared();
}
+Vector3 Vector3::posmod(const real_t p_mod) const {
+ return Vector3(Math::fposmod(x, p_mod), Math::fposmod(y, p_mod), Math::fposmod(z, p_mod));
+}
+
+Vector3 Vector3::posmodv(const Vector3 &p_modv) const {
+ return Vector3(Math::fposmod(x, p_modv.x), Math::fposmod(y, p_modv.y), Math::fposmod(z, p_modv.z));
+}
+
Vector3 Vector3::project(const Vector3 &p_b) const {
return p_b * (dot(p_b) / p_b.length_squared());
}
@@ -357,6 +367,18 @@ bool Vector3::operator<(const Vector3 &p_v) const {
}
}
+bool Vector3::operator>(const Vector3 &p_v) const {
+
+ if (Math::is_equal_approx(x, p_v.x)) {
+ if (Math::is_equal_approx(y, p_v.y))
+ return z > p_v.z;
+ else
+ return y > p_v.y;
+ } else {
+ return x > p_v.x;
+ }
+}
+
bool Vector3::operator<=(const Vector3 &p_v) const {
if (Math::is_equal_approx(x, p_v.x)) {
@@ -369,6 +391,18 @@ bool Vector3::operator<=(const Vector3 &p_v) const {
}
}
+bool Vector3::operator>=(const Vector3 &p_v) const {
+
+ if (Math::is_equal_approx(x, p_v.x)) {
+ if (Math::is_equal_approx(y, p_v.y))
+ return z >= p_v.z;
+ else
+ return y > p_v.y;
+ } else {
+ return x > p_v.x;
+ }
+}
+
_FORCE_INLINE_ Vector3 vec3_cross(const Vector3 &p_a, const Vector3 &p_b) {
return p_a.cross(p_b);
diff --git a/core/message_queue.cpp b/core/message_queue.cpp
index 32d2b805f6..390989ac91 100644
--- a/core/message_queue.cpp
+++ b/core/message_queue.cpp
@@ -52,8 +52,7 @@ Error MessageQueue::push_call(ObjectID p_id, const StringName &p_method, const V
type = ObjectDB::get_instance(p_id)->get_class();
print_line("Failed method: " + type + ":" + p_method + " target ID: " + itos(p_id));
statistics();
- ERR_EXPLAIN("Message queue out of memory. Try increasing 'message_queue_size_kb' in project settings.");
- ERR_FAIL_V(ERR_OUT_OF_MEMORY);
+ ERR_FAIL_V_MSG(ERR_OUT_OF_MEMORY, "Message queue out of memory. Try increasing 'message_queue_size_kb' in project settings.");
}
Message *msg = memnew_placement(&buffer[buffer_end], Message);
@@ -103,8 +102,7 @@ Error MessageQueue::push_set(ObjectID p_id, const StringName &p_prop, const Vari
type = ObjectDB::get_instance(p_id)->get_class();
print_line("Failed set: " + type + ":" + p_prop + " target ID: " + itos(p_id));
statistics();
- ERR_EXPLAIN("Message queue out of memory. Try increasing 'message_queue_size_kb' in project settings.");
- ERR_FAIL_V(ERR_OUT_OF_MEMORY);
+ ERR_FAIL_V_MSG(ERR_OUT_OF_MEMORY, "Message queue out of memory. Try increasing 'message_queue_size_kb' in project settings.");
}
Message *msg = memnew_placement(&buffer[buffer_end], Message);
@@ -136,8 +134,7 @@ Error MessageQueue::push_notification(ObjectID p_id, int p_notification) {
type = ObjectDB::get_instance(p_id)->get_class();
print_line("Failed notification: " + itos(p_notification) + " target ID: " + itos(p_id));
statistics();
- ERR_EXPLAIN("Message queue out of memory. Try increasing 'message_queue_size_kb' in project settings.");
- ERR_FAIL_V(ERR_OUT_OF_MEMORY);
+ ERR_FAIL_V_MSG(ERR_OUT_OF_MEMORY, "Message queue out of memory. Try increasing 'message_queue_size_kb' in project settings.");
}
Message *msg = memnew_placement(&buffer[buffer_end], Message);
@@ -256,7 +253,7 @@ void MessageQueue::_call_function(Object *p_target, const StringName &p_func, co
p_target->call(p_func, argptrs, p_argcount, ce);
if (p_show_error && ce.error != Variant::CallError::CALL_OK) {
- ERR_PRINTS("Error calling deferred method: " + Variant::get_call_error_text(p_target, p_func, argptrs, p_argcount, ce));
+ ERR_PRINTS("Error calling deferred method: " + Variant::get_call_error_text(p_target, p_func, argptrs, p_argcount, ce) + ".");
}
}
diff --git a/core/method_bind.h b/core/method_bind.h
index 1b0c3b27c0..7bb75e778f 100644
--- a/core/method_bind.h
+++ b/core/method_bind.h
@@ -38,10 +38,6 @@
#include <stdio.h>
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
#ifdef DEBUG_ENABLED
#define DEBUG_METHODS_ENABLED
#endif
diff --git a/core/node_path.cpp b/core/node_path.cpp
index a4b7cbe2eb..8244785d84 100644
--- a/core/node_path.cpp
+++ b/core/node_path.cpp
@@ -375,8 +375,7 @@ NodePath::NodePath(const String &p_path) {
if (str == "") {
if (path[i] == 0) continue; // Allow end-of-path :
- ERR_EXPLAIN("Invalid NodePath: " + p_path);
- ERR_FAIL();
+ ERR_FAIL_MSG("Invalid NodePath: " + p_path + ".");
}
subpath.push_back(str);
diff --git a/core/node_path.h b/core/node_path.h
index 24725123d6..1b21c4ef1c 100644
--- a/core/node_path.h
+++ b/core/node_path.h
@@ -34,10 +34,6 @@
#include "core/string_name.h"
#include "core/ustring.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class NodePath {
struct Data {
diff --git a/core/oa_hash_map.h b/core/oa_hash_map.h
index e52d36a859..5ea6d8b0d4 100644
--- a/core/oa_hash_map.h
+++ b/core/oa_hash_map.h
@@ -62,7 +62,7 @@ private:
static const uint32_t EMPTY_HASH = 0;
static const uint32_t DELETED_HASH_BIT = 1 << 31;
- _FORCE_INLINE_ uint32_t _hash(const TKey &p_key) {
+ _FORCE_INLINE_ uint32_t _hash(const TKey &p_key) const {
uint32_t hash = Hasher::hash(p_key);
if (hash == EMPTY_HASH) {
@@ -74,12 +74,11 @@ private:
return hash;
}
- _FORCE_INLINE_ uint32_t _get_probe_length(uint32_t p_pos, uint32_t p_hash) {
+ _FORCE_INLINE_ uint32_t _get_probe_length(uint32_t p_pos, uint32_t p_hash) const {
p_hash = p_hash & ~DELETED_HASH_BIT; // we don't care if it was deleted or not
uint32_t original_pos = p_hash % capacity;
-
- return p_pos - original_pos;
+ return (p_pos - original_pos) % capacity;
}
_FORCE_INLINE_ void _construct(uint32_t p_pos, uint32_t p_hash, const TKey &p_key, const TValue &p_value) {
@@ -90,7 +89,7 @@ private:
num_elements++;
}
- bool _lookup_pos(const TKey &p_key, uint32_t &r_pos) {
+ bool _lookup_pos(const TKey &p_key, uint32_t &r_pos) const {
uint32_t hash = _hash(p_key);
uint32_t pos = hash % capacity;
uint32_t distance = 0;
@@ -151,17 +150,17 @@ private:
distance++;
}
}
- void _resize_and_rehash() {
+
+ void _resize_and_rehash(uint32_t p_new_capacity) {
+
+ uint32_t old_capacity = capacity;
+ capacity = p_new_capacity;
TKey *old_keys = keys;
TValue *old_values = values;
uint32_t *old_hashes = hashes;
- uint32_t old_capacity = capacity;
-
- capacity = old_capacity * 2;
num_elements = 0;
-
keys = memnew_arr(TKey, capacity);
values = memnew_arr(TValue, capacity);
hashes = memnew_arr(uint32_t, capacity);
@@ -186,10 +185,38 @@ private:
memdelete_arr(old_hashes);
}
+ void _resize_and_rehash() {
+ _resize_and_rehash(capacity * 2);
+ }
+
public:
_FORCE_INLINE_ uint32_t get_capacity() const { return capacity; }
_FORCE_INLINE_ uint32_t get_num_elements() const { return num_elements; }
+ bool empty() const {
+ return num_elements == 0;
+ }
+
+ void clear() {
+
+ for (uint32_t i = 0; i < capacity; i++) {
+
+ if (hashes[i] == EMPTY_HASH) {
+ continue;
+ }
+
+ if (hashes[i] & DELETED_HASH_BIT) {
+ continue;
+ }
+
+ hashes[i] = EMPTY_HASH;
+ values[i].~TValue();
+ keys[i].~TKey();
+ }
+
+ num_elements = 0;
+ }
+
void insert(const TKey &p_key, const TValue &p_value) {
if ((float)num_elements / (float)capacity > 0.9) {
@@ -219,7 +246,7 @@ public:
* if r_data is not NULL then the value will be written to the object
* it points to.
*/
- bool lookup(const TKey &p_key, TValue &r_data) {
+ bool lookup(const TKey &p_key, TValue &r_data) const {
uint32_t pos = 0;
bool exists = _lookup_pos(p_key, pos);
@@ -232,7 +259,7 @@ public:
return false;
}
- _FORCE_INLINE_ bool has(const TKey &p_key) {
+ _FORCE_INLINE_ bool has(const TKey &p_key) const {
uint32_t _pos = 0;
return _lookup_pos(p_key, _pos);
}
@@ -251,6 +278,16 @@ public:
num_elements--;
}
+ /**
+ * reserves space for a number of elements, useful to avoid many resizes and rehashes
+ * if adding a known (possibly large) number of elements at once, must be larger than old
+ * capacity.
+ **/
+ void reserve(uint32_t p_new_capacity) {
+ ERR_FAIL_COND(p_new_capacity < capacity);
+ _resize_and_rehash(p_new_capacity);
+ }
+
struct Iterator {
bool valid;
@@ -302,6 +339,9 @@ public:
return it;
}
+ OAHashMap(const OAHashMap &) = delete; // Delete the copy constructor so we don't get unexpected copies and dangling pointers.
+ OAHashMap &operator=(const OAHashMap &) = delete; // Same for assignment operator.
+
OAHashMap(uint32_t p_initial_capacity = 64) {
capacity = p_initial_capacity;
@@ -312,7 +352,7 @@ public:
hashes = memnew_arr(uint32_t, p_initial_capacity);
for (uint32_t i = 0; i < p_initial_capacity; i++) {
- hashes[i] = 0;
+ hashes[i] = EMPTY_HASH;
}
}
diff --git a/core/object.cpp b/core/object.cpp
index 3367d6b6c3..62bfa31480 100644
--- a/core/object.cpp
+++ b/core/object.cpp
@@ -709,20 +709,17 @@ static void _test_call_error(const StringName &p_func, const Variant::CallError
break;
case Variant::CallError::CALL_ERROR_INVALID_ARGUMENT: {
- ERR_EXPLAIN("Error Calling Function: " + String(p_func) + " - Invalid type for argument " + itos(error.argument) + ", expected " + Variant::get_type_name(error.expected));
- ERR_FAIL();
+ ERR_FAIL_MSG("Error calling function: " + String(p_func) + " - Invalid type for argument " + itos(error.argument) + ", expected " + Variant::get_type_name(error.expected) + ".");
break;
}
case Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS: {
- ERR_EXPLAIN("Error Calling Function: " + String(p_func) + " - Too many arguments, expected " + itos(error.argument));
- ERR_FAIL();
+ ERR_FAIL_MSG("Error calling function: " + String(p_func) + " - Too many arguments, expected " + itos(error.argument) + ".");
break;
}
case Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS: {
- ERR_EXPLAIN("Error Calling Function: " + String(p_func) + " - Too few arguments, expected " + itos(error.argument));
- ERR_FAIL();
+ ERR_FAIL_MSG("Error calling function: " + String(p_func) + " - Too few arguments, expected " + itos(error.argument) + ".");
break;
}
case Variant::CallError::CALL_ERROR_INSTANCE_IS_NULL:
@@ -739,15 +736,9 @@ void Object::call_multilevel(const StringName &p_method, const Variant **p_args,
if (p_method == CoreStringNames::get_singleton()->_free) {
#ifdef DEBUG_ENABLED
- if (Object::cast_to<Reference>(this)) {
- ERR_EXPLAIN("Can't 'free' a reference.");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(Object::cast_to<Reference>(this), "Can't 'free' a reference.");
- if (_lock_index.get() > 1) {
- ERR_EXPLAIN("Object is locked and can't be freed.");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(_lock_index.get() > 1, "Object is locked and can't be freed.");
#endif
//must be here, must be before everything,
@@ -835,8 +826,7 @@ Variant Object::callv(const StringName &p_method, const Array &p_args) {
Variant::CallError ce;
Variant ret = call(p_method, argptrs, p_args.size(), ce);
if (ce.error != Variant::CallError::CALL_OK) {
- ERR_EXPLAIN("Error calling method from 'callv': " + Variant::get_call_error_text(this, p_method, argptrs, p_args.size(), ce));
- ERR_FAIL_V(Variant());
+ ERR_FAIL_V_MSG(Variant(), "Error calling method from 'callv': " + Variant::get_call_error_text(this, p_method, argptrs, p_args.size(), ce) + ".");
}
return ret;
}
@@ -888,15 +878,13 @@ Variant Object::call(const StringName &p_method, const Variant **p_args, int p_a
if (Object::cast_to<Reference>(this)) {
r_error.argument = 0;
r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD;
- ERR_EXPLAIN("Can't 'free' a reference.");
- ERR_FAIL_V(Variant());
+ ERR_FAIL_V_MSG(Variant(), "Can't 'free' a reference.");
}
if (_lock_index.get() > 1) {
r_error.argument = 0;
r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD;
- ERR_EXPLAIN("Object is locked and can't be freed.");
- ERR_FAIL_V(Variant());
+ ERR_FAIL_V_MSG(Variant(), "Object is locked and can't be freed.");
}
#endif
@@ -1172,10 +1160,7 @@ Error Object::emit_signal(const StringName &p_name, const Variant **p_args, int
#ifdef DEBUG_ENABLED
bool signal_is_valid = ClassDB::has_signal(get_class_name(), p_name);
//check in script
- if (!signal_is_valid && !script.is_null() && !Ref<Script>(script)->has_script_signal(p_name)) {
- ERR_EXPLAIN("Can't emit non-existing signal " + String("\"") + p_name + "\".");
- ERR_FAIL_V(ERR_UNAVAILABLE);
- }
+ ERR_FAIL_COND_V_MSG(!signal_is_valid && !script.is_null() && !Ref<Script>(script)->has_script_signal(p_name), ERR_UNAVAILABLE, "Can't emit non-existing signal " + String("\"") + p_name + "\".");
#endif
//not connected? just return
return ERR_UNAVAILABLE;
@@ -1240,7 +1225,7 @@ Error Object::emit_signal(const StringName &p_name, const Variant **p_args, int
if (ce.error == Variant::CallError::CALL_ERROR_INVALID_METHOD && !ClassDB::class_exists(target->get_class_name())) {
//most likely object is not initialized yet, do not throw error.
} else {
- ERR_PRINTS("Error calling method from signal '" + String(p_name) + "': " + Variant::get_call_error_text(target, c.method, args, argc, ce));
+ ERR_PRINTS("Error calling method from signal '" + String(p_name) + "': " + Variant::get_call_error_text(target, c.method, args, argc, ce) + ".");
err = ERR_METHOD_NOT_FOUND;
}
}
@@ -1415,8 +1400,9 @@ void Object::get_signal_connection_list(const StringName &p_signal, List<Connect
p_connections->push_back(s->slot_map.getv(i).conn);
}
-bool Object::has_persistent_signal_connections() const {
+int Object::get_persistent_signal_connection_count() const {
+ int count = 0;
const StringName *S = NULL;
while ((S = signal_map.next(S))) {
@@ -1424,13 +1410,13 @@ bool Object::has_persistent_signal_connections() const {
const Signal *s = &signal_map[*S];
for (int i = 0; i < s->slot_map.size(); i++) {
-
- if (s->slot_map.getv(i).conn.flags & CONNECT_PERSIST)
- return true;
+ if (s->slot_map.getv(i).conn.flags & CONNECT_PERSIST) {
+ count += 1;
+ }
}
}
- return false;
+ return count;
}
void Object::get_signals_connected_to_this(List<Connection> *p_connections) const {
@@ -1463,10 +1449,8 @@ Error Object::connect(const StringName &p_signal, Object *p_to_object, const Str
#endif
}
- if (!signal_is_valid) {
- ERR_EXPLAIN("In Object of type '" + String(get_class()) + "': Attempt to connect nonexistent signal '" + p_signal + "' to method '" + p_to_object->get_class() + "." + p_to_method + "'");
- ERR_FAIL_V(ERR_INVALID_PARAMETER);
- }
+ ERR_FAIL_COND_V_MSG(!signal_is_valid, ERR_INVALID_PARAMETER, "In Object of type '" + String(get_class()) + "': Attempt to connect nonexistent signal '" + p_signal + "' to method '" + p_to_object->get_class() + "." + p_to_method + "'.");
+
signal_map[p_signal] = Signal();
s = &signal_map[p_signal];
}
@@ -1477,8 +1461,7 @@ Error Object::connect(const StringName &p_signal, Object *p_to_object, const Str
s->slot_map[target].reference_count++;
return OK;
} else {
- ERR_EXPLAIN("Signal '" + p_signal + "' is already connected to given method '" + p_to_method + "' in that object.");
- ERR_FAIL_V(ERR_INVALID_PARAMETER);
+ ERR_FAIL_V_MSG(ERR_INVALID_PARAMETER, "Signal '" + p_signal + "' is already connected to given method '" + p_to_method + "' in that object.");
}
}
@@ -1514,8 +1497,7 @@ bool Object::is_connected(const StringName &p_signal, Object *p_to_object, const
if (!script.is_null() && Ref<Script>(script)->has_script_signal(p_signal))
return false;
- ERR_EXPLAIN("Nonexistent signal: " + p_signal);
- ERR_FAIL_V(false);
+ ERR_FAIL_V_MSG(false, "Nonexistent signal: " + p_signal + ".");
}
Signal::Target target(p_to_object->get_instance_id(), p_to_method);
@@ -1533,21 +1515,13 @@ void Object::_disconnect(const StringName &p_signal, Object *p_to_object, const
ERR_FAIL_NULL(p_to_object);
Signal *s = signal_map.getptr(p_signal);
- if (!s) {
- ERR_EXPLAIN("Nonexistent signal: " + p_signal);
- ERR_FAIL();
- }
- if (s->lock > 0) {
- ERR_EXPLAIN("Attempt to disconnect signal '" + p_signal + "' while emitting (locks: " + itos(s->lock) + ")");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(!s, "Nonexistent signal: " + p_signal + ".");
+
+ ERR_FAIL_COND_MSG(s->lock > 0, "Attempt to disconnect signal '" + p_signal + "' while emitting (locks: " + itos(s->lock) + ").");
Signal::Target target(p_to_object->get_instance_id(), p_to_method);
- if (!s->slot_map.has(target)) {
- ERR_EXPLAIN("Disconnecting nonexistent signal '" + p_signal + "', slot: " + itos(target._id) + ":" + target.method);
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(!s->slot_map.has(target), "Disconnecting nonexistent signal '" + p_signal + "', slot: " + itos(target._id) + ":" + target.method + ".");
Signal::Slot *slot = &s->slot_map[target];
@@ -1974,10 +1948,7 @@ Object::~Object() {
Signal *s = &signal_map[*S];
- if (s->lock) {
- ERR_EXPLAIN("Attempt to delete an object in the middle of a signal emission from it");
- ERR_CONTINUE(s->lock > 0);
- }
+ ERR_CONTINUE_MSG(s->lock > 0, "Attempt to delete an object in the middle of a signal emission from it.");
//brute force disconnect for performance
int slot_count = s->slot_map.size();
diff --git a/core/object.h b/core/object.h
index 15c3ab94c5..ac8620757c 100644
--- a/core/object.h
+++ b/core/object.h
@@ -707,7 +707,7 @@ public:
void get_signal_list(List<MethodInfo> *p_signals) const;
void get_signal_connection_list(const StringName &p_signal, List<Connection> *p_connections) const;
void get_all_signal_connections(List<Connection> *p_connections) const;
- bool has_persistent_signal_connections() const;
+ int get_persistent_signal_connection_count() const;
void get_signals_connected_to_this(List<Connection> *p_connections) const;
Error connect(const StringName &p_signal, Object *p_to_object, const StringName &p_to_method, const Vector<Variant> &p_binds = Vector<Variant>(), uint32_t p_flags = 0);
diff --git a/core/os/dir_access.h b/core/os/dir_access.h
index 3c0528112b..d3eb1e13f6 100644
--- a/core/os/dir_access.h
+++ b/core/os/dir_access.h
@@ -34,10 +34,6 @@
#include "core/typedefs.h"
#include "core/ustring.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
//@ TODO, excellent candidate for THREAD_SAFE MACRO, should go through all these and add THREAD_SAFE where it applies
class DirAccess {
public:
diff --git a/core/os/file_access.cpp b/core/os/file_access.cpp
index 7509050b2b..9a8315a3bb 100644
--- a/core/os/file_access.cpp
+++ b/core/os/file_access.cpp
@@ -30,9 +30,9 @@
#include "file_access.h"
+#include "core/crypto/crypto_core.h"
#include "core/io/file_access_pack.h"
#include "core/io/marshalls.h"
-#include "core/math/crypto_core.h"
#include "core/os/os.h"
#include "core/project_settings.h"
@@ -599,8 +599,7 @@ Vector<uint8_t> FileAccess::get_file_as_array(const String &p_path, Error *r_err
if (r_error) { // if error requested, do not throw error
return Vector<uint8_t>();
}
- ERR_EXPLAIN("Can't open file from path: " + String(p_path));
- ERR_FAIL_V(Vector<uint8_t>());
+ ERR_FAIL_V_MSG(Vector<uint8_t>(), "Can't open file from path: " + String(p_path) + ".");
}
Vector<uint8_t> data;
data.resize(f->get_len());
@@ -620,8 +619,7 @@ String FileAccess::get_file_as_string(const String &p_path, Error *r_error) {
if (r_error) {
return String();
}
- ERR_EXPLAIN("Can't get file as string from path: " + String(p_path));
- ERR_FAIL_V(String());
+ ERR_FAIL_V_MSG(String(), "Can't get file as string from path: " + String(p_path) + ".");
}
String ret;
diff --git a/core/os/input.cpp b/core/os/input.cpp
index f04d4a1b3e..51cb41b184 100644
--- a/core/os/input.cpp
+++ b/core/os/input.cpp
@@ -80,6 +80,7 @@ void Input::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_joy_axis_index_from_string", "axis"), &Input::get_joy_axis_index_from_string);
ClassDB::bind_method(D_METHOD("start_joy_vibration", "device", "weak_magnitude", "strong_magnitude", "duration"), &Input::start_joy_vibration, DEFVAL(0));
ClassDB::bind_method(D_METHOD("stop_joy_vibration", "device"), &Input::stop_joy_vibration);
+ ClassDB::bind_method(D_METHOD("vibrate_handheld", "duration_ms"), &Input::vibrate_handheld, DEFVAL(500));
ClassDB::bind_method(D_METHOD("get_gravity"), &Input::get_gravity);
ClassDB::bind_method(D_METHOD("get_accelerometer"), &Input::get_accelerometer);
ClassDB::bind_method(D_METHOD("get_magnetometer"), &Input::get_magnetometer);
diff --git a/core/os/input.h b/core/os/input.h
index de04f239e6..a12ded176b 100644
--- a/core/os/input.h
+++ b/core/os/input.h
@@ -100,6 +100,7 @@ public:
virtual uint64_t get_joy_vibration_timestamp(int p_device) = 0;
virtual void start_joy_vibration(int p_device, float p_weak_magnitude, float p_strong_magnitude, float p_duration = 0) = 0;
virtual void stop_joy_vibration(int p_device) = 0;
+ virtual void vibrate_handheld(int p_duration_ms = 500) = 0;
virtual Point2 get_mouse_position() const = 0;
virtual Point2 get_last_mouse_speed() const = 0;
diff --git a/core/os/input_event.cpp b/core/os/input_event.cpp
index a40a50cfce..30fca0c155 100644
--- a/core/os/input_event.cpp
+++ b/core/os/input_event.cpp
@@ -450,7 +450,7 @@ bool InputEventMouseButton::is_doubleclick() const {
Ref<InputEvent> InputEventMouseButton::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const {
- Vector2 g = p_xform.xform(get_global_position());
+ Vector2 g = get_global_position();
Vector2 l = p_xform.xform(get_position() + p_local_ofs);
Ref<InputEventMouseButton> mb;
@@ -577,7 +577,7 @@ Vector2 InputEventMouseMotion::get_speed() const {
Ref<InputEvent> InputEventMouseMotion::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const {
- Vector2 g = p_xform.xform(get_global_position());
+ Vector2 g = get_global_position();
Vector2 l = p_xform.xform(get_position() + p_local_ofs);
Vector2 r = p_xform.basis_xform(get_relative());
Vector2 s = p_xform.basis_xform(get_speed());
diff --git a/core/os/input_event.h b/core/os/input_event.h
index 4f5762e756..28658e3865 100644
--- a/core/os/input_event.h
+++ b/core/os/input_event.h
@@ -38,10 +38,6 @@
#include "core/ustring.h"
/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
-/**
* Input Event classes. These are used in the main loop.
* The events are pretty obvious.
*/
diff --git a/core/os/keyboard.h b/core/os/keyboard.h
index 58a0807579..5c8a2e90e9 100644
--- a/core/os/keyboard.h
+++ b/core/os/keyboard.h
@@ -33,10 +33,6 @@
#include "core/ustring.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
/*
Special Key:
diff --git a/core/os/main_loop.cpp b/core/os/main_loop.cpp
index 9946ced2f3..eca3b2a7f4 100644
--- a/core/os/main_loop.cpp
+++ b/core/os/main_loop.cpp
@@ -49,6 +49,8 @@ void MainLoop::_bind_methods() {
BIND_VMETHOD(MethodInfo("_drop_files", PropertyInfo(Variant::POOL_STRING_ARRAY, "files"), PropertyInfo(Variant::INT, "from_screen")));
BIND_VMETHOD(MethodInfo("_finalize"));
+ BIND_VMETHOD(MethodInfo("_global_menu_action", PropertyInfo(Variant::NIL, "id"), PropertyInfo(Variant::NIL, "meta")));
+
BIND_CONSTANT(NOTIFICATION_WM_MOUSE_ENTER);
BIND_CONSTANT(NOTIFICATION_WM_MOUSE_EXIT);
BIND_CONSTANT(NOTIFICATION_WM_FOCUS_IN);
@@ -115,6 +117,12 @@ void MainLoop::drop_files(const Vector<String> &p_files, int p_from_screen) {
get_script_instance()->call("_drop_files", p_files, p_from_screen);
}
+void MainLoop::global_menu_action(const Variant &p_id, const Variant &p_meta) {
+
+ if (get_script_instance())
+ get_script_instance()->call("_global_menu_action", p_id, p_meta);
+}
+
void MainLoop::finish() {
if (get_script_instance()) {
diff --git a/core/os/main_loop.h b/core/os/main_loop.h
index ad734d3fc8..54e61fd2fa 100644
--- a/core/os/main_loop.h
+++ b/core/os/main_loop.h
@@ -35,10 +35,6 @@
#include "core/reference.h"
#include "core/script_language.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class MainLoop : public Object {
GDCLASS(MainLoop, Object);
@@ -75,6 +71,7 @@ public:
virtual void finish();
virtual void drop_files(const Vector<String> &p_files, int p_from_screen = 0);
+ virtual void global_menu_action(const Variant &p_id, const Variant &p_meta);
void set_init_script(const Ref<Script> &p_init_script);
diff --git a/core/os/memory.h b/core/os/memory.h
index e073b11e76..8778cb63ad 100644
--- a/core/os/memory.h
+++ b/core/os/memory.h
@@ -35,10 +35,6 @@
#include <stddef.h>
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
#ifndef PAD_ALIGN
#define PAD_ALIGN 16 //must always be greater than this at much
#endif
diff --git a/core/os/os.cpp b/core/os/os.cpp
index 925154af7d..7531900480 100644
--- a/core/os/os.cpp
+++ b/core/os/os.cpp
@@ -186,6 +186,11 @@ int OS::get_process_id() const {
return -1;
};
+void OS::vibrate_handheld(int p_duration_ms) {
+
+ WARN_PRINTS("vibrate_handheld() only works with Android and iOS");
+}
+
bool OS::is_stdout_verbose() const {
return _verbose_stdout;
@@ -268,8 +273,7 @@ void OS::print_all_resources(String p_to_file) {
_OSPRF = FileAccess::open(p_to_file, FileAccess::WRITE, &err);
if (err != OK) {
_OSPRF = NULL;
- ERR_EXPLAIN("Can't print all resources to file: " + String(p_to_file));
- ERR_FAIL();
+ ERR_FAIL_MSG("Can't print all resources to file: " + String(p_to_file) + ".");
}
}
@@ -487,10 +491,7 @@ void OS::_ensure_user_data_dir() {
da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
Error err = da->make_dir_recursive(dd);
- if (err != OK) {
- ERR_EXPLAIN("Error attempting to create data dir: " + dd);
- }
- ERR_FAIL_COND(err != OK);
+ ERR_FAIL_COND_MSG(err != OK, "Error attempting to create data dir: " + dd + ".");
memdelete(da);
}
diff --git a/core/os/os.h b/core/os/os.h
index 2224d3b006..9b46b43081 100644
--- a/core/os/os.h
+++ b/core/os/os.h
@@ -41,10 +41,6 @@
#include <stdarg.h>
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class Mutex;
class OS {
@@ -147,6 +143,11 @@ public:
static OS *get_singleton();
+ virtual void global_menu_add_item(const String &p_menu, const String &p_label, const Variant &p_signal, const Variant &p_meta){};
+ virtual void global_menu_add_separator(const String &p_menu){};
+ virtual void global_menu_remove_item(const String &p_menu, int p_idx){};
+ virtual void global_menu_clear(const String &p_menu){};
+
void print_error(const char *p_function, const char *p_file, int p_line, const char *p_code, const char *p_rationale, Logger::ErrorType p_type = Logger::ERR_ERROR);
void print(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_2_3;
void printerr(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_2_3;
@@ -269,6 +270,7 @@ public:
virtual Error execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id = NULL, String *r_pipe = NULL, int *r_exitcode = NULL, bool read_stderr = false, Mutex *p_pipe_mutex = NULL) = 0;
virtual Error kill(const ProcessID &p_pid) = 0;
virtual int get_process_id() const;
+ virtual void vibrate_handheld(int p_duration_ms = 500);
virtual Error shell_open(String p_uri);
virtual Error set_cwd(const String &p_cwd);
diff --git a/core/os/semaphore.h b/core/os/semaphore.h
index ccbba0dacd..a0862dce84 100644
--- a/core/os/semaphore.h
+++ b/core/os/semaphore.h
@@ -33,10 +33,6 @@
#include "core/error_list.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class Semaphore {
protected:
static Semaphore *(*create_func)();
diff --git a/core/os/thread.h b/core/os/thread.h
index e7a6e8cb1f..169280a208 100644
--- a/core/os/thread.h
+++ b/core/os/thread.h
@@ -34,10 +34,6 @@
#include "core/typedefs.h"
#include "core/ustring.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
typedef void (*ThreadCreateCallback)(void *p_userdata);
class Thread {
diff --git a/core/pool_allocator.cpp b/core/pool_allocator.cpp
index 48a30f6702..6c1f2756f2 100644
--- a/core/pool_allocator.cpp
+++ b/core/pool_allocator.cpp
@@ -204,10 +204,8 @@ PoolAllocator::ID PoolAllocator::alloc(int p_size) {
/* Then search again */
if (!find_hole(&new_entry_indices_pos, size_to_alloc)) {
-
mt_unlock();
- ERR_EXPLAIN("Memory can't be compacted further");
- ERR_FAIL_V(POOL_ALLOCATOR_INVALID_ID);
+ ERR_FAIL_V_MSG(POOL_ALLOCATOR_INVALID_ID, "Memory can't be compacted further.");
}
}
@@ -217,8 +215,7 @@ PoolAllocator::ID PoolAllocator::alloc(int p_size) {
if (!found_free_entry) {
mt_unlock();
- ERR_EXPLAIN("No free entry found in PoolAllocator");
- ERR_FAIL_V(POOL_ALLOCATOR_INVALID_ID);
+ ERR_FAIL_V_MSG(POOL_ALLOCATOR_INVALID_ID, "No free entry found in PoolAllocator.");
}
/* move all entry indices up, make room for this one */
diff --git a/core/pool_vector.cpp b/core/pool_vector.cpp
index b9d2316315..50ea898bef 100644
--- a/core/pool_vector.cpp
+++ b/core/pool_vector.cpp
@@ -66,6 +66,5 @@ void MemoryPool::cleanup() {
memdelete_arr(allocs);
memdelete(alloc_mutex);
- ERR_EXPLAINC("There are still MemoryPool allocs in use at exit!");
- ERR_FAIL_COND(allocs_used > 0);
+ ERR_FAIL_COND_MSG(allocs_used > 0, "There are still MemoryPool allocs in use at exit!");
}
diff --git a/core/pool_vector.h b/core/pool_vector.h
index 3d28d86803..957a72483c 100644
--- a/core/pool_vector.h
+++ b/core/pool_vector.h
@@ -77,10 +77,6 @@ struct MemoryPool {
static void cleanup();
};
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
template <class T>
class PoolVector {
@@ -102,8 +98,7 @@ class PoolVector {
MemoryPool::alloc_mutex->lock();
if (MemoryPool::allocs_used == MemoryPool::alloc_count) {
MemoryPool::alloc_mutex->unlock();
- ERR_EXPLAINC("All memory pool allocations are in use, can't COW.");
- ERR_FAIL();
+ ERR_FAIL_MSG("All memory pool allocations are in use, can't COW.");
}
MemoryPool::Alloc *old_alloc = alloc;
@@ -524,8 +519,7 @@ Error PoolVector<T>::resize(int p_size) {
MemoryPool::alloc_mutex->lock();
if (MemoryPool::allocs_used == MemoryPool::alloc_count) {
MemoryPool::alloc_mutex->unlock();
- ERR_EXPLAINC("All memory pool allocations are in use.");
- ERR_FAIL_V(ERR_OUT_OF_MEMORY);
+ ERR_FAIL_V_MSG(ERR_OUT_OF_MEMORY, "All memory pool allocations are in use.");
}
//take one from the free list
diff --git a/core/project_settings.cpp b/core/project_settings.cpp
index c1d4967f55..ec2c5ecbb3 100644
--- a/core/project_settings.cpp
+++ b/core/project_settings.cpp
@@ -500,8 +500,7 @@ Error ProjectSettings::_load_settings_binary(const String &p_path) {
if (hdr[0] != 'E' || hdr[1] != 'C' || hdr[2] != 'F' || hdr[3] != 'G') {
memdelete(f);
- ERR_EXPLAIN("Corrupted header in binary project.binary (not ECFG)");
- ERR_FAIL_V(ERR_FILE_CORRUPT);
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Corrupted header in binary project.binary (not ECFG).");
}
uint32_t count = f->get_32();
@@ -522,8 +521,7 @@ Error ProjectSettings::_load_settings_binary(const String &p_path) {
f->get_buffer(d.ptrw(), vlen);
Variant value;
err = decode_variant(value, d.ptr(), d.size(), NULL, true);
- ERR_EXPLAIN("Error decoding property: " + key);
- ERR_CONTINUE(err != OK);
+ ERR_CONTINUE_MSG(err != OK, "Error decoding property: " + key + ".");
set(key, value);
}
@@ -577,8 +575,7 @@ Error ProjectSettings::_load_settings_text(const String &p_path) {
config_version = value;
if (config_version > CONFIG_VERSION) {
memdelete(f);
- ERR_EXPLAIN(vformat("Can't open project at '%s', its `config_version` (%d) is from a more recent and incompatible version of the engine. Expected config version: %d.", p_path, config_version, CONFIG_VERSION));
- ERR_FAIL_V(ERR_FILE_CANT_OPEN);
+ ERR_FAIL_V_MSG(ERR_FILE_CANT_OPEN, vformat("Can't open project at '%s', its `config_version` (%d) is from a more recent and incompatible version of the engine. Expected config version: %d.", p_path, config_version, CONFIG_VERSION));
}
} else {
if (section == String()) {
@@ -645,11 +642,7 @@ Error ProjectSettings::_save_settings_binary(const String &p_file, const Map<Str
Error err;
FileAccess *file = FileAccess::open(p_file, FileAccess::WRITE, &err);
- if (err != OK) {
-
- ERR_EXPLAIN("Couldn't save project.binary at " + p_file);
- ERR_FAIL_COND_V(err, err);
- }
+ ERR_FAIL_COND_V_MSG(err != OK, err, "Couldn't save project.binary at " + p_file + ".");
uint8_t hdr[4] = { 'E', 'C', 'F', 'G' };
file->store_buffer(hdr, 4);
@@ -738,10 +731,7 @@ Error ProjectSettings::_save_settings_text(const String &p_file, const Map<Strin
Error err;
FileAccess *file = FileAccess::open(p_file, FileAccess::WRITE, &err);
- if (err) {
- ERR_EXPLAIN("Couldn't save project.godot - " + p_file);
- ERR_FAIL_COND_V(err, err);
- }
+ ERR_FAIL_COND_V_MSG(err != OK, err, "Couldn't save project.godot - " + p_file + ".");
file->store_line("; Engine configuration file.");
file->store_line("; It's best edited using the editor UI and not directly,");
@@ -872,8 +862,7 @@ Error ProjectSettings::save_custom(const String &p_path, const CustomMap &p_cust
return _save_settings_binary(p_path, props, p_custom, custom_features);
else {
- ERR_EXPLAIN("Unknown config file format: " + p_path);
- ERR_FAIL_V(ERR_FILE_UNRECOGNIZED);
+ ERR_FAIL_V_MSG(ERR_FILE_UNRECOGNIZED, "Unknown config file format: " + p_path + ".");
}
}
@@ -1011,6 +1000,8 @@ ProjectSettings::ProjectSettings() {
Ref<InputEventJoypadButton> joyb;
GLOBAL_DEF("application/config/name", "");
+ GLOBAL_DEF("application/config/description", "");
+ custom_prop_info["application/config/description"] = PropertyInfo(Variant::STRING, "application/config/description", PROPERTY_HINT_MULTILINE_TEXT);
GLOBAL_DEF("application/run/main_scene", "");
custom_prop_info["application/run/main_scene"] = PropertyInfo(Variant::STRING, "application/run/main_scene", PROPERTY_HINT_FILE, "*.tscn,*.scn,*.res");
GLOBAL_DEF("application/run/disable_stdout", false);
@@ -1030,6 +1021,9 @@ ProjectSettings::ProjectSettings() {
GLOBAL_DEF("editor/search_in_file_extensions", extensions);
custom_prop_info["editor/search_in_file_extensions"] = PropertyInfo(Variant::POOL_STRING_ARRAY, "editor/search_in_file_extensions");
+ GLOBAL_DEF("editor/script_templates_search_path", "res://script_templates");
+ custom_prop_info["editor/script_templates_search_path"] = PropertyInfo(Variant::STRING, "editor/script_templates_search_path", PROPERTY_HINT_DIR);
+
action = Dictionary();
action["deadzone"] = Variant(0.5f);
events = Array();
diff --git a/core/project_settings.h b/core/project_settings.h
index d7651417d5..a8deab028c 100644
--- a/core/project_settings.h
+++ b/core/project_settings.h
@@ -35,10 +35,6 @@
#include "core/os/thread_safe.h"
#include "core/set.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class ProjectSettings : public Object {
GDCLASS(ProjectSettings, Object);
diff --git a/core/reference.h b/core/reference.h
index 8a19f846c7..20ee22ddfc 100644
--- a/core/reference.h
+++ b/core/reference.h
@@ -36,9 +36,6 @@
#include "core/ref_ptr.h"
#include "core/safe_refcount.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class Reference : public Object {
GDCLASS(Reference, Object);
diff --git a/core/register_core_types.cpp b/core/register_core_types.cpp
index e442546124..efc77bde48 100644
--- a/core/register_core_types.cpp
+++ b/core/register_core_types.cpp
@@ -34,6 +34,8 @@
#include "core/class_db.h"
#include "core/compressed_translation.h"
#include "core/core_string_names.h"
+#include "core/crypto/crypto.h"
+#include "core/crypto/hashing_context.h"
#include "core/engine.h"
#include "core/func_ref.h"
#include "core/input_map.h"
@@ -70,6 +72,8 @@ static Ref<ResourceFormatLoaderBinary> resource_loader_binary;
static Ref<ResourceFormatImporter> resource_format_importer;
static Ref<ResourceFormatLoaderImage> resource_format_image;
static Ref<TranslationLoaderPO> resource_format_po;
+static Ref<ResourceFormatSaverCrypto> resource_format_saver_crypto;
+static Ref<ResourceFormatLoaderCrypto> resource_format_loader_crypto;
static _ResourceLoader *_resource_loader = NULL;
static _ResourceSaver *_resource_saver = NULL;
@@ -151,7 +155,19 @@ void register_core_types() {
ClassDB::register_class<StreamPeerTCP>();
ClassDB::register_class<TCP_Server>();
ClassDB::register_class<PacketPeerUDP>();
+
+ // Crypto
+ ClassDB::register_class<HashingContext>();
+ ClassDB::register_custom_instance_class<X509Certificate>();
+ ClassDB::register_custom_instance_class<CryptoKey>();
+ ClassDB::register_custom_instance_class<Crypto>();
ClassDB::register_custom_instance_class<StreamPeerSSL>();
+
+ resource_format_saver_crypto.instance();
+ ResourceSaver::add_resource_format_saver(resource_format_saver_crypto);
+ resource_format_loader_crypto.instance();
+ ResourceLoader::add_resource_format_loader(resource_format_loader_crypto);
+
ClassDB::register_virtual_class<IP>();
ClassDB::register_virtual_class<PacketPeer>();
ClassDB::register_class<PacketPeerStream>();
@@ -211,6 +227,9 @@ void register_core_settings() {
ProjectSettings::get_singleton()->set_custom_property_info("network/limits/tcp/connect_timeout_seconds", PropertyInfo(Variant::INT, "network/limits/tcp/connect_timeout_seconds", PROPERTY_HINT_RANGE, "1,1800,1"));
GLOBAL_DEF_RST("network/limits/packet_peer_stream/max_buffer_po2", (16));
ProjectSettings::get_singleton()->set_custom_property_info("network/limits/packet_peer_stream/max_buffer_po2", PropertyInfo(Variant::INT, "network/limits/packet_peer_stream/max_buffer_po2", PROPERTY_HINT_RANGE, "0,64,1,or_greater"));
+
+ GLOBAL_DEF("network/ssl/certificates", "");
+ ProjectSettings::get_singleton()->set_custom_property_info("network/ssl/certificates", PropertyInfo(Variant::STRING, "network/ssl/certificates", PROPERTY_HINT_FILE, "*.crt"));
}
void register_core_singletons() {
@@ -272,6 +291,11 @@ void unregister_core_types() {
ResourceLoader::remove_resource_format_loader(resource_format_po);
resource_format_po.unref();
+ ResourceSaver::remove_resource_format_saver(resource_format_saver_crypto);
+ resource_format_saver_crypto.unref();
+ ResourceLoader::remove_resource_format_loader(resource_format_loader_crypto);
+ resource_format_loader_crypto.unref();
+
if (ip)
memdelete(ip);
diff --git a/core/register_core_types.h b/core/register_core_types.h
index b5a6aa985b..2d397b55f9 100644
--- a/core/register_core_types.h
+++ b/core/register_core_types.h
@@ -31,10 +31,6 @@
#ifndef REGISTER_CORE_TYPES_H
#define REGISTER_CORE_TYPES_H
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
void register_core_types();
void register_core_settings();
void register_core_singletons();
diff --git a/core/resource.cpp b/core/resource.cpp
index 74e2c1ed6b..5a5efa4644 100644
--- a/core/resource.cpp
+++ b/core/resource.cpp
@@ -75,8 +75,7 @@ void Resource::set_path(const String &p_path, bool p_take_over) {
bool exists = ResourceCache::resources.has(p_path);
ResourceCache::lock->read_unlock();
- ERR_EXPLAIN("Another resource is loaded from path: " + p_path + " (possible cyclic resource inclusion)");
- ERR_FAIL_COND(exists);
+ ERR_FAIL_COND_MSG(exists, "Another resource is loaded from path: " + p_path + " (possible cyclic resource inclusion).");
}
}
path_cache = p_path;
@@ -277,8 +276,7 @@ void Resource::notify_change_to_owners() {
for (Set<ObjectID>::Element *E = owners.front(); E; E = E->next()) {
Object *obj = ObjectDB::get_instance(E->get());
- ERR_EXPLAIN("Object was deleted, while still owning a resource");
- ERR_CONTINUE(!obj); //wtf
+ ERR_CONTINUE_MSG(!obj, "Object was deleted, while still owning a resource."); //wtf
//TODO store string
obj->call("resource_changed", RES(this));
}
@@ -427,7 +425,7 @@ Resource::~Resource() {
ResourceCache::lock->write_unlock();
}
if (owners.size()) {
- WARN_PRINT("Resource is still owned");
+ WARN_PRINT("Resource is still owned.");
}
}
diff --git a/core/resource.h b/core/resource.h
index 853b2859c7..038b4f6278 100644
--- a/core/resource.h
+++ b/core/resource.h
@@ -38,10 +38,6 @@
#include "core/safe_refcount.h"
#include "core/self_list.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
#define RES_BASE_EXTENSION(m_ext) \
public: \
static void register_custom_data_to_otdb() { ClassDB::add_resource_base_extension(m_ext, get_class_static()); } \
diff --git a/core/rid.h b/core/rid.h
index c7a71a03a0..381eee645b 100644
--- a/core/rid.h
+++ b/core/rid.h
@@ -37,10 +37,6 @@
#include "core/set.h"
#include "core/typedefs.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class RID_OwnerBase;
class RID_Data {
diff --git a/core/script_debugger_remote.cpp b/core/script_debugger_remote.cpp
index 6dd9054aaa..2a061f0947 100644
--- a/core/script_debugger_remote.cpp
+++ b/core/script_debugger_remote.cpp
@@ -89,7 +89,7 @@ Error ScriptDebuggerRemote::connect_to_host(const String &p_host, uint16_t p_por
if (tcp_client->get_status() != StreamPeerTCP::STATUS_CONNECTED) {
- ERR_PRINTS("Remote Debugger: Unable to connect. Status: " + String::num(tcp_client->get_status()));
+ ERR_PRINTS("Remote Debugger: Unable to connect. Status: " + String::num(tcp_client->get_status()) + ".");
return FAILED;
};
@@ -110,7 +110,7 @@ void ScriptDebuggerRemote::_put_variable(const String &p_name, const Variant &p_
int len = 0;
Error err = encode_variant(var, NULL, len, true);
if (err != OK)
- ERR_PRINT("Failed to encode variant");
+ ERR_PRINT("Failed to encode variant.");
if (len > packet_peer_stream->get_output_buffer_max_size()) { //limit to max size
packet_peer_stream->put_var(Variant());
@@ -134,10 +134,7 @@ void ScriptDebuggerRemote::debug(ScriptLanguage *p_script, bool p_can_continue)
//this function is called when there is a debugger break (bug on script)
//or when execution is paused from editor
- if (!tcp_client->is_connected_to_host()) {
- ERR_EXPLAIN("Script Debugger failed to connect, but being used anyway.");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(!tcp_client->is_connected_to_host(), "Script Debugger failed to connect, but being used anyway.");
packet_peer_stream->put_var("debug_enter");
packet_peer_stream->put_var(2);
diff --git a/core/script_language.h b/core/script_language.h
index 87f103bb33..dfb2e0ad31 100644
--- a/core/script_language.h
+++ b/core/script_language.h
@@ -36,10 +36,6 @@
#include "core/pair.h"
#include "core/resource.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class ScriptLanguage;
typedef void (*ScriptEditRequestFunction)(const String &p_path);
diff --git a/core/set.h b/core/set.h
index b2c717880d..68431c294a 100644
--- a/core/set.h
+++ b/core/set.h
@@ -34,10 +34,6 @@
#include "core/os/memory.h"
#include "core/typedefs.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
// based on the very nice implementation of rb-trees by:
// https://web.archive.org/web/20120507164830/http://web.mit.edu/~emin/www/source_code/red_black_tree/index.html
diff --git a/core/string_name.h b/core/string_name.h
index 0984b0181f..6dd960abd5 100644
--- a/core/string_name.h
+++ b/core/string_name.h
@@ -34,9 +34,6 @@
#include "core/os/mutex.h"
#include "core/safe_refcount.h"
#include "core/ustring.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
struct StaticCString {
diff --git a/core/translation.cpp b/core/translation.cpp
index a3ff971f45..a0902d71fc 100644
--- a/core/translation.cpp
+++ b/core/translation.cpp
@@ -848,8 +848,7 @@ void Translation::set_locale(const String &p_locale) {
if (!TranslationServer::is_locale_valid(univ_locale)) {
String trimmed_locale = get_trimmed_locale(univ_locale);
- ERR_EXPLAIN("Invalid locale: " + trimmed_locale);
- ERR_FAIL_COND(!TranslationServer::is_locale_valid(trimmed_locale));
+ ERR_FAIL_COND_MSG(!TranslationServer::is_locale_valid(trimmed_locale), "Invalid locale: " + trimmed_locale + ".");
locale = trimmed_locale;
} else {
diff --git a/core/ustring.cpp b/core/ustring.cpp
index ed401c3763..3f5e198281 100644
--- a/core/ustring.cpp
+++ b/core/ustring.cpp
@@ -31,7 +31,7 @@
#include "ustring.h"
#include "core/color.h"
-#include "core/math/crypto_core.h"
+#include "core/crypto/crypto_core.h"
#include "core/math/math_funcs.h"
#include "core/os/memory.h"
#include "core/print_string.h"
@@ -40,6 +40,7 @@
#include "core/variant.h"
#include <wchar.h>
+#include <cstdint>
#ifndef NO_USE_STDLIB
#include <stdio.h>
@@ -1668,6 +1669,7 @@ int String::hex_to_int(bool p_with_prefix) const {
return 0;
}
+ ERR_FAIL_COND_V_MSG(hex > INT32_MAX / 16, sign == 1 ? INT32_MAX : INT32_MIN, "Cannot represent " + *this + " as integer, provided value is " + (sign == 1 ? "too big." : "too small."));
hex *= 16;
hex += n;
s++;
@@ -1709,6 +1711,7 @@ int64_t String::hex_to_int64(bool p_with_prefix) const {
return 0;
}
+ ERR_FAIL_COND_V_MSG(hex > INT64_MAX / 16, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + *this + " as 64-bit integer, provided value is " + (sign == 1 ? "too big." : "too small."));
hex *= 16;
hex += n;
s++;
@@ -1748,6 +1751,7 @@ int64_t String::bin_to_int64(bool p_with_prefix) const {
return 0;
}
+ ERR_FAIL_COND_V_MSG(binary > INT64_MAX / 2, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + *this + " as 64-bit integer, provided value is " + (sign == 1 ? "too big." : "too small."));
binary *= 2;
binary += n;
s++;
@@ -1771,6 +1775,7 @@ int String::to_int() const {
CharType c = operator[](i);
if (c >= '0' && c <= '9') {
+ ERR_FAIL_COND_V_MSG(integer > INT32_MAX / 10, sign == 1 ? INT32_MAX : INT32_MIN, "Cannot represent " + *this + " as integer, provided value is " + (sign == 1 ? "too big." : "too small."));
integer *= 10;
integer += c - '0';
@@ -1798,6 +1803,7 @@ int64_t String::to_int64() const {
CharType c = operator[](i);
if (c >= '0' && c <= '9') {
+ ERR_FAIL_COND_V_MSG(integer > INT64_MAX / 10, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + *this + " as 64-bit integer, provided value is " + (sign == 1 ? "too big." : "too small."));
integer *= 10;
integer += c - '0';
@@ -1828,6 +1834,7 @@ int String::to_int(const char *p_str, int p_len) {
char c = p_str[i];
if (c >= '0' && c <= '9') {
+ ERR_FAIL_COND_V_MSG(integer > INT32_MAX / 10, sign == 1 ? INT32_MAX : INT32_MIN, "Cannot represent " + String(p_str).substr(0, to) + " as integer, provided value is " + (sign == 1 ? "too big." : "too small."));
integer *= 10;
integer += c - '0';
@@ -2140,6 +2147,14 @@ int64_t String::to_int(const CharType *p_str, int p_len) {
if (c >= '0' && c <= '9') {
+ if (integer > INT32_MAX / 10) {
+ String number("");
+ str = p_str;
+ while (*str && str != limit) {
+ number += *(str++);
+ }
+ ERR_FAIL_V_MSG(sign == 1 ? INT32_MAX : INT32_MIN, "Cannot represent " + number + " as integer, provided value is " + (sign == 1 ? "too big." : "too small."));
+ }
integer *= 10;
integer += c - '0';
} else {
diff --git a/core/ustring.h b/core/ustring.h
index 3eb5c47b3a..bbd0bcceb5 100644
--- a/core/ustring.h
+++ b/core/ustring.h
@@ -36,10 +36,6 @@
#include "core/typedefs.h"
#include "core/vector.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
template <class T>
class CharProxy {
friend class CharString;
diff --git a/core/variant.cpp b/core/variant.cpp
index 1574af5239..e7d0e58367 100644
--- a/core/variant.cpp
+++ b/core/variant.cpp
@@ -1740,10 +1740,7 @@ Variant::operator RID() const {
} else if (type == OBJECT && _get_obj().obj) {
#ifdef DEBUG_ENABLED
if (ScriptDebugger::get_singleton()) {
- if (!ObjectDB::instance_validate(_get_obj().obj)) {
- ERR_EXPLAIN("Invalid pointer (object was deleted)");
- ERR_FAIL_V(RID());
- };
+ ERR_FAIL_COND_V_MSG(!ObjectDB::instance_validate(_get_obj().obj), RID(), "Invalid pointer (object was deleted).");
};
#endif
Variant::CallError ce;
diff --git a/core/variant.h b/core/variant.h
index a8e99c13f1..c4f69c3e8d 100644
--- a/core/variant.h
+++ b/core/variant.h
@@ -31,10 +31,6 @@
#ifndef VARIANT_H
#define VARIANT_H
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
#include "core/array.h"
#include "core/color.h"
#include "core/dictionary.h"
diff --git a/core/variant_call.cpp b/core/variant_call.cpp
index eca5d0567b..5e3876d6a4 100644
--- a/core/variant_call.cpp
+++ b/core/variant_call.cpp
@@ -32,8 +32,8 @@
#include "core/color_names.inc"
#include "core/core_string_names.h"
+#include "core/crypto/crypto_core.h"
#include "core/io/compression.h"
-#include "core/math/crypto_core.h"
#include "core/object.h"
#include "core/os/os.h"
#include "core/script_language.h"
@@ -347,6 +347,8 @@ struct _VariantCall {
VCALL_LOCALMEM0R(Vector2, is_normalized);
VCALL_LOCALMEM1R(Vector2, distance_to);
VCALL_LOCALMEM1R(Vector2, distance_squared_to);
+ VCALL_LOCALMEM1R(Vector2, posmod);
+ VCALL_LOCALMEM1R(Vector2, posmodv);
VCALL_LOCALMEM1R(Vector2, project);
VCALL_LOCALMEM1R(Vector2, angle_to);
VCALL_LOCALMEM1R(Vector2, angle_to_point);
@@ -370,6 +372,7 @@ struct _VariantCall {
VCALL_LOCALMEM1R(Vector2, cross);
VCALL_LOCALMEM0R(Vector2, abs);
VCALL_LOCALMEM1R(Vector2, clamped);
+ VCALL_LOCALMEM0R(Vector2, sign);
VCALL_LOCALMEM0R(Rect2, get_area);
VCALL_LOCALMEM1R(Rect2, intersects);
@@ -407,12 +410,15 @@ struct _VariantCall {
VCALL_LOCALMEM0R(Vector3, round);
VCALL_LOCALMEM1R(Vector3, distance_to);
VCALL_LOCALMEM1R(Vector3, distance_squared_to);
+ VCALL_LOCALMEM1R(Vector3, posmod);
+ VCALL_LOCALMEM1R(Vector3, posmodv);
VCALL_LOCALMEM1R(Vector3, project);
VCALL_LOCALMEM1R(Vector3, angle_to);
VCALL_LOCALMEM1R(Vector3, direction_to);
VCALL_LOCALMEM1R(Vector3, slide);
VCALL_LOCALMEM1R(Vector3, bounce);
VCALL_LOCALMEM1R(Vector3, reflect);
+ VCALL_LOCALMEM0R(Vector3, sign);
VCALL_LOCALMEM0R(Plane, normalized);
VCALL_LOCALMEM0R(Plane, center);
@@ -584,8 +590,7 @@ struct _VariantCall {
if (buffer_size < 0) {
r_ret = decompressed;
- ERR_EXPLAIN("Decompression buffer size is less than zero");
- ERR_FAIL();
+ ERR_FAIL_MSG("Decompression buffer size is less than zero.");
}
decompressed.resize(buffer_size);
@@ -597,13 +602,10 @@ struct _VariantCall {
r_ret = decompressed;
}
- static void _call_PoolByteArray_sha256_string(Variant &r_ret, Variant &p_self, const Variant **p_args) {
+ static void _call_PoolByteArray_hex_encode(Variant &r_ret, Variant &p_self, const Variant **p_args) {
PoolByteArray *ba = reinterpret_cast<PoolByteArray *>(p_self._data._mem);
PoolByteArray::Read r = ba->read();
- String s;
- unsigned char hash[32];
- CryptoCore::sha256((unsigned char *)r.ptr(), ba->size(), hash);
- s = String::hex_encode_buffer(hash, 32);
+ String s = String::hex_encode_buffer(&r[0], ba->size());
r_ret = s;
}
@@ -749,6 +751,7 @@ struct _VariantCall {
case Variant::VECTOR2: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->xform(p_args[0]->operator Vector2()); return;
case Variant::RECT2: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->xform(p_args[0]->operator Rect2()); return;
+ case Variant::POOL_VECTOR2_ARRAY: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->xform(p_args[0]->operator PoolVector2Array()); return;
default: r_ret = Variant();
}
}
@@ -759,6 +762,7 @@ struct _VariantCall {
case Variant::VECTOR2: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->xform_inv(p_args[0]->operator Vector2()); return;
case Variant::RECT2: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->xform_inv(p_args[0]->operator Rect2()); return;
+ case Variant::POOL_VECTOR2_ARRAY: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->xform_inv(p_args[0]->operator PoolVector2Array()); return;
default: r_ret = Variant();
}
}
@@ -815,6 +819,7 @@ struct _VariantCall {
case Variant::VECTOR3: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform(p_args[0]->operator Vector3()); return;
case Variant::PLANE: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform(p_args[0]->operator Plane()); return;
case Variant::AABB: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform(p_args[0]->operator ::AABB()); return;
+ case Variant::POOL_VECTOR3_ARRAY: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform(p_args[0]->operator ::PoolVector3Array()); return;
default: r_ret = Variant();
}
}
@@ -826,6 +831,7 @@ struct _VariantCall {
case Variant::VECTOR3: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform_inv(p_args[0]->operator Vector3()); return;
case Variant::PLANE: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform_inv(p_args[0]->operator Plane()); return;
case Variant::AABB: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform_inv(p_args[0]->operator ::AABB()); return;
+ case Variant::POOL_VECTOR3_ARRAY: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform_inv(p_args[0]->operator ::PoolVector3Array()); return;
default: r_ret = Variant();
}
}
@@ -1591,6 +1597,8 @@ void register_variant_methods() {
ADDFUNC1R(VECTOR2, VECTOR2, Vector2, direction_to, VECTOR2, "b", varray());
ADDFUNC1R(VECTOR2, REAL, Vector2, distance_to, VECTOR2, "to", varray());
ADDFUNC1R(VECTOR2, REAL, Vector2, distance_squared_to, VECTOR2, "to", varray());
+ ADDFUNC1R(VECTOR2, VECTOR2, Vector2, posmod, REAL, "mod", varray());
+ ADDFUNC1R(VECTOR2, VECTOR2, Vector2, posmodv, VECTOR2, "modv", varray());
ADDFUNC1R(VECTOR2, VECTOR2, Vector2, project, VECTOR2, "b", varray());
ADDFUNC1R(VECTOR2, REAL, Vector2, angle_to, VECTOR2, "to", varray());
ADDFUNC1R(VECTOR2, REAL, Vector2, angle_to_point, VECTOR2, "to", varray());
@@ -1612,6 +1620,7 @@ void register_variant_methods() {
ADDFUNC1R(VECTOR2, REAL, Vector2, cross, VECTOR2, "with", varray());
ADDFUNC0R(VECTOR2, VECTOR2, Vector2, abs, varray());
ADDFUNC1R(VECTOR2, VECTOR2, Vector2, clamped, REAL, "length", varray());
+ ADDFUNC0R(VECTOR2, VECTOR2, Vector2, sign, varray());
ADDFUNC0R(RECT2, REAL, Rect2, get_area, varray());
ADDFUNC1R(RECT2, BOOL, Rect2, intersects, RECT2, "b", varray());
@@ -1650,11 +1659,14 @@ void register_variant_methods() {
ADDFUNC0R(VECTOR3, VECTOR3, Vector3, round, varray());
ADDFUNC1R(VECTOR3, REAL, Vector3, distance_to, VECTOR3, "b", varray());
ADDFUNC1R(VECTOR3, REAL, Vector3, distance_squared_to, VECTOR3, "b", varray());
+ ADDFUNC1R(VECTOR3, VECTOR3, Vector3, posmod, REAL, "mod", varray());
+ ADDFUNC1R(VECTOR3, VECTOR3, Vector3, posmodv, VECTOR3, "modv", varray());
ADDFUNC1R(VECTOR3, VECTOR3, Vector3, project, VECTOR3, "b", varray());
ADDFUNC1R(VECTOR3, REAL, Vector3, angle_to, VECTOR3, "to", varray());
ADDFUNC1R(VECTOR3, VECTOR3, Vector3, slide, VECTOR3, "n", varray());
ADDFUNC1R(VECTOR3, VECTOR3, Vector3, bounce, VECTOR3, "n", varray());
ADDFUNC1R(VECTOR3, VECTOR3, Vector3, reflect, VECTOR3, "n", varray());
+ ADDFUNC0R(VECTOR3, VECTOR3, Vector3, sign, varray());
ADDFUNC0R(PLANE, PLANE, Plane, normalized, varray());
ADDFUNC0R(PLANE, VECTOR3, Plane, center, varray());
@@ -1763,7 +1775,7 @@ void register_variant_methods() {
ADDFUNC0R(POOL_BYTE_ARRAY, STRING, PoolByteArray, get_string_from_ascii, varray());
ADDFUNC0R(POOL_BYTE_ARRAY, STRING, PoolByteArray, get_string_from_utf8, varray());
- ADDFUNC0R(POOL_BYTE_ARRAY, STRING, PoolByteArray, sha256_string, varray());
+ ADDFUNC0R(POOL_BYTE_ARRAY, STRING, PoolByteArray, hex_encode, varray());
ADDFUNC1R(POOL_BYTE_ARRAY, POOL_BYTE_ARRAY, PoolByteArray, compress, INT, "compression_mode", varray(0));
ADDFUNC2R(POOL_BYTE_ARRAY, POOL_BYTE_ARRAY, PoolByteArray, decompress, INT, "buffer_size", INT, "compression_mode", varray(0));
@@ -1947,6 +1959,9 @@ void register_variant_methods() {
_VariantCall::add_variant_constant(Variant::VECTOR3, "FORWARD", Vector3(0, 0, -1));
_VariantCall::add_variant_constant(Variant::VECTOR3, "BACK", Vector3(0, 0, 1));
+ _VariantCall::add_constant(Variant::VECTOR2, "AXIS_X", Vector2::AXIS_X);
+ _VariantCall::add_constant(Variant::VECTOR2, "AXIS_Y", Vector2::AXIS_Y);
+
_VariantCall::add_variant_constant(Variant::VECTOR2, "ZERO", Vector2(0, 0));
_VariantCall::add_variant_constant(Variant::VECTOR2, "ONE", Vector2(1, 1));
_VariantCall::add_variant_constant(Variant::VECTOR2, "INF", Vector2(Math_INF, Math_INF));
diff --git a/doc/classes/AStar.xml b/doc/classes/AStar.xml
index 6d7adc9935..9ca09371dd 100644
--- a/doc/classes/AStar.xml
+++ b/doc/classes/AStar.xml
@@ -157,6 +157,13 @@
If you change the 2nd point's weight to 3, then the result will be [code][1, 4, 3][/code] instead, because now even though the distance is longer, it's "easier" to get through point 4 than through point 2.
</description>
</method>
+ <method name="get_point_capacity" qualifiers="const">
+ <return type="int">
+ </return>
+ <description>
+ Returns the capacity of the structure backing the points, useful in conjunction with [code]reserve_space[/code].
+ </description>
+ </method>
<method name="get_point_connections">
<return type="PoolIntArray">
</return>
@@ -178,6 +185,13 @@
[/codeblock]
</description>
</method>
+ <method name="get_point_count" qualifiers="const">
+ <return type="int">
+ </return>
+ <description>
+ Returns the number of points currently in the points pool.
+ </description>
+ </method>
<method name="get_point_path">
<return type="PoolVector3Array">
</return>
@@ -241,6 +255,15 @@
Removes the point associated with the given [code]id[/code] from the points pool.
</description>
</method>
+ <method name="reserve_space">
+ <return type="void">
+ </return>
+ <argument index="0" name="num_nodes" type="int">
+ </argument>
+ <description>
+ Reserves space internally for [code]num_nodes[/code] points, useful if you're adding a known large number of points at once, for a grid for instance. New capacity must be greater or equals to old capacity.
+ </description>
+ </method>
<method name="set_point_disabled">
<return type="void">
</return>
diff --git a/doc/classes/AStar2D.xml b/doc/classes/AStar2D.xml
index 9d51330139..0eff2bd560 100644
--- a/doc/classes/AStar2D.xml
+++ b/doc/classes/AStar2D.xml
@@ -134,6 +134,13 @@
If you change the 2nd point's weight to 3, then the result will be [code][1, 4, 3][/code] instead, because now even though the distance is longer, it's "easier" to get through point 4 than through point 2.
</description>
</method>
+ <method name="get_point_capacity" qualifiers="const">
+ <return type="int">
+ </return>
+ <description>
+ Returns the capacity of the structure backing the points, useful in conjunction with [code]reserve_space[/code].
+ </description>
+ </method>
<method name="get_point_connections">
<return type="PoolIntArray">
</return>
@@ -155,6 +162,13 @@
[/codeblock]
</description>
</method>
+ <method name="get_point_count" qualifiers="const">
+ <return type="int">
+ </return>
+ <description>
+ Returns the number of points currently in the points pool.
+ </description>
+ </method>
<method name="get_point_path">
<return type="PoolVector2Array">
</return>
@@ -218,6 +232,15 @@
Removes the point associated with the given [code]id[/code] from the points pool.
</description>
</method>
+ <method name="reserve_space">
+ <return type="void">
+ </return>
+ <argument index="0" name="num_nodes" type="int">
+ </argument>
+ <description>
+ Reserves space internally for [code]num_nodes[/code] points, useful if you're adding a known large number of points at once, for a grid for instance. New capacity must be greater or equals to old capacity.
+ </description>
+ </method>
<method name="set_point_disabled">
<return type="void">
</return>
diff --git a/doc/classes/AnimationPlayer.xml b/doc/classes/AnimationPlayer.xml
index b4c44fe8eb..e510603281 100644
--- a/doc/classes/AnimationPlayer.xml
+++ b/doc/classes/AnimationPlayer.xml
@@ -165,6 +165,7 @@
</argument>
<description>
Queues an animation for playback once the current one is done.
+ [b]Note:[/b] If a looped animation is currently playing, the queued animation will never play unless the looped animation is stopped somehow.
</description>
</method>
<method name="remove_animation">
diff --git a/doc/classes/AudioServer.xml b/doc/classes/AudioServer.xml
index 6f82b103db..2d3ceebed5 100644
--- a/doc/classes/AudioServer.xml
+++ b/doc/classes/AudioServer.xml
@@ -32,12 +32,6 @@
Adds an [AudioEffect] effect to the bus [code]bus_idx[/code] at [code]at_position[/code].
</description>
</method>
- <method name="capture_get_device">
- <return type="String">
- </return>
- <description>
- </description>
- </method>
<method name="capture_get_device_list">
<return type="Array">
</return>
@@ -45,14 +39,6 @@
Returns the names of all audio input devices detected on the system.
</description>
</method>
- <method name="capture_set_device">
- <return type="void">
- </return>
- <argument index="0" name="name" type="String">
- </argument>
- <description>
- </description>
- </method>
<method name="capture_start">
<return type="int" enum="Error">
</return>
@@ -423,17 +409,25 @@
<member name="bus_count" type="int" setter="set_bus_count" getter="get_bus_count" default="1">
Number of available audio buses.
</member>
+ <member name="capture_device" type="String" setter="capture_set_device" getter="capture_get_device" default="&quot;&quot;">
+ Name of the current device for audio input (see [method capture_get_device_list]).
+ </member>
<member name="device" type="String" setter="set_device" getter="get_device" default="&quot;Default&quot;">
Name of the current device for audio output (see [method get_device_list]).
</member>
- <member name="capture_device" type="String" setter="capture_set_device" getter="capture_get_device" default="&quot;Default&quot;">
- Name of the current device for audio input (see [method capture_get_device_list]).
- </member>
<member name="global_rate_scale" type="float" setter="set_global_rate_scale" getter="get_global_rate_scale" default="1.0">
Scales the rate at which audio is played (i.e. setting it to [code]0.5[/code] will make the audio be played twice as fast).
</member>
</members>
<signals>
+ <signal name="audio_mix_callback">
+ <description>
+ </description>
+ </signal>
+ <signal name="audio_update_callback">
+ <description>
+ </description>
+ </signal>
<signal name="bus_layout_changed">
<description>
Emitted when the [AudioBusLayout] changes.
diff --git a/doc/classes/AudioStreamGenerator.xml b/doc/classes/AudioStreamGenerator.xml
index 9d67b88c71..9a1e4432f1 100644
--- a/doc/classes/AudioStreamGenerator.xml
+++ b/doc/classes/AudioStreamGenerator.xml
@@ -5,6 +5,7 @@
<description>
</description>
<tutorials>
+ <link>https://github.com/godotengine/godot-demo-projects/tree/master/audio/generator</link>
</tutorials>
<methods>
</methods>
diff --git a/doc/classes/AudioStreamGeneratorPlayback.xml b/doc/classes/AudioStreamGeneratorPlayback.xml
index 310b58c4e5..448284e670 100644
--- a/doc/classes/AudioStreamGeneratorPlayback.xml
+++ b/doc/classes/AudioStreamGeneratorPlayback.xml
@@ -5,6 +5,7 @@
<description>
</description>
<tutorials>
+ <link>https://github.com/godotengine/godot-demo-projects/tree/master/audio/generator</link>
</tutorials>
<methods>
<method name="can_push_buffer" qualifiers="const">
diff --git a/doc/classes/AudioStreamSample.xml b/doc/classes/AudioStreamSample.xml
index 6d03301749..a496902ded 100644
--- a/doc/classes/AudioStreamSample.xml
+++ b/doc/classes/AudioStreamSample.xml
@@ -24,6 +24,7 @@
<members>
<member name="data" type="PoolByteArray" setter="set_data" getter="get_data" default="PoolByteArray( )">
Contains the audio data in bytes.
+ [b]Note:[/b] This property expects signed PCM8 data. To convert unsigned PCM8 to signed PCM8, subtract 128 from each byte.
</member>
<member name="format" type="int" setter="set_format" getter="get_format" enum="AudioStreamSample.Format" default="0">
Audio format. See [code]FORMAT_*[/code] constants for values.
diff --git a/doc/classes/Basis.xml b/doc/classes/Basis.xml
index 4d5c76a75c..df9438e695 100644
--- a/doc/classes/Basis.xml
+++ b/doc/classes/Basis.xml
@@ -208,5 +208,13 @@
</member>
</members>
<constants>
+ <constant name="IDENTITY" value="Basis( 1, 0, 0, 0, 1, 0, 0, 0, 1 )">
+ </constant>
+ <constant name="FLIP_X" value="Basis( -1, 0, 0, 0, 1, 0, 0, 0, 1 )">
+ </constant>
+ <constant name="FLIP_Y" value="Basis( 1, 0, 0, 0, -1, 0, 0, 0, 1 )">
+ </constant>
+ <constant name="FLIP_Z" value="Basis( 1, 0, 0, 0, 1, 0, 0, 0, -1 )">
+ </constant>
</constants>
</class>
diff --git a/doc/classes/Button.xml b/doc/classes/Button.xml
index adf826c26b..305be8b58d 100644
--- a/doc/classes/Button.xml
+++ b/doc/classes/Button.xml
@@ -15,7 +15,10 @@
Text alignment policy for the button's text, use one of the [code]ALIGN_*[/code] constants.
</member>
<member name="clip_text" type="bool" setter="set_clip_text" getter="get_clip_text" default="false">
- When this property is enabled, text that is too large to fit the button is clipped, when disabled the Button will always be wide enough to hold the text. This property is disabled by default.
+ When this property is enabled, text that is too large to fit the button is clipped, when disabled the Button will always be wide enough to hold the text.
+ </member>
+ <member name="expand_icon" type="bool" setter="set_expand_icon" getter="is_expand_icon" default="false">
+ When enabled, the button's icon will expand/shrink to fit the button's size while keeping its aspect.
</member>
<member name="flat" type="bool" setter="set_flat" getter="is_flat" default="false">
Flat buttons don't display decoration.
diff --git a/doc/classes/Camera2D.xml b/doc/classes/Camera2D.xml
index f524a02934..16fb483249 100644
--- a/doc/classes/Camera2D.xml
+++ b/doc/classes/Camera2D.xml
@@ -110,7 +110,7 @@
<member name="drag_margin_bottom" type="float" setter="set_drag_margin" getter="get_drag_margin" default="0.2">
Bottom margin needed to drag the camera. A value of [code]1[/code] makes the camera move only when reaching the edge of the screen.
</member>
- <member name="drag_margin_h_enabled" type="bool" setter="set_h_drag_enabled" getter="is_h_drag_enabled" default="true">
+ <member name="drag_margin_h_enabled" type="bool" setter="set_h_drag_enabled" getter="is_h_drag_enabled" default="false">
If [code]true[/code], the camera only moves when reaching the horizontal drag margins. If [code]false[/code], the camera moves horizontally regardless of margins.
</member>
<member name="drag_margin_left" type="float" setter="set_drag_margin" getter="get_drag_margin" default="0.2">
@@ -122,7 +122,7 @@
<member name="drag_margin_top" type="float" setter="set_drag_margin" getter="get_drag_margin" default="0.2">
Top margin needed to drag the camera. A value of [code]1[/code] makes the camera move only when reaching the edge of the screen.
</member>
- <member name="drag_margin_v_enabled" type="bool" setter="set_v_drag_enabled" getter="is_v_drag_enabled" default="true">
+ <member name="drag_margin_v_enabled" type="bool" setter="set_v_drag_enabled" getter="is_v_drag_enabled" default="false">
If [code]true[/code], the camera only moves when reaching the vertical drag margins. If [code]false[/code], the camera moves vertically regardless of margins.
</member>
<member name="editor_draw_drag_margin" type="bool" setter="set_margin_drawing_enabled" getter="is_margin_drawing_enabled" default="false">
diff --git a/doc/classes/ClassDB.xml b/doc/classes/ClassDB.xml
index b7b77bc02a..fd08643dd5 100644
--- a/doc/classes/ClassDB.xml
+++ b/doc/classes/ClassDB.xml
@@ -134,7 +134,7 @@
<argument index="2" name="no_inheritance" type="bool" default="false">
</argument>
<description>
- Returns whether [code]class[/code] (or its ancestry if [code]no_inheritance[/code] is false) has a method called [code]method[/code] or not.
+ Returns whether [code]class[/code] (or its ancestry if [code]no_inheritance[/code] is [code]false[/code]) has a method called [code]method[/code] or not.
</description>
</method>
<method name="class_has_signal" qualifiers="const">
@@ -201,7 +201,7 @@
<argument index="0" name="class" type="String">
</argument>
<description>
- Returns whether this class is enabled or not.
+ Returns whether this [code]class[/code] is enabled or not.
</description>
</method>
<method name="is_parent_class" qualifiers="const">
diff --git a/doc/classes/Control.xml b/doc/classes/Control.xml
index 6c3cf66c20..1eeef92ccc 100644
--- a/doc/classes/Control.xml
+++ b/doc/classes/Control.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="Control" inherits="CanvasItem" category="Core" version="3.2">
<brief_description>
- All User Interface nodes inherit from Control. A control's anchors and margins adapt its position and size relative to its parent.
+ All user interface nodes inherit from Control. A control's anchors and margins adapt its position and size relative to its parent.
</brief_description>
<description>
Base class for all UI-related nodes. [Control] features a bounding rectangle that defines its extents, an anchor position relative to its parent control or the current viewport, and margins that represent an offset to the anchor. The margins update automatically when the node, any of its parents, or the screen size change.
@@ -49,10 +49,10 @@
[/codeblock]
The event won't trigger if:
* clicking outside the control (see [method has_point]);
- * control has [member mouse_filter] set to [member MOUSE_FILTER_IGNORE];
- * control is obstructed by another [Control] on top of it, which doesn't have [member mouse_filter] set to [member MOUSE_FILTER_IGNORE];
- * control's parent has [member mouse_filter] set to [member MOUSE_FILTER_STOP] or has accepted the event;
- * it happens outside parent's rectangle and the parent has either [member rect_clip_content] or [member _clips_input] enabled.
+ * control has [member mouse_filter] set to [constant MOUSE_FILTER_IGNORE];
+ * control is obstructed by another [Control] on top of it, which doesn't have [member mouse_filter] set to [constant MOUSE_FILTER_IGNORE];
+ * control's parent has [member mouse_filter] set to [constant MOUSE_FILTER_STOP] or has accepted the event;
+ * it happens outside parent's rectangle and the parent has either [member rect_clip_content] or [method _clips_input] enabled.
</description>
</method>
<method name="_make_custom_tooltip" qualifiers="virtual">
@@ -63,7 +63,7 @@
<description>
Virtual method to be implemented by the user. Returns a [Control] node that should be used as a tooltip instead of the default one. Use [code]for_text[/code] parameter to determine what text the tooltip should contain (likely the contents of [member hint_tooltip]).
The returned node must be of type [Control] or Control-derieved. It can have child nodes of any type. It is freed when the tooltip disappears, so make sure you always provide a new instance, not e.g. a node from scene. When null or non-Control node is returned, the default tooltip will be used instead.
- [b]Note:[/b] The tooltip is shrunk to miminal size. If you want to ensure it's fully visible, you might want to set its [member rect_min_size] to some non-zero value.
+ [b]Note:[/b] The tooltip is shrunk to minimal size. If you want to ensure it's fully visible, you might want to set its [member rect_min_size] to some non-zero value.
Example of usage with custom-constructed node:
[codeblock]
func _make_custom_tooltip(for_text):
@@ -229,7 +229,7 @@
[codeblock]
func _ready():
modulate = get_color("font_color", "Button") #get the color defined for button fonts
- [/codeblock]
+ [/codeblock]
</description>
</method>
<method name="get_combined_minimum_size" qualifiers="const">
@@ -260,7 +260,7 @@
</description>
</method>
<method name="get_drag_data" qualifiers="virtual">
- <return type="Object">
+ <return type="Variant">
</return>
<argument index="0" name="position" type="Vector2">
</argument>
@@ -388,7 +388,7 @@
<argument index="0" name="at_position" type="Vector2" default="Vector2( 0, 0 )">
</argument>
<description>
- Returns the tooltip, which will appear when the cursor is resting over this control. See [member]hint_tooltip[/member].
+ Returns the tooltip, which will appear when the cursor is resting over this control. See [member hint_tooltip].
</description>
</method>
<method name="grab_click_focus">
diff --git a/doc/classes/Crypto.xml b/doc/classes/Crypto.xml
new file mode 100644
index 0000000000..bb852f5fff
--- /dev/null
+++ b/doc/classes/Crypto.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="Crypto" inherits="Reference" category="Core" version="3.2">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <methods>
+ <method name="generate_random_bytes">
+ <return type="PoolByteArray">
+ </return>
+ <argument index="0" name="size" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="generate_rsa">
+ <return type="CryptoKey">
+ </return>
+ <argument index="0" name="size" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="generate_self_signed_certificate">
+ <return type="X509Certificate">
+ </return>
+ <argument index="0" name="key" type="CryptoKey">
+ </argument>
+ <argument index="1" name="issuer_name" type="String" default="&quot;CN=myserver,O=myorganisation,C=IT&quot;">
+ </argument>
+ <argument index="2" name="not_before" type="String" default="&quot;20140101000000&quot;">
+ </argument>
+ <argument index="3" name="not_after" type="String" default="&quot;20340101000000&quot;">
+ </argument>
+ <description>
+ </description>
+ </method>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/CryptoKey.xml b/doc/classes/CryptoKey.xml
new file mode 100644
index 0000000000..d3cd485a5f
--- /dev/null
+++ b/doc/classes/CryptoKey.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="CryptoKey" inherits="Resource" category="Core" version="3.2">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <methods>
+ <method name="load">
+ <return type="int" enum="Error">
+ </return>
+ <argument index="0" name="path" type="String">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="save">
+ <return type="int" enum="Error">
+ </return>
+ <argument index="0" name="path" type="String">
+ </argument>
+ <description>
+ </description>
+ </method>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/Directory.xml b/doc/classes/Directory.xml
index 9294a515d2..8aae85563a 100644
--- a/doc/classes/Directory.xml
+++ b/doc/classes/Directory.xml
@@ -127,8 +127,8 @@
</argument>
<description>
Initializes the stream used to list all files and directories using the [method get_next] function, closing the current opened stream if needed. Once the stream has been processed, it should typically be closed with [method list_dir_end].
- If you pass [code]skip_navigational[/code], then [code].[/code] and [code]..[/code] would be filtered out.
- If you pass [code]skip_hidden[/code], then hidden files would be filtered out.
+ If [code]skip_navigational[/code] is [code]true[/code], [code].[/code] and [code]..[/code] are filtered out.
+ If [code]skip_hidden[/code] is [code]true[/code], hidden files are filtered out.
</description>
</method>
<method name="list_dir_end">
diff --git a/doc/classes/EditorInterface.xml b/doc/classes/EditorInterface.xml
index d55e810c9e..4f7a6d89a9 100644
--- a/doc/classes/EditorInterface.xml
+++ b/doc/classes/EditorInterface.xml
@@ -169,6 +169,22 @@
Selects the file, with the path provided by [code]file[/code], in the FileSystem dock.
</description>
</method>
+ <method name="set_distraction_free_mode">
+ <return type="void">
+ </return>
+ <argument index="0" name="enter" type="bool">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="set_main_screen_editor">
+ <return type="void">
+ </return>
+ <argument index="0" name="name" type="String">
+ </argument>
+ <description>
+ </description>
+ </method>
<method name="set_plugin_enabled">
<return type="void">
</return>
diff --git a/doc/classes/Environment.xml b/doc/classes/Environment.xml
index 86c1002666..9a943aba51 100644
--- a/doc/classes/Environment.xml
+++ b/doc/classes/Environment.xml
@@ -146,10 +146,11 @@
<member name="fog_depth_enabled" type="bool" setter="set_fog_depth_enabled" getter="is_fog_depth_enabled" default="true">
Enables the fog depth.
</member>
- <member name="fog_depth_end" type="float" setter="set_fog_depth_end" getter="get_fog_depth_end" default="0.0">
+ <member name="fog_depth_end" type="float" setter="set_fog_depth_end" getter="get_fog_depth_end" default="100.0">
+ Fog's depth end distance from the camera. If this value is set to 0, it will be equal to the current camera's [member Camera.far] value.
</member>
<member name="fog_enabled" type="bool" setter="set_fog_enabled" getter="is_fog_enabled" default="false">
- Enables the fog. Needs fog_height_enabled and/or for_depth_enabled to actually display fog.
+ Enables the fog. Needs [member fog_height_enabled] and/or [member fog_depth_enabled] to actually display fog.
</member>
<member name="fog_height_curve" type="float" setter="set_fog_height_curve" getter="get_fog_height_curve" default="1.0">
Value defining the fog height intensity.
@@ -305,7 +306,7 @@
Replace glow blending mode. Replaces all pixels' color by the glow value.
</constant>
<constant name="TONE_MAPPER_LINEAR" value="0" enum="ToneMapper">
- Linear tonemapper operator. Reads the linear data and performs an exposure adjustment.
+ Linear tonemapper operator. Reads the linear data and passes it on unmodified.
</constant>
<constant name="TONE_MAPPER_REINHARDT" value="1" enum="ToneMapper">
Reinhardt tonemapper operator. Performs a variation on rendered pixels' colors by this formula: [code]color = color / (1 + color)[/code].
diff --git a/doc/classes/FileDialog.xml b/doc/classes/FileDialog.xml
index e78f21b274..4f1e8cc309 100644
--- a/doc/classes/FileDialog.xml
+++ b/doc/classes/FileDialog.xml
@@ -134,6 +134,8 @@
</theme_item>
<theme_item name="folder" type="Texture">
</theme_item>
+ <theme_item name="folder_icon_modulate" type="Color" default="Color( 1, 1, 1, 1 )">
+ </theme_item>
<theme_item name="parent_folder" type="Texture">
</theme_item>
<theme_item name="reload" type="Texture">
diff --git a/doc/classes/Geometry.xml b/doc/classes/Geometry.xml
index 3cbbe6da56..3824baa4dc 100644
--- a/doc/classes/Geometry.xml
+++ b/doc/classes/Geometry.xml
@@ -216,6 +216,19 @@
Intersects [code]polyline[/code] with [code]polygon[/code] and returns an array of intersected polylines. This performs [constant OPERATION_INTERSECTION] between the polyline and the polygon. This operation can be thought of as chopping a line with a closed shape.
</description>
</method>
+ <method name="is_point_in_circle">
+ <return type="bool">
+ </return>
+ <argument index="0" name="point" type="Vector2">
+ </argument>
+ <argument index="1" name="circle_position" type="Vector2">
+ </argument>
+ <argument index="2" name="circle_radius" type="float">
+ </argument>
+ <description>
+ Returns [code]true[/code] if [code]point[/code] is inside the circle or if it's located exactly [i]on[/i] the circle's boundary, otherwise returns [code]false[/code].
+ </description>
+ </method>
<method name="is_point_in_polygon">
<return type="bool">
</return>
@@ -428,18 +441,6 @@
Tests if the segment ([code]from[/code], [code]to[/code]) intersects the triangle [code]a[/code], [code]b[/code], [code]c[/code]. If yes, returns the point of intersection as [Vector3]. If no intersection takes place, an empty [Variant] is returned.
</description>
</method>
- <method name="transform_points_2d">
- <return type="PoolVector2Array">
- </return>
- <argument index="0" name="points" type="PoolVector2Array">
- </argument>
- <argument index="1" name="transform" type="Transform2D">
- </argument>
- <description>
- Transforms an array of points by [code]transform[/code] and returns the result.
- Can be useful in conjunction with performing polygon boolean operations in a CSG-like manner, see [method merge_polygons_2d], [method clip_polygons_2d], [method intersect_polygons_2d], [method exclude_polygons_2d].
- </description>
- </method>
<method name="triangulate_delaunay_2d">
<return type="PoolIntArray">
</return>
diff --git a/doc/classes/GeometryInstance.xml b/doc/classes/GeometryInstance.xml
index b108e1be7c..02f2c27043 100644
--- a/doc/classes/GeometryInstance.xml
+++ b/doc/classes/GeometryInstance.xml
@@ -46,22 +46,26 @@
</member>
<member name="lod_max_distance" type="float" setter="set_lod_max_distance" getter="get_lod_max_distance" default="0.0">
The GeometryInstance's max LOD distance.
+ [b]Note:[/b] This property currently has no effect.
</member>
<member name="lod_max_hysteresis" type="float" setter="set_lod_max_hysteresis" getter="get_lod_max_hysteresis" default="0.0">
The GeometryInstance's max LOD margin.
+ [b]Note:[/b] This property currently has no effect.
</member>
<member name="lod_min_distance" type="float" setter="set_lod_min_distance" getter="get_lod_min_distance" default="0.0">
The GeometryInstance's min LOD distance.
+ [b]Note:[/b] This property currently has no effect.
</member>
<member name="lod_min_hysteresis" type="float" setter="set_lod_min_hysteresis" getter="get_lod_min_hysteresis" default="0.0">
The GeometryInstance's min LOD margin.
+ [b]Note:[/b] This property currently has no effect.
</member>
<member name="material_override" type="Material" setter="set_material_override" getter="get_material_override">
The material override for the whole geometry.
- If there is a material in [code]material_override[/code], it will be used instead of any material set in any material slot of the mesh.
+ If a material is assigned to this property, it will be used instead of any material set in any material slot of the mesh.
</member>
<member name="use_in_baked_light" type="bool" setter="set_flag" getter="get_flag" default="false">
- If [code]true[/code], this GeometryInstance will be used when baking lights using a [GIProbe] and/or any other form of baked lighting.
+ If [code]true[/code], this GeometryInstance will be used when baking lights using a [GIProbe] or [BakedLightmap].
</member>
</members>
<constants>
@@ -78,10 +82,10 @@
</constant>
<constant name="SHADOW_CASTING_SETTING_SHADOWS_ONLY" value="3" enum="ShadowCastingSetting">
Will only show the shadows casted from this object.
- In other words: The actual mesh will not be visible, only the shadows casted from the mesh.
+ In other words, the actual mesh will not be visible, only the shadows casted from the mesh will be.
</constant>
<constant name="FLAG_USE_BAKED_LIGHT" value="0" enum="Flags">
- Will allow the GeometryInstance to be used when baking lights using a [GIProbe] and/or any other form of baked lighting.
+ Will allow the GeometryInstance to be used when baking lights using a [GIProbe] or [BakedLightmap].
</constant>
<constant name="FLAG_DRAW_NEXT_FRAME_IF_VISIBLE" value="1" enum="Flags">
Unused in this class, exposed for consistency with [enum VisualServer.InstanceFlags].
diff --git a/doc/classes/GraphNode.xml b/doc/classes/GraphNode.xml
index 6bc09e5289..8470a346ff 100644
--- a/doc/classes/GraphNode.xml
+++ b/doc/classes/GraphNode.xml
@@ -174,6 +174,7 @@
</methods>
<members>
<member name="comment" type="bool" setter="set_comment" getter="is_comment" default="false">
+ If [code]true[/code], the GraphNode is a comment node.
</member>
<member name="offset" type="Vector2" setter="set_offset" getter="get_offset" default="Vector2( 0, 0 )">
The offset of the GraphNode, relative to the scroll offset of the [GraphEdit].
@@ -257,6 +258,8 @@
</theme_item>
<theme_item name="resizer" type="Texture">
</theme_item>
+ <theme_item name="resizer_color" type="Color" default="Color( 0, 0, 0, 1 )">
+ </theme_item>
<theme_item name="selectedframe" type="StyleBox">
</theme_item>
<theme_item name="separation" type="int" default="1">
diff --git a/doc/classes/HashingContext.xml b/doc/classes/HashingContext.xml
new file mode 100644
index 0000000000..552a74eba4
--- /dev/null
+++ b/doc/classes/HashingContext.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="HashingContext" inherits="Reference" category="Core" version="3.2">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <methods>
+ <method name="finish">
+ <return type="PoolByteArray">
+ </return>
+ <description>
+ </description>
+ </method>
+ <method name="start">
+ <return type="int" enum="Error">
+ </return>
+ <argument index="0" name="type" type="int" enum="HashingContext.HashType">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="update">
+ <return type="int" enum="Error">
+ </return>
+ <argument index="0" name="chunk" type="PoolByteArray">
+ </argument>
+ <description>
+ </description>
+ </method>
+ </methods>
+ <constants>
+ <constant name="HASH_MD5" value="0" enum="HashType">
+ </constant>
+ <constant name="HASH_SHA1" value="1" enum="HashType">
+ </constant>
+ <constant name="HASH_SHA256" value="2" enum="HashType">
+ </constant>
+ </constants>
+</class>
diff --git a/doc/classes/Image.xml b/doc/classes/Image.xml
index a4df0d5c19..10be66feb8 100644
--- a/doc/classes/Image.xml
+++ b/doc/classes/Image.xml
@@ -406,24 +406,24 @@
<description>
</description>
</method>
- <method name="save_png" qualifiers="const">
+ <method name="save_exr" qualifiers="const">
<return type="int" enum="Error">
</return>
<argument index="0" name="path" type="String">
</argument>
+ <argument index="1" name="grayscale" type="bool" default="false">
+ </argument>
<description>
- Saves the image as a PNG file to [code]path[/code].
+ Saves the image as an EXR file to [code]path[/code]. If grayscale is true and the image has only one channel, it will be saved explicitely as monochrome rather than one red channel. This function will return [constant ERR_UNAVAILABLE] if Godot was compiled without the TinyEXR module.
</description>
</method>
- <method name="save_exr" qualifiers="const">
+ <method name="save_png" qualifiers="const">
<return type="int" enum="Error">
</return>
<argument index="0" name="path" type="String">
</argument>
- <argument index="1" name="grayscale" type="bool" default="false">
- </argument>
<description>
- Saves the image as an EXR file to [code]path[/code]. If grayscale is true and the image has only one channel, it will be saved explicitely as monochrome rather than one red channel. This function will return [constant ERR_UNAVAILABLE] if Godot was compiled without the TinyEXR module.
+ Saves the image as a PNG file to [code]path[/code].
</description>
</method>
<method name="set_pixel">
diff --git a/doc/classes/Input.xml b/doc/classes/Input.xml
index 91ebcd52f6..5fd5e8c3c0 100644
--- a/doc/classes/Input.xml
+++ b/doc/classes/Input.xml
@@ -20,6 +20,7 @@
<description>
This will simulate pressing the specified action.
The strength can be used for non-boolean actions, it's ranged between 0 and 1 representing the intensity of the given action.
+ [b]Note:[/b] This method will not cause any [method Node._input] calls. It is intended to be used with [method is_action_pressed] and [method is_action_just_pressed]. If you want to simulate [code]_input[/code], use [method parse_input_event] instead.
</description>
</method>
<method name="action_release">
@@ -283,7 +284,14 @@
<argument index="0" name="event" type="InputEvent">
</argument>
<description>
- Feeds an [InputEvent] to the game. Can be used to artificially trigger input events from code.
+ Feeds an [InputEvent] to the game. Can be used to artificially trigger input events from code. Also generates [method Node._input] calls.
+ Example:
+ [codeblock]
+ var a = InputEventAction.new()
+ a.action = "ui_cancel"
+ a.pressed = true
+ Input.parse_input_event(a)
+ [/codeblock]
</description>
</method>
<method name="remove_joy_mapping">
@@ -364,6 +372,16 @@
Stops the vibration of the joypad.
</description>
</method>
+ <method name="vibrate_handheld">
+ <return type="void">
+ </return>
+ <argument index="0" name="duration_ms" type="int" default="500">
+ </argument>
+ <description>
+ Vibrate Android and iOS devices.
+ [b]Note:[/b] It needs VIBRATE permission for Android at export settings. iOS does not support duration.
+ </description>
+ </method>
<method name="warp_mouse_position">
<return type="void">
</return>
diff --git a/doc/classes/JSONRPC.xml b/doc/classes/JSONRPC.xml
new file mode 100644
index 0000000000..921161afb4
--- /dev/null
+++ b/doc/classes/JSONRPC.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="JSONRPC" inherits="Object" category="Core" version="3.2">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <methods>
+ <method name="make_notification">
+ <return type="Dictionary">
+ </return>
+ <argument index="0" name="method" type="String">
+ </argument>
+ <argument index="1" name="params" type="Variant">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="make_request">
+ <return type="Dictionary">
+ </return>
+ <argument index="0" name="method" type="String">
+ </argument>
+ <argument index="1" name="params" type="Variant">
+ </argument>
+ <argument index="2" name="id" type="Variant">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="make_response">
+ <return type="Dictionary">
+ </return>
+ <argument index="0" name="result" type="Variant">
+ </argument>
+ <argument index="1" name="id" type="Variant">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="make_response_error" qualifiers="const">
+ <return type="Dictionary">
+ </return>
+ <argument index="0" name="code" type="int">
+ </argument>
+ <argument index="1" name="message" type="String">
+ </argument>
+ <argument index="2" name="id" type="Variant" default="null">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="process_action">
+ <return type="Variant">
+ </return>
+ <argument index="0" name="action" type="Variant">
+ </argument>
+ <argument index="1" name="recurse" type="bool" default="false">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="process_string">
+ <return type="String">
+ </return>
+ <argument index="0" name="action" type="String">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="set_scope">
+ <return type="void">
+ </return>
+ <argument index="0" name="scope" type="String">
+ </argument>
+ <argument index="1" name="target" type="Object">
+ </argument>
+ <description>
+ </description>
+ </method>
+ </methods>
+ <constants>
+ <constant name="ParseError" value="-32700" enum="ErrorCode">
+ </constant>
+ <constant name="InvalidRequest" value="-32600" enum="ErrorCode">
+ </constant>
+ <constant name="MethodNotFound" value="-32601" enum="ErrorCode">
+ </constant>
+ <constant name="InvalidParams" value="-32602" enum="ErrorCode">
+ </constant>
+ <constant name="InternalError" value="-32603" enum="ErrorCode">
+ </constant>
+ </constants>
+</class>
diff --git a/doc/classes/MainLoop.xml b/doc/classes/MainLoop.xml
index f5bf12a876..181a99590a 100644
--- a/doc/classes/MainLoop.xml
+++ b/doc/classes/MainLoop.xml
@@ -4,7 +4,7 @@
Abstract base class for the game's main loop.
</brief_description>
<description>
- [MainLoop] is the abstract base class for a Godot project's game loop. It in inherited by [SceneTree], which is the default game loop implementation used in Godot projects, though it is also possible to write and use one's own [MainLoop] subclass instead of the scene tree.
+ [MainLoop] is the abstract base class for a Godot project's game loop. It is inherited by [SceneTree], which is the default game loop implementation used in Godot projects, though it is also possible to write and use one's own [MainLoop] subclass instead of the scene tree.
Upon the application start, a [MainLoop] implementation must be provided to the OS; otherwise, the application will exit. This happens automatically (and a [SceneTree] is created) unless a main [Script] is provided from the command line (with e.g. [code]godot -s my_loop.gd[/code], which should then be a [MainLoop] implementation.
Here is an example script implementing a simple [MainLoop]:
[codeblock]
@@ -61,6 +61,16 @@
Called before the program exits.
</description>
</method>
+ <method name="_global_menu_action" qualifiers="virtual">
+ <return type="void">
+ </return>
+ <argument index="0" name="id" type="Variant">
+ </argument>
+ <argument index="1" name="meta" type="Variant">
+ </argument>
+ <description>
+ </description>
+ </method>
<method name="_idle" qualifiers="virtual">
<return type="bool">
</return>
diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml
index 889ce4d3eb..097fa1f6e5 100644
--- a/doc/classes/Node.xml
+++ b/doc/classes/Node.xml
@@ -122,6 +122,12 @@
<description>
Adds a child node. Nodes can have any number of children, but every child must have a unique name. Child nodes are automatically deleted when the parent node is deleted, so an entire scene can be removed by deleting its topmost node.
If [code]legible_unique_name[/code] is [code]true[/code], the child node will have an human-readable name based on the name of the node being instanced instead of its type.
+ [b]Note:[/b] If the child node already has a parent, the function will fail. Use [method remove_child] first to remove the node from its current parent. For example:
+ [codeblock]
+ if child_node.get_parent():
+ child_node.get_parent().remove_child(child_node)
+ add_child(child_node)
+ [/codeblock]
</description>
</method>
<method name="add_child_below_node">
diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml
index c770e78c7c..938777a36b 100644
--- a/doc/classes/OS.xml
+++ b/doc/classes/OS.xml
@@ -497,6 +497,50 @@
Returns unobscured area of the window where interactive controls should be rendered.
</description>
</method>
+ <method name="global_menu_add_item">
+ <return type="void">
+ </return>
+ <argument index="0" name="menu" type="String">
+ </argument>
+ <argument index="1" name="label" type="String">
+ </argument>
+ <argument index="2" name="id" type="Variant">
+ </argument>
+ <argument index="3" name="meta" type="Variant">
+ </argument>
+ <description>
+ Add a new item with text "label" to global menu. Use "_dock" menu to add item to the macOS dock icon menu.
+ </description>
+ </method>
+ <method name="global_menu_add_separator">
+ <return type="void">
+ </return>
+ <argument index="0" name="menu" type="String">
+ </argument>
+ <description>
+ Add a separator between items. Separators also occupy an index.
+ </description>
+ </method>
+ <method name="global_menu_clear">
+ <return type="void">
+ </return>
+ <argument index="0" name="menu" type="String">
+ </argument>
+ <description>
+ Clear the global menu, in effect removing all items.
+ </description>
+ </method>
+ <method name="global_menu_remove_item">
+ <return type="void">
+ </return>
+ <argument index="0" name="menu" type="String">
+ </argument>
+ <argument index="1" name="idx" type="int">
+ </argument>
+ <description>
+ Removes the item at index "idx" from the global menu. Note that the indexes of items after the removed item are going to be shifted by one.
+ </description>
+ </method>
<method name="has_environment" qualifiers="const">
<return type="bool">
</return>
diff --git a/doc/classes/PoolByteArray.xml b/doc/classes/PoolByteArray.xml
index 08848e789b..21bf078017 100644
--- a/doc/classes/PoolByteArray.xml
+++ b/doc/classes/PoolByteArray.xml
@@ -67,6 +67,12 @@
Returns a copy of the array's contents as [String]. Slower than [method get_string_from_ascii] but supports UTF-8 encoded data. Use this function if you are unsure about the source of the data. For user input this function should always be preferred.
</description>
</method>
+ <method name="hex_encode">
+ <return type="String">
+ </return>
+ <description>
+ </description>
+ </method>
<method name="insert">
<return type="int">
</return>
@@ -113,13 +119,6 @@
Changes the byte at the given index.
</description>
</method>
- <method name="sha256_string">
- <return type="String">
- </return>
- <description>
- Returns SHA-256 string of the PoolByteArray.
- </description>
- </method>
<method name="size">
<return type="int">
</return>
diff --git a/doc/classes/Popup.xml b/doc/classes/Popup.xml
index 1e24aadfd9..fb8168c344 100644
--- a/doc/classes/Popup.xml
+++ b/doc/classes/Popup.xml
@@ -56,6 +56,13 @@
Popup (show the control in modal form) in the center of the screen relative to the current canvas transform, scaled at a ratio of size of the screen.
</description>
</method>
+ <method name="set_as_minsize">
+ <return type="void">
+ </return>
+ <description>
+ Shrink popup to keep to the minimum size of content.
+ </description>
+ </method>
</methods>
<members>
<member name="popup_exclusive" type="bool" setter="set_exclusive" getter="is_exclusive" default="false">
diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml
index 9f18eea0d4..86b874d8ee 100644
--- a/doc/classes/ProjectSettings.xml
+++ b/doc/classes/ProjectSettings.xml
@@ -180,6 +180,9 @@
This user directory is used for storing persistent data ([code]user://[/code] filesystem). If left empty, [code]user://[/code] resolves to a project-specific folder in Godot's own configuration folder (see [method OS.get_user_data_dir]). If a custom directory name is defined, this name will be used instead and appended to the system-specific user data directory (same parent folder as the Godot configuration folder documented in [method OS.get_user_data_dir]).
The [member application/config/use_custom_user_dir] setting must be enabled for this to take effect.
</member>
+ <member name="application/config/description" type="String" setter="" getter="" default="&quot;&quot;">
+ The project's description, displayed as a tooltip in the Project Manager when hovering the project.
+ </member>
<member name="application/config/icon" type="String" setter="" getter="" default="&quot;&quot;">
Icon used for the project, set when project loads. Exporters will also use this icon when possible.
</member>
@@ -412,6 +415,8 @@
<member name="editor/active" type="bool" setter="" getter="" default="false">
Internal editor setting, don't touch.
</member>
+ <member name="editor/script_templates_search_path" type="String" setter="" getter="" default="&quot;res://script_templates&quot;">
+ </member>
<member name="editor/search_in_file_extensions" type="PoolStringArray" setter="" getter="" default="PoolStringArray( &quot;gd&quot;, &quot;shader&quot; )">
</member>
<member name="gui/common/default_scroll_deadzone" type="int" setter="" getter="" default="0">
@@ -664,6 +669,8 @@
</member>
<member name="network/limits/tcp/connect_timeout_seconds" type="int" setter="" getter="" default="30">
</member>
+ <member name="network/limits/webrtc/max_channel_in_buffer_kb" type="int" setter="" getter="" default="64">
+ </member>
<member name="network/limits/websocket_client/max_in_buffer_kb" type="int" setter="" getter="" default="64">
</member>
<member name="network/limits/websocket_client/max_in_packets" type="int" setter="" getter="" default="1024">
@@ -686,6 +693,8 @@
<member name="network/remote_fs/page_size" type="int" setter="" getter="" default="65536">
Page size used by remote filesystem (in bytes).
</member>
+ <member name="network/ssl/certificates" type="String" setter="" getter="" default="&quot;&quot;">
+ </member>
<member name="node/name_casing" type="int" setter="" getter="" default="0">
When creating node names automatically, set the type of casing in this project. This is mostly an editor setting.
</member>
diff --git a/doc/classes/ResourceFormatLoaderCrypto.xml b/doc/classes/ResourceFormatLoaderCrypto.xml
new file mode 100644
index 0000000000..8bc7d50c75
--- /dev/null
+++ b/doc/classes/ResourceFormatLoaderCrypto.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderCrypto" inherits="ResourceFormatLoader" category="Core" version="3.2">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatSaverCrypto.xml b/doc/classes/ResourceFormatSaverCrypto.xml
new file mode 100644
index 0000000000..2f7d224dab
--- /dev/null
+++ b/doc/classes/ResourceFormatSaverCrypto.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatSaverCrypto" inherits="ResourceFormatSaver" category="Core" version="3.2">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/RigidBody2D.xml b/doc/classes/RigidBody2D.xml
index f280dc81c2..32a1634f77 100644
--- a/doc/classes/RigidBody2D.xml
+++ b/doc/classes/RigidBody2D.xml
@@ -154,7 +154,7 @@
Multiplies the gravity applied to the body. The body's gravity is calculated from the [b]Default Gravity[/b] value in [b]Project &gt; Project Settings &gt; Physics &gt; 2d[/b] and/or any additional gravity vector applied by [Area2D]s.
</member>
<member name="inertia" type="float" setter="set_inertia" getter="get_inertia">
- The body's moment of inertia. This is like mass, but for rotation: it determines how much torque it takes to rotate the body. The moment of inertia is usually computed automatically from the mass and the shapes, but this function allows you to set a custom value. Set 0 (or negative) inertia to return to automatically computing it.
+ The body's moment of inertia. This is like mass, but for rotation: it determines how much torque it takes to rotate the body. The moment of inertia is usually computed automatically from the mass and the shapes, but this function allows you to set a custom value. Set 0 inertia to return to automatically computing it.
</member>
<member name="linear_damp" type="float" setter="set_linear_damp" getter="get_linear_damp" default="-1.0">
Damps the body's [member linear_velocity]. If [code]-1[/code], the body will use the [b]Default Linear Damp[/b] in [b]Project &gt; Project Settings &gt; Physics &gt; 2d[/b].
diff --git a/doc/classes/SceneTree.xml b/doc/classes/SceneTree.xml
index 1302c1e6bf..ed43f83f05 100644
--- a/doc/classes/SceneTree.xml
+++ b/doc/classes/SceneTree.xml
@@ -324,6 +324,15 @@
Emitted when files are dragged from the OS file manager and dropped in the game window. The arguments are a list of file paths and the identifier of the screen where the drag originated.
</description>
</signal>
+ <signal name="global_menu_action">
+ <argument index="0" name="id" type="Nil">
+ </argument>
+ <argument index="1" name="meta" type="Nil">
+ </argument>
+ <description>
+ Emitted whenever global menu item is clicked.
+ </description>
+ </signal>
<signal name="idle_frame">
<description>
Emitted immediately before [method Node._process] is called on every node in the [SceneTree].
diff --git a/doc/classes/SpriteBase3D.xml b/doc/classes/SpriteBase3D.xml
index 5529da909d..15d5d7beb4 100644
--- a/doc/classes/SpriteBase3D.xml
+++ b/doc/classes/SpriteBase3D.xml
@@ -46,6 +46,8 @@
<member name="axis" type="int" setter="set_axis" getter="get_axis" enum="Vector3.Axis" default="2">
The direction in which the front of the texture faces.
</member>
+ <member name="billboard" type="int" setter="set_billboard_mode" getter="get_billboard_mode" enum="SpatialMaterial.BillboardMode" default="0">
+ </member>
<member name="centered" type="bool" setter="set_centered" getter="is_centered" default="true">
If [code]true[/code], texture will be centered.
</member>
diff --git a/doc/classes/StreamPeerSSL.xml b/doc/classes/StreamPeerSSL.xml
index 9b5f4e7580..c960a794e2 100644
--- a/doc/classes/StreamPeerSSL.xml
+++ b/doc/classes/StreamPeerSSL.xml
@@ -13,7 +13,13 @@
<method name="accept_stream">
<return type="int" enum="Error">
</return>
- <argument index="0" name="base" type="StreamPeer">
+ <argument index="0" name="stream" type="StreamPeer">
+ </argument>
+ <argument index="1" name="private_key" type="CryptoKey">
+ </argument>
+ <argument index="2" name="certificate" type="X509Certificate">
+ </argument>
+ <argument index="3" name="chain" type="X509Certificate" default="null">
</argument>
<description>
</description>
@@ -27,6 +33,8 @@
</argument>
<argument index="2" name="for_hostname" type="String" default="&quot;&quot;">
</argument>
+ <argument index="3" name="valid_certificate" type="X509Certificate" default="null">
+ </argument>
<description>
Connects to a peer using an underlying [StreamPeer] [code]stream[/code]. If [code]validate_certs[/code] is [code]true[/code], [StreamPeerSSL] will validate that the certificate presented by the peer matches the [code]for_hostname[/code].
</description>
diff --git a/doc/classes/TextEdit.xml b/doc/classes/TextEdit.xml
index 22c769330d..fb5f20361b 100644
--- a/doc/classes/TextEdit.xml
+++ b/doc/classes/TextEdit.xml
@@ -418,6 +418,10 @@
<member name="highlight_current_line" type="bool" setter="set_highlight_current_line" getter="is_highlight_current_line_enabled" default="false">
If [code]true[/code], the line containing the cursor is highlighted.
</member>
+ <member name="minimap_draw" type="bool" setter="draw_minimap" getter="is_drawing_minimap" default="false">
+ </member>
+ <member name="minimap_width" type="int" setter="set_minimap_width" getter="get_minimap_width" default="80">
+ </member>
<member name="override_selected_font_color" type="bool" setter="set_override_selected_font_color" getter="is_overriding_selected_font_color" default="false">
</member>
<member name="readonly" type="bool" setter="set_readonly" getter="is_readonly" default="false">
diff --git a/doc/classes/Transform.xml b/doc/classes/Transform.xml
index 9916d25af5..6ebc389ed7 100644
--- a/doc/classes/Transform.xml
+++ b/doc/classes/Transform.xml
@@ -144,7 +144,7 @@
<argument index="0" name="v" type="Variant">
</argument>
<description>
- Transforms the given [Vector3], [Plane], or [AABB] by this transform.
+ Transforms the given [Vector3], [Plane], [AABB], or [PoolVector3Array] by this transform.
</description>
</method>
<method name="xform_inv">
@@ -153,7 +153,7 @@
<argument index="0" name="v" type="Variant">
</argument>
<description>
- Inverse-transforms the given [Vector3], [Plane], or [AABB] by this transform.
+ Inverse-transforms the given [Vector3], [Plane], [AABB], or [PoolVector3Array] by this transform.
</description>
</method>
</methods>
diff --git a/doc/classes/Transform2D.xml b/doc/classes/Transform2D.xml
index f6fce1aaa1..580da080b3 100644
--- a/doc/classes/Transform2D.xml
+++ b/doc/classes/Transform2D.xml
@@ -146,7 +146,7 @@
<argument index="0" name="v" type="Variant">
</argument>
<description>
- Transforms the given [Vector2] or [Rect2] by this transform.
+ Transforms the given [Vector2], [Rect2], or [PoolVector2Array] by this transform.
</description>
</method>
<method name="xform_inv">
@@ -155,7 +155,7 @@
<argument index="0" name="v" type="Variant">
</argument>
<description>
- Inverse-transforms the given [Vector2] or [Rect2] by this transform.
+ Inverse-transforms the given [Vector2], [Rect2], or [PoolVector2Array] by this transform.
</description>
</method>
</methods>
diff --git a/doc/classes/Tree.xml b/doc/classes/Tree.xml
index 62a7147e08..51d56c758e 100644
--- a/doc/classes/Tree.xml
+++ b/doc/classes/Tree.xml
@@ -16,7 +16,7 @@
var subchild1 = tree.create_item(child1)
subchild1.set_text(0, "Subchild1")
[/codeblock]
- To iterate over all the [TreeItem] objects in a [Tree] object, use [method TreeItem.get_next] and [method TreeItem.get_children] after getting the root through [get_root].
+ To iterate over all the [TreeItem] objects in a [Tree] object, use [method TreeItem.get_next] and [method TreeItem.get_children] after getting the root through [method get_root].
</description>
<tutorials>
</tutorials>
diff --git a/doc/classes/TreeItem.xml b/doc/classes/TreeItem.xml
index 56b4b21525..04deae6bf5 100644
--- a/doc/classes/TreeItem.xml
+++ b/doc/classes/TreeItem.xml
@@ -136,6 +136,15 @@
Returns the column's icon's maximum width.
</description>
</method>
+ <method name="get_icon_modulate" qualifiers="const">
+ <return type="Color">
+ </return>
+ <argument index="0" name="column" type="int">
+ </argument>
+ <description>
+ Returns the [Color] modulating the column's icon.
+ </description>
+ </method>
<method name="get_icon_region" qualifiers="const">
<return type="Rect2">
</return>
@@ -464,6 +473,17 @@
Sets the given column's icon's maximum width.
</description>
</method>
+ <method name="set_icon_modulate">
+ <return type="void">
+ </return>
+ <argument index="0" name="column" type="int">
+ </argument>
+ <argument index="1" name="modulate" type="Color">
+ </argument>
+ <description>
+ Modulates the given column's icon with [code]modulate[/code].
+ </description>
+ </method>
<method name="set_icon_region">
<return type="void">
</return>
diff --git a/doc/classes/Vector2.xml b/doc/classes/Vector2.xml
index 237b596fad..987ed9867b 100644
--- a/doc/classes/Vector2.xml
+++ b/doc/classes/Vector2.xml
@@ -203,6 +203,24 @@
Returns the vector scaled to unit length. Equivalent to [code]v / v.length()[/code].
</description>
</method>
+ <method name="posmod">
+ <return type="Vector2">
+ </return>
+ <argument index="0" name="mod" type="float">
+ </argument>
+ <description>
+ Returns a vector composed of the [code]fposmod[/code] of this vector's components and [code]mod[/code].
+ </description>
+ </method>
+ <method name="posmodv">
+ <return type="Vector2">
+ </return>
+ <argument index="0" name="modv" type="Vector2">
+ </argument>
+ <description>
+ Returns a vector composed of the [code]fposmod[/code] of this vector's components and [code]modv[/code]'s components.
+ </description>
+ </method>
<method name="project">
<return type="Vector2">
</return>
@@ -237,6 +255,13 @@
Returns the vector with all components rounded to the nearest integer, with halfway cases rounded away from zero.
</description>
</method>
+ <method name="sign">
+ <return type="Vector2">
+ </return>
+ <description>
+ Returns the vector with each component set to one or negative one, depending on the signs of the components.
+ </description>
+ </method>
<method name="slerp">
<return type="Vector2">
</return>
@@ -284,6 +309,12 @@
</member>
</members>
<constants>
+ <constant name="AXIS_X" value="0">
+ Enumerated value for the X axis.
+ </constant>
+ <constant name="AXIS_Y" value="1">
+ Enumerated value for the Y axis.
+ </constant>
<constant name="ZERO" value="Vector2( 0, 0 )">
Zero vector.
</constant>
@@ -291,7 +322,7 @@
One vector.
</constant>
<constant name="INF" value="Vector2( inf, inf )">
- Infinite vector.
+ Infinity vector.
</constant>
<constant name="LEFT" value="Vector2( -1, 0 )">
Left unit vector.
diff --git a/doc/classes/Vector3.xml b/doc/classes/Vector3.xml
index 3e1083ab69..05ce6c43ae 100644
--- a/doc/classes/Vector3.xml
+++ b/doc/classes/Vector3.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="Vector3" category="Built-In Types" version="3.2">
<brief_description>
- Vector class, which performs basic 3D vector math operations.
+ Vector used for 3D math.
</brief_description>
<description>
- Vector3 is one of the core classes of the engine, and includes several built-in helper functions to perform basic vector math operations.
+ 3-element structure that can be used to represent positions in 3D space or any other pair of numeric values.
</description>
<tutorials>
<link>https://docs.godotengine.org/en/latest/tutorials/math/index.html</link>
@@ -202,6 +202,24 @@
Returns the outer product with [code]b[/code].
</description>
</method>
+ <method name="posmod">
+ <return type="Vector3">
+ </return>
+ <argument index="0" name="mod" type="float">
+ </argument>
+ <description>
+ Returns a vector composed of the [code]fposmod[/code] of this vector's components and [code]mod[/code].
+ </description>
+ </method>
+ <method name="posmodv">
+ <return type="Vector3">
+ </return>
+ <argument index="0" name="modv" type="Vector3">
+ </argument>
+ <description>
+ Returns a vector composed of the [code]fposmod[/code] of this vector's components and [code]modv[/code]'s components.
+ </description>
+ </method>
<method name="project">
<return type="Vector3">
</return>
@@ -238,6 +256,13 @@
Returns the vector with all components rounded to the nearest integer, with halfway cases rounded away from zero.
</description>
</method>
+ <method name="sign">
+ <return type="Vector3">
+ </return>
+ <description>
+ Returns the vector with each component set to one or negative one, depending on the signs of the components.
+ </description>
+ </method>
<method name="slerp">
<return type="Vector3">
</return>
@@ -292,10 +317,10 @@
Enumerated value for the X axis. Returned by [method max_axis] and [method min_axis].
</constant>
<constant name="AXIS_Y" value="1">
- Enumerated value for the Y axis.
+ Enumerated value for the Y axis. Returned by [method max_axis] and [method min_axis].
</constant>
<constant name="AXIS_Z" value="2">
- Enumerated value for the Z axis.
+ Enumerated value for the Z axis. Returned by [method max_axis] and [method min_axis].
</constant>
<constant name="ZERO" value="Vector3( 0, 0, 0 )">
Zero vector.
@@ -304,7 +329,7 @@
One vector.
</constant>
<constant name="INF" value="Vector3( inf, inf, inf )">
- Infinite vector.
+ Infinity vector.
</constant>
<constant name="LEFT" value="Vector3( -1, 0, 0 )">
Left unit vector.
diff --git a/doc/classes/VisualShaderNode.xml b/doc/classes/VisualShaderNode.xml
index 19495a8859..3e80349b13 100644
--- a/doc/classes/VisualShaderNode.xml
+++ b/doc/classes/VisualShaderNode.xml
@@ -39,5 +39,20 @@
</signal>
</signals>
<constants>
+ <constant name="PORT_TYPE_SCALAR" value="0" enum="PortType">
+ Floating-point scalar. Translated to [code]float[/code] type in shader code.
+ </constant>
+ <constant name="PORT_TYPE_VECTOR" value="1" enum="PortType">
+ 3D vector of floating-point values. Translated to [code]vec3[/code] type in shader code.
+ </constant>
+ <constant name="PORT_TYPE_BOOLEAN" value="2" enum="PortType">
+ Boolean type. Translated to [code]bool[/code] type in shader code.
+ </constant>
+ <constant name="PORT_TYPE_TRANSFORM" value="3" enum="PortType">
+ Transform type. Translated to [code]mat4[/code] type in shader code.
+ </constant>
+ <constant name="PORT_TYPE_ICON_COLOR" value="4" enum="PortType">
+ Color type. Can be used for return icon type in members dialog (see [method VisualShaderNodeCustom._get_return_icon_type]) - do not use it in other cases!
+ </constant>
</constants>
</class>
diff --git a/doc/classes/VisualShaderNodeCustom.xml b/doc/classes/VisualShaderNodeCustom.xml
new file mode 100644
index 0000000000..9e58abae97
--- /dev/null
+++ b/doc/classes/VisualShaderNodeCustom.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="VisualShaderNodeCustom" inherits="VisualShaderNode" category="Core" version="3.2">
+ <brief_description>
+ Virtual class to define custom [VisualShaderNode]s for use in the Visual Shader Editor.
+ </brief_description>
+ <description>
+ By inheriting this class you can create a custom [VisualShader] script addon which will be automatically added to the Visual Shader Editor. The [VisualShaderNode]'s behavior is defined by overriding the provided virtual methods.
+ In order for the node to be registered as an editor addon, you must use the [code]tool[/code] keyword and provide a [code]class_name[/code] for your custom script. For example:
+ [codeblock]
+ tool
+ extends VisualShaderNodeCustom
+ class_name VisualShaderNodeNoise
+ [/codeblock]
+ </description>
+ <tutorials>
+ <link>http://docs.godotengine.org/en/latest/tutorials/plugins/editor/visual_shader_plugins.html</link>
+ </tutorials>
+ <methods>
+ <method name="_get_category" qualifiers="virtual">
+ <return type="String">
+ </return>
+ <description>
+ Override this method to define the category of the associated custom node in the Visual Shader Editor's members dialog.
+ Defining this method is [b]optional[/b]. If not overridden, the node will be filed under the "Custom" category.
+ </description>
+ </method>
+ <method name="_get_code" qualifiers="virtual">
+ <return type="String">
+ </return>
+ <argument index="0" name="input_vars" type="Array">
+ </argument>
+ <argument index="1" name="output_vars" type="Array">
+ </argument>
+ <argument index="2" name="mode" type="int">
+ </argument>
+ <argument index="3" name="type" type="int">
+ </argument>
+ <description>
+ Override this method to define the actual shader code of the associated custom node. The shader code should be returned as a string, which can have multiple lines (the [code]"""[/code] multiline string construct can be used for convenience).
+ The [code]input_vars[/code] and [code]output_vars[/code] arrays contain the string names of the various input and output variables, as defined by [code]_get_input_*[/code] and [code]_get_output_*[/code] virtual methods in this class.
+ The output ports can be assigned values in the shader code. For example, [code]return output_vars[0] + " = " + input_vars[0] + ";"[/code].
+ You can customize the generated code based on the shader [code]mode[/code] (see [enum Shader.Mode]) and/or [code]type[/code] (see [enum VisualShader.Type]).
+ Defining this method is [b]required[/b].
+ </description>
+ </method>
+ <method name="_get_description" qualifiers="virtual">
+ <return type="String">
+ </return>
+ <description>
+ Override this method to define the description of the associated custom node in the Visual Shader Editor's members dialog.
+ Defining this method is [b]optional[/b].
+ </description>
+ </method>
+ <method name="_get_global_code" qualifiers="virtual">
+ <return type="String">
+ </return>
+ <argument index="0" name="mode" type="int">
+ </argument>
+ <description>
+ Override this method to add shader code on top of the global shader, to define your own standard library of reusable methods, varyings, constants, uniforms, etc. The shader code should be returned as a string, which can have multiple lines (the [code]"""[/code] multiline string construct can be used for convenience).
+ Be careful with this functionality as it can cause name conflicts with other custom nodes, so be sure to give the defined entities unique names.
+ You can customize the generated code based on the shader [code]mode[/code] (see [enum Shader.Mode]).
+ Defining this method is [b]optional[/b].
+ </description>
+ </method>
+ <method name="_get_input_port_count" qualifiers="virtual">
+ <return type="int">
+ </return>
+ <description>
+ Override this method to define the amount of input ports of the associated custom node.
+ Defining this method is [b]required[/b]. If not overridden, the node has no input ports.
+ </description>
+ </method>
+ <method name="_get_input_port_name" qualifiers="virtual">
+ <return type="String">
+ </return>
+ <argument index="0" name="port" type="int">
+ </argument>
+ <description>
+ Override this method to define the names of input ports of the associated custom node. The names are used both for the input slots in the editor and as identifiers in the shader code, and are passed in the [code]input_vars[/code] array in [method _get_code].
+ Defining this method is [b]optional[/b], but recommended. If not overridden, input ports are named as [code]"in" + str(port)[/code].
+ </description>
+ </method>
+ <method name="_get_input_port_type" qualifiers="virtual">
+ <return type="int">
+ </return>
+ <argument index="0" name="port" type="int">
+ </argument>
+ <description>
+ Override this method to define the returned type of each input port of the associated custom node (see [enum VisualShaderNode.PortType] for possible types).
+ Defining this method is [b]optional[/b], but recommended. If not overridden, input ports will return the [constant VisualShaderNode.PORT_TYPE_SCALAR] type.
+ </description>
+ </method>
+ <method name="_get_name" qualifiers="virtual">
+ <return type="String">
+ </return>
+ <description>
+ Override this method to define the name of the associated custom node in the Visual Shader Editor's members dialog and graph.
+ Defining this method is [b]optional[/b], but recommended. If not overridden, the node will be named as "Unnamed".
+ </description>
+ </method>
+ <method name="_get_output_port_count" qualifiers="virtual">
+ <return type="int">
+ </return>
+ <description>
+ Override this method to define the amount of output ports of the associated custom node.
+ Defining this method is [b]required[/b]. If not overridden, the node has no output ports.
+ </description>
+ </method>
+ <method name="_get_output_port_name" qualifiers="virtual">
+ <return type="String">
+ </return>
+ <argument index="0" name="port" type="int">
+ </argument>
+ <description>
+ Override this method to define the names of output ports of the associated custom node. The names are used both for the output slots in the editor and as identifiers in the shader code, and are passed in the [code]output_vars[/code] array in [method _get_code].
+ Defining this method is [b]optional[/b], but recommended. If not overridden, output ports are named as [code]"out" + str(port)[/code].
+ </description>
+ </method>
+ <method name="_get_output_port_type" qualifiers="virtual">
+ <return type="int">
+ </return>
+ <argument index="0" name="port" type="int">
+ </argument>
+ <description>
+ Override this method to define the returned type of each output port of the associated custom node (see [enum VisualShaderNode.PortType] for possible types).
+ Defining this method is [b]optional[/b], but recommended. If not overridden, output ports will return the [constant VisualShaderNode.PORT_TYPE_SCALAR] type.
+ </description>
+ </method>
+ <method name="_get_return_icon_type" qualifiers="virtual">
+ <return type="int">
+ </return>
+ <description>
+ Override this method to define the return icon of the associated custom node in the Visual Shader Editor's members dialog.
+ Defining this method is [b]optional[/b]. If not overridden, no return icon is shown.
+ </description>
+ </method>
+ <method name="_get_subcategory" qualifiers="virtual">
+ <return type="String">
+ </return>
+ <description>
+ Override this method to define the subcategory of the associated custom node in the Visual Shader Editor's members dialog.
+ Defining this method is [b]optional[/b]. If not overridden, the node will be filed under the root of the main category (see [method _get_category]).
+ </description>
+ </method>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/VisualShaderNodeGlobalExpression.xml b/doc/classes/VisualShaderNodeGlobalExpression.xml
new file mode 100644
index 0000000000..3c5a26bf47
--- /dev/null
+++ b/doc/classes/VisualShaderNodeGlobalExpression.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="VisualShaderNodeGlobalExpression" inherits="VisualShaderNodeExpression" category="Core" version="3.2">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/VisualShaderNodeGroupBase.xml b/doc/classes/VisualShaderNodeGroupBase.xml
index c2e9b9503b..d32a63d605 100644
--- a/doc/classes/VisualShaderNodeGroupBase.xml
+++ b/doc/classes/VisualShaderNodeGroupBase.xml
@@ -208,6 +208,10 @@
</description>
</method>
</methods>
+ <members>
+ <member name="editable" type="bool" setter="set_editable" getter="is_editable" default="false">
+ </member>
+ </members>
<constants>
</constants>
</class>
diff --git a/doc/classes/VisualShaderNodeVectorScalarMix.xml b/doc/classes/VisualShaderNodeVectorScalarMix.xml
new file mode 100644
index 0000000000..d83c2e7d44
--- /dev/null
+++ b/doc/classes/VisualShaderNodeVectorScalarMix.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="VisualShaderNodeVectorScalarMix" inherits="VisualShaderNode" category="Core" version="3.2">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/X509Certificate.xml b/doc/classes/X509Certificate.xml
new file mode 100644
index 0000000000..013f768843
--- /dev/null
+++ b/doc/classes/X509Certificate.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="X509Certificate" inherits="Resource" category="Core" version="3.2">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <methods>
+ <method name="load">
+ <return type="int" enum="Error">
+ </return>
+ <argument index="0" name="path" type="String">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="save">
+ <return type="int" enum="Error">
+ </return>
+ <argument index="0" name="path" type="String">
+ </argument>
+ <description>
+ </description>
+ </method>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/drivers/gles2/rasterizer_canvas_gles2.cpp b/drivers/gles2/rasterizer_canvas_gles2.cpp
index 4716b29e03..6be48a4c58 100644
--- a/drivers/gles2/rasterizer_canvas_gles2.cpp
+++ b/drivers/gles2/rasterizer_canvas_gles2.cpp
@@ -1265,14 +1265,11 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur
void RasterizerCanvasGLES2::_copy_screen(const Rect2 &p_rect) {
if (storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_DIRECT_TO_SCREEN]) {
- ERR_PRINT_ONCE("Cannot use screen texture copying in render target set to render direct to screen");
+ ERR_PRINT_ONCE("Cannot use screen texture copying in render target set to render direct to screen.");
return;
}
- if (storage->frame.current_rt->copy_screen_effect.color == 0) {
- ERR_EXPLAIN("Can't use screen texture copying in a render target configured without copy buffers");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(storage->frame.current_rt->copy_screen_effect.color == 0, "Can't use screen texture copying in a render target configured without copy buffers.");
glDisable(GL_BLEND);
diff --git a/drivers/gles2/rasterizer_scene_gles2.cpp b/drivers/gles2/rasterizer_scene_gles2.cpp
index 453abeb853..cc414c26af 100644
--- a/drivers/gles2/rasterizer_scene_gles2.cpp
+++ b/drivers/gles2/rasterizer_scene_gles2.cpp
@@ -882,8 +882,7 @@ RID RasterizerSceneGLES2::light_instance_create(RID p_light) {
if (!light_instance->light_ptr) {
memdelete(light_instance);
- ERR_EXPLAIN("Condition ' !light_instance->light_ptr ' is true.");
- ERR_FAIL_V(RID());
+ ERR_FAIL_V_MSG(RID(), "Condition ' !light_instance->light_ptr ' is true.");
}
light_instance->self = light_instance_owner.make_rid(light_instance);
diff --git a/drivers/gles2/rasterizer_storage_gles2.cpp b/drivers/gles2/rasterizer_storage_gles2.cpp
index a30af87516..5c02d8096d 100644
--- a/drivers/gles2/rasterizer_storage_gles2.cpp
+++ b/drivers/gles2/rasterizer_storage_gles2.cpp
@@ -1570,7 +1570,7 @@ void RasterizerStorageGLES2::shader_get_param_list(RID p_shader, List<PropertyIn
if (u.hint == ShaderLanguage::ShaderNode::Uniform::HINT_RANGE) {
pi.hint = PROPERTY_HINT_RANGE;
- pi.hint_string = rtos(u.hint_range[0]) + "," + rtos(u.hint_range[1]);
+ pi.hint_string = rtos(u.hint_range[0]) + "," + rtos(u.hint_range[1]) + "," + rtos(u.hint_range[2]);
}
} break;
@@ -2171,8 +2171,7 @@ void RasterizerStorageGLES2::mesh_add_surface(RID p_mesh, uint32_t p_format, VS:
//must have index and bones, both.
{
uint32_t bones_weight = VS::ARRAY_FORMAT_BONES | VS::ARRAY_FORMAT_WEIGHTS;
- ERR_EXPLAIN("Array must have both bones and weights in format or none.");
- ERR_FAIL_COND((p_format & bones_weight) && (p_format & bones_weight) != bones_weight);
+ ERR_FAIL_COND_MSG((p_format & bones_weight) && (p_format & bones_weight) != bones_weight, "Array must have both bones and weights in format or none.");
}
//bool has_morph = p_blend_shapes.size();
@@ -3497,6 +3496,8 @@ RID RasterizerStorageGLES2::skeleton_create() {
Skeleton *skeleton = memnew(Skeleton);
+ glGenTextures(1, &skeleton->tex_id);
+
return skeleton_owner.make_rid(skeleton);
}
@@ -3514,7 +3515,6 @@ void RasterizerStorageGLES2::skeleton_allocate(RID p_skeleton, int p_bones, bool
skeleton->use_2d = p_2d_skeleton;
if (config.float_texture_supported) {
- glGenTextures(1, &skeleton->tex_id);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, skeleton->tex_id);
diff --git a/drivers/gles2/shader_compiler_gles2.cpp b/drivers/gles2/shader_compiler_gles2.cpp
index 935cb32fda..640d45ae65 100644
--- a/drivers/gles2/shader_compiler_gles2.cpp
+++ b/drivers/gles2/shader_compiler_gles2.cpp
@@ -758,11 +758,13 @@ String ShaderCompilerGLES2::_dump_node_code(SL::Node *p_node, int p_level, Gener
} break;
case SL::OP_SELECT_IF: {
+ code += "(";
code += _dump_node_code(op_node->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
code += " ? ";
code += _dump_node_code(op_node->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
code += " : ";
code += _dump_node_code(op_node->arguments[2], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
+ code += ")";
} break;
case SL::OP_MOD: {
@@ -802,6 +804,23 @@ String ShaderCompilerGLES2::_dump_node_code(SL::Node *p_node, int p_level, Gener
code += "else\n";
code += _dump_node_code(cf_node->blocks[1], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
}
+ } else if (cf_node->flow_op == SL::FLOW_OP_SWITCH) {
+ code += _mktab(p_level) + "switch (" + _dump_node_code(cf_node->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ")\n";
+ code += _dump_node_code(cf_node->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
+ } else if (cf_node->flow_op == SL::FLOW_OP_CASE) {
+ code += _mktab(p_level) + "case " + _dump_node_code(cf_node->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ":\n";
+ code += _dump_node_code(cf_node->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
+ } else if (cf_node->flow_op == SL::FLOW_OP_DEFAULT) {
+ code += _mktab(p_level) + "default:\n";
+ code += _dump_node_code(cf_node->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
+ } else if (cf_node->flow_op == SL::FLOW_OP_DO) {
+ code += _mktab(p_level);
+ code += "do";
+ code += _dump_node_code(cf_node->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
+ code += _mktab(p_level);
+ code += "while (";
+ code += _dump_node_code(cf_node->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
+ code += ");";
} else if (cf_node->flow_op == SL::FLOW_OP_WHILE) {
code += _mktab(p_level);
code += "while (";
@@ -900,7 +919,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
actions[VS::SHADER_CANVAS_ITEM].renames["WORLD_MATRIX"] = "modelview_matrix";
actions[VS::SHADER_CANVAS_ITEM].renames["PROJECTION_MATRIX"] = "projection_matrix";
- actions[VS::SHADER_CANVAS_ITEM].renames["EXTRA_MATRIX"] = "extra_matrix";
+ actions[VS::SHADER_CANVAS_ITEM].renames["EXTRA_MATRIX"] = "extra_matrix_instance";
actions[VS::SHADER_CANVAS_ITEM].renames["TIME"] = "time";
actions[VS::SHADER_CANVAS_ITEM].renames["AT_LIGHT_PASS"] = "at_light_pass";
actions[VS::SHADER_CANVAS_ITEM].renames["INSTANCE_CUSTOM"] = "instance_custom";
@@ -947,6 +966,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
actions[VS::SHADER_CANVAS_ITEM].usage_defines["outerProduct"] = "#define OUTER_PRODUCT_USED\n";
actions[VS::SHADER_CANVAS_ITEM].usage_defines["round"] = "#define ROUND_USED\n";
actions[VS::SHADER_CANVAS_ITEM].usage_defines["roundEven"] = "#define ROUND_EVEN_USED\n";
+ actions[VS::SHADER_CANVAS_ITEM].usage_defines["inverse"] = "#define INVERSE_USED\n";
actions[VS::SHADER_CANVAS_ITEM].usage_defines["isinf"] = "#define IS_INF_USED\n";
actions[VS::SHADER_CANVAS_ITEM].usage_defines["isnan"] = "#define IS_NAN_USED\n";
actions[VS::SHADER_CANVAS_ITEM].usage_defines["trunc"] = "#define TRUNC_USED\n";
@@ -1056,6 +1076,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
actions[VS::SHADER_SPATIAL].usage_defines["outerProduct"] = "#define OUTER_PRODUCT_USED\n";
actions[VS::SHADER_SPATIAL].usage_defines["round"] = "#define ROUND_USED\n";
actions[VS::SHADER_SPATIAL].usage_defines["roundEven"] = "#define ROUND_EVEN_USED\n";
+ actions[VS::SHADER_SPATIAL].usage_defines["inverse"] = "#define INVERSE_USED\n";
actions[VS::SHADER_SPATIAL].usage_defines["isinf"] = "#define IS_INF_USED\n";
actions[VS::SHADER_SPATIAL].usage_defines["isnan"] = "#define IS_NAN_USED\n";
actions[VS::SHADER_SPATIAL].usage_defines["trunc"] = "#define TRUNC_USED\n";
diff --git a/drivers/gles2/shaders/stdlib.glsl b/drivers/gles2/shaders/stdlib.glsl
index 96421fcb4a..9c74418743 100644
--- a/drivers/gles2/shaders/stdlib.glsl
+++ b/drivers/gles2/shaders/stdlib.glsl
@@ -299,6 +299,81 @@ highp float determinant(highp mat4 m) {
#endif
+#if defined(INVERSE_USED)
+
+highp mat2 inverse(highp mat2 m) {
+ highp float d = 1.0 / (m[0].x * m[1].y - m[1].x * m[0].y);
+ return mat2(
+ vec2(m[1].y * d, -m[0].y * d),
+ vec2(-m[1].x * d, m[0].x * d));
+}
+
+highp mat3 inverse(highp mat3 m) {
+ highp float d = 1.0 / (m[0].x * (m[1].y * m[2].z - m[2].y * m[1].z) - m[1].x * (m[0].y * m[2].z - m[2].y * m[0].z) + m[2].x * (m[0].y * m[1].z - m[1].y * m[0].z));
+ return mat3(
+ vec3((m[1].y * m[2].z - m[2].y * m[1].z), -(m[1].x * m[2].z - m[2].x * m[1].z), (m[1].x * m[2].y - m[2].x * m[1].y)) * d,
+ vec3(-(m[0].y * m[2].z - m[2].y * m[0].z), (m[0].x * m[2].z - m[2].x * m[0].z), -(m[0].x * m[2].y - m[2].x * m[0].y)) * d,
+ vec3((m[0].y * m[1].z - m[1].y * m[0].z), -(m[0].x * m[1].z - m[1].x * m[0].z), (m[0].x * m[1].y - m[1].x * m[0].y)) * d);
+}
+
+highp mat4 inverse(highp mat4 m) {
+ highp float c00 = m[2].z * m[3].w - m[3].z * m[2].w;
+ highp float c02 = m[1].z * m[3].w - m[3].z * m[1].w;
+ highp float c03 = m[1].z * m[2].w - m[2].z * m[1].w;
+
+ highp float c04 = m[2].y * m[3].w - m[3].y * m[2].w;
+ highp float c06 = m[1].y * m[3].w - m[3].y * m[1].w;
+ highp float c07 = m[1].y * m[2].w - m[2].y * m[1].w;
+
+ highp float c08 = m[2].y * m[3].z - m[3].y * m[2].z;
+ highp float c10 = m[1].y * m[3].z - m[3].y * m[1].z;
+ highp float c11 = m[1].y * m[2].z - m[2].y * m[1].z;
+
+ highp float c12 = m[2].x * m[3].w - m[3].x * m[2].w;
+ highp float c14 = m[1].x * m[3].w - m[3].x * m[1].w;
+ highp float c15 = m[1].x * m[2].w - m[2].x * m[1].w;
+
+ highp float c16 = m[2].x * m[3].z - m[3].x * m[2].z;
+ highp float c18 = m[1].x * m[3].z - m[3].x * m[1].z;
+ highp float c19 = m[1].x * m[2].z - m[2].x * m[1].z;
+
+ highp float c20 = m[2].x * m[3].y - m[3].x * m[2].y;
+ highp float c22 = m[1].x * m[3].y - m[3].x * m[1].y;
+ highp float c23 = m[1].x * m[2].y - m[2].x * m[1].y;
+
+ vec4 f0 = vec4(c00, c00, c02, c03);
+ vec4 f1 = vec4(c04, c04, c06, c07);
+ vec4 f2 = vec4(c08, c08, c10, c11);
+ vec4 f3 = vec4(c12, c12, c14, c15);
+ vec4 f4 = vec4(c16, c16, c18, c19);
+ vec4 f5 = vec4(c20, c20, c22, c23);
+
+ vec4 v0 = vec4(m[1].x, m[0].x, m[0].x, m[0].x);
+ vec4 v1 = vec4(m[1].y, m[0].y, m[0].y, m[0].y);
+ vec4 v2 = vec4(m[1].z, m[0].z, m[0].z, m[0].z);
+ vec4 v3 = vec4(m[1].w, m[0].w, m[0].w, m[0].w);
+
+ vec4 inv0 = vec4(v1 * f0 - v2 * f1 + v3 * f2);
+ vec4 inv1 = vec4(v0 * f0 - v2 * f3 + v3 * f4);
+ vec4 inv2 = vec4(v0 * f1 - v1 * f3 + v3 * f5);
+ vec4 inv3 = vec4(v0 * f2 - v1 * f4 + v2 * f5);
+
+ vec4 sa = vec4(+1, -1, +1, -1);
+ vec4 sb = vec4(-1, +1, -1, +1);
+
+ mat4 inv = mat4(inv0 * sa, inv1 * sb, inv2 * sa, inv3 * sb);
+
+ vec4 r0 = vec4(inv[0].x, inv[1].x, inv[2].x, inv[3].x);
+ vec4 d0 = vec4(m[0] * r0);
+
+ highp float d1 = (d0.x + d0.y) + (d0.z + d0.w);
+ highp float d = 1.0 / d1;
+
+ return inv * d;
+}
+
+#endif
+
#ifndef USE_GLES_OVER_GL
#if defined(TRANSPOSE_USED)
diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp
index 1a97225e6b..edffe852a2 100644
--- a/drivers/gles3/rasterizer_canvas_gles3.cpp
+++ b/drivers/gles3/rasterizer_canvas_gles3.cpp
@@ -1156,10 +1156,7 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur
void RasterizerCanvasGLES3::_copy_texscreen(const Rect2 &p_rect) {
- if (storage->frame.current_rt->effects.mip_maps[0].sizes.size() == 0) {
- ERR_EXPLAIN("Can't use screen texture copying in a render target configured without copy buffers");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(storage->frame.current_rt->effects.mip_maps[0].sizes.size() == 0, "Can't use screen texture copying in a render target configured without copy buffers.");
glDisable(GL_BLEND);
diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp
index 30ca07aa28..1472954ebc 100644
--- a/drivers/gles3/rasterizer_scene_gles3.cpp
+++ b/drivers/gles3/rasterizer_scene_gles3.cpp
@@ -1008,8 +1008,7 @@ RID RasterizerSceneGLES3::light_instance_create(RID p_light) {
if (!light_instance->light_ptr) {
memdelete(light_instance);
- ERR_EXPLAIN("Condition ' !light_instance->light_ptr ' is true.");
- ERR_FAIL_V(RID());
+ ERR_FAIL_V_MSG(RID(), "Condition ' !light_instance->light_ptr ' is true.");
}
light_instance->self = light_instance_owner.make_rid(light_instance);
@@ -1121,13 +1120,23 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material *p_m
if (state.current_depth_draw != p_material->shader->spatial.depth_draw_mode) {
switch (p_material->shader->spatial.depth_draw_mode) {
- case RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS:
+ case RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS: {
+ glDepthMask(GL_TRUE);
+ // If some transparent objects write to depth, we need to re-copy depth texture when we need it
+ if (p_alpha_pass && !state.used_depth_prepass) {
+ state.prepared_depth_texture = false;
+ }
+ } break;
case RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_OPAQUE: {
glDepthMask(!p_alpha_pass);
} break;
case RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALWAYS: {
glDepthMask(GL_TRUE);
+ // If some transparent objects write to depth, we need to re-copy depth texture when we need it
+ if (p_alpha_pass) {
+ state.prepared_depth_texture = false;
+ }
} break;
case RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_NEVER: {
glDepthMask(GL_FALSE);
@@ -4616,6 +4625,8 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
return;
}
+ if (env && (env->dof_blur_far_enabled || env->dof_blur_near_enabled) && storage->frame.current_rt && storage->frame.current_rt->buffers.active)
+ _prepare_depth_texture();
_post_process(env, p_cam_projection);
// Needed only for debugging
/* if (shadow_atlas && storage->frame.current_rt) {
diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp
index c7040c232b..5f4acbc2de 100644
--- a/drivers/gles3/rasterizer_storage_gles3.cpp
+++ b/drivers/gles3/rasterizer_storage_gles3.cpp
@@ -2247,7 +2247,7 @@ void RasterizerStorageGLES3::shader_get_param_list(RID p_shader, List<PropertyIn
pi.type = Variant::INT;
if (u.hint == ShaderLanguage::ShaderNode::Uniform::HINT_RANGE) {
pi.hint = PROPERTY_HINT_RANGE;
- pi.hint_string = rtos(u.hint_range[0]) + "," + rtos(u.hint_range[1]);
+ pi.hint_string = rtos(u.hint_range[0]) + "," + rtos(u.hint_range[1]) + "," + rtos(u.hint_range[2]);
}
} break;
@@ -3191,8 +3191,7 @@ void RasterizerStorageGLES3::mesh_add_surface(RID p_mesh, uint32_t p_format, VS:
//must have index and bones, both.
{
uint32_t bones_weight = VS::ARRAY_FORMAT_BONES | VS::ARRAY_FORMAT_WEIGHTS;
- ERR_EXPLAIN("Array must have both bones and weights in format or none.");
- ERR_FAIL_COND((p_format & bones_weight) && (p_format & bones_weight) != bones_weight);
+ ERR_FAIL_COND_MSG((p_format & bones_weight) && (p_format & bones_weight) != bones_weight, "Array must have both bones and weights in format or none.");
}
//bool has_morph = p_blend_shapes.size();
diff --git a/drivers/gles3/shader_compiler_gles3.cpp b/drivers/gles3/shader_compiler_gles3.cpp
index d48ee7709c..0121d88f4d 100644
--- a/drivers/gles3/shader_compiler_gles3.cpp
+++ b/drivers/gles3/shader_compiler_gles3.cpp
@@ -772,11 +772,13 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener
} break;
case SL::OP_SELECT_IF: {
+ code += "(";
code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
code += "?";
code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
code += ":";
code += _dump_node_code(onode->arguments[2], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
+ code += ")";
} break;
@@ -799,6 +801,20 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener
code += _mktab(p_level) + "else\n";
code += _dump_node_code(cfnode->blocks[1], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
}
+ } else if (cfnode->flow_op == SL::FLOW_OP_SWITCH) {
+ code += _mktab(p_level) + "switch (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ")\n";
+ code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
+ } else if (cfnode->flow_op == SL::FLOW_OP_CASE) {
+ code += _mktab(p_level) + "case " + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ":\n";
+ code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
+ } else if (cfnode->flow_op == SL::FLOW_OP_DEFAULT) {
+ code += _mktab(p_level) + "default:\n";
+ code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
+ } else if (cfnode->flow_op == SL::FLOW_OP_DO) {
+ code += _mktab(p_level) + "do";
+ code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
+ code += _mktab(p_level) + "while (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ");";
+
} else if (cfnode->flow_op == SL::FLOW_OP_WHILE) {
code += _mktab(p_level) + "while (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ")\n";
diff --git a/drivers/gles3/shader_gles3.h b/drivers/gles3/shader_gles3.h
index be2c34ba07..d8d49868f4 100644
--- a/drivers/gles3/shader_gles3.h
+++ b/drivers/gles3/shader_gles3.h
@@ -45,10 +45,6 @@
#include <stdio.h>
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class ShaderGLES3 {
protected:
struct Enum {
diff --git a/drivers/gles3/shaders/copy.glsl b/drivers/gles3/shaders/copy.glsl
index 232b9ce7c0..1952e201aa 100644
--- a/drivers/gles3/shaders/copy.glsl
+++ b/drivers/gles3/shaders/copy.glsl
@@ -165,11 +165,11 @@ void main() {
#elif defined(USE_ASYM_PANO)
// When an asymmetrical projection matrix is used (applicable for stereoscopic rendering i.e. VR) we need to do this calculation per fragment to get a perspective correct result.
- // Note that we're ignoring the x-offset for IPD, with Z sufficiently in the distance it becomes neglectible, as a result we could probably just set cube_normal.z to -1.
+ // Asymmetrical projection means the center of projection is no longer in the center of the screen but shifted.
// The Matrix[2][0] (= asym_proj.x) and Matrix[2][1] (= asym_proj.z) values are what provide the right shift in the image.
vec3 cube_normal;
- cube_normal.z = -1000000.0;
+ cube_normal.z = -1.0;
cube_normal.x = (cube_normal.z * (-uv_interp.x - asym_proj.x)) / asym_proj.y;
cube_normal.y = (cube_normal.z * (-uv_interp.y - asym_proj.z)) / asym_proj.a;
cube_normal = mat3(sky_transform) * mat3(pano_transform) * cube_normal;
diff --git a/drivers/gles3/shaders/tonemap.glsl b/drivers/gles3/shaders/tonemap.glsl
index 626968bc05..f1fe1742eb 100644
--- a/drivers/gles3/shaders/tonemap.glsl
+++ b/drivers/gles3/shaders/tonemap.glsl
@@ -164,7 +164,8 @@ vec3 linear_to_srgb(vec3 color) { // convert linear rgb to srgb, assumes clamped
return mix((vec3(1.0f) + a) * pow(color.rgb, vec3(1.0f / 2.4f)) - a, 12.92f * color.rgb, lessThan(color.rgb, vec3(0.0031308f)));
}
-vec3 apply_tonemapping(vec3 color, float white) { // inputs are LINEAR, always outputs clamped [0;1] color
+// inputs are LINEAR, If Linear tonemapping is selected no transform is performed else outputs are clamped [0, 1] color
+vec3 apply_tonemapping(vec3 color, float white) {
#ifdef USE_REINHARD_TONEMAPPER
return tonemap_reinhard(color, white);
#endif
@@ -177,7 +178,7 @@ vec3 apply_tonemapping(vec3 color, float white) { // inputs are LINEAR, always o
return tonemap_aces(color, white);
#endif
- return clamp(color, vec3(0.0f), vec3(1.0f)); // no other selected -> linear
+ return color; // no other selected -> linear: no color transform applied
}
vec3 gather_glow(sampler2D tex, vec2 uv) { // sample all selected glow levels
@@ -220,10 +221,14 @@ vec3 apply_glow(vec3 color, vec3 glow) { // apply glow using the selected blendi
#endif
#ifdef USE_GLOW_SCREEN
+ //need color clamping
+ color = clamp(color, vec3(0.0f), vec3(1.0f));
color = max((color + glow) - (color * glow), vec3(0.0));
#endif
#ifdef USE_GLOW_SOFTLIGHT
+ //need color clamping
+ color = clamp(color, vec3(0.0f), vec3(1.0));
glow = glow * vec3(0.5f) + vec3(0.5f);
color.r = (glow.r <= 0.5f) ? (color.r - (1.0f - 2.0f * glow.r) * color.r * (1.0f - color.r)) : (((glow.r > 0.5f) && (color.r <= 0.25f)) ? (color.r + (2.0f * glow.r - 1.0f) * (4.0f * color.r * (4.0f * color.r + 1.0f) * (color.r - 1.0f) + 7.0f * color.r)) : (color.r + (2.0f * glow.r - 1.0f) * (sqrt(color.r) - color.r)));
@@ -265,14 +270,16 @@ void main() {
color *= exposure;
- // Early Tonemap & SRGB Conversion
+ // Early Tonemap & SRGB Conversion; note that Linear tonemapping does not clamp to [0, 1]; some operations below expect a [0, 1] range and will clamp
color = apply_tonemapping(color, white);
#ifdef KEEP_3D_LINEAR
// leave color as is (-> don't convert to SRGB)
#else
- color = linear_to_srgb(color); // regular linear -> SRGB conversion
+ //need color clamping
+ color = clamp(color, vec3(0.0f), vec3(1.0f));
+ color = linear_to_srgb(color); // regular linear -> SRGB conversion (needs clamped values)
#endif
// Glow
@@ -282,6 +289,7 @@ void main() {
// high dynamic range -> SRGB
glow = apply_tonemapping(glow, white);
+ glow = clamp(glow, vec3(0.0f), vec3(1.0f));
glow = linear_to_srgb(glow);
color = apply_glow(color, glow);
diff --git a/drivers/png/image_loader_png.h b/drivers/png/image_loader_png.h
index cc789f95d6..c910c31f1e 100644
--- a/drivers/png/image_loader_png.h
+++ b/drivers/png/image_loader_png.h
@@ -33,9 +33,6 @@
#include "core/io/image_loader.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class ImageLoaderPNG : public ImageFormatLoader {
private:
static PoolVector<uint8_t> lossless_pack_png(const Ref<Image> &p_image);
diff --git a/drivers/png/png_driver_common.cpp b/drivers/png/png_driver_common.cpp
index 0e849bf2fe..7deac1d118 100644
--- a/drivers/png/png_driver_common.cpp
+++ b/drivers/png/png_driver_common.cpp
@@ -97,7 +97,7 @@ Error png_to_image(const uint8_t *p_source, size_t p_size, Ref<Image> p_image) {
break;
default:
png_image_free(&png_img); // only required when we return before finish_read
- ERR_PRINT("Unsupported png format");
+ ERR_PRINT("Unsupported png format.");
return ERR_UNAVAILABLE;
}
@@ -179,10 +179,9 @@ Error image_to_png(const Ref<Image> &p_image, PoolVector<uint8_t> &p_buffer) {
ERR_FAIL_COND_V(check_error(png_img), FAILED);
}
if (!success) {
- if (compressed_size <= png_size_estimate) {
- // buffer was big enough, must be some other error
- ERR_FAIL_V(FAILED);
- }
+
+ // buffer was big enough, must be some other error
+ ERR_FAIL_COND_V(compressed_size <= png_size_estimate, FAILED);
// write failed due to buffer size, resize and retry
Error err = p_buffer.resize(buffer_offset + compressed_size);
diff --git a/drivers/png/resource_saver_png.cpp b/drivers/png/resource_saver_png.cpp
index 43a30f055b..3b3f1506dc 100644
--- a/drivers/png/resource_saver_png.cpp
+++ b/drivers/png/resource_saver_png.cpp
@@ -39,9 +39,8 @@ Error ResourceSaverPNG::save(const String &p_path, const RES &p_resource, uint32
Ref<ImageTexture> texture = p_resource;
- ERR_FAIL_COND_V(!texture.is_valid(), ERR_INVALID_PARAMETER);
- ERR_EXPLAIN("Can't save empty texture as PNG");
- ERR_FAIL_COND_V(!texture->get_width() || !texture->get_height(), ERR_INVALID_PARAMETER);
+ ERR_FAIL_COND_V_MSG(!texture.is_valid(), ERR_INVALID_PARAMETER, "Can't save invalid texture as PNG.");
+ ERR_FAIL_COND_V_MSG(!texture->get_width(), ERR_INVALID_PARAMETER, "Can't save empty texture as PNG.");
Ref<Image> img = texture->get_data();
@@ -54,9 +53,9 @@ Error ResourceSaverPNG::save_image(const String &p_path, const Ref<Image> &p_img
PoolVector<uint8_t> buffer;
Error err = PNGDriverCommon::image_to_png(p_img, buffer);
- ERR_FAIL_COND_V(err, err);
+ ERR_FAIL_COND_V_MSG(err, err, "Can't convert image to PNG.");
FileAccess *file = FileAccess::open(p_path, FileAccess::WRITE, &err);
- ERR_FAIL_COND_V(err, err);
+ ERR_FAIL_COND_V_MSG(err, err, vformat("Can't save PNG at path: '%s'.", p_path));
PoolVector<uint8_t>::Read reader = buffer.read();
diff --git a/drivers/register_driver_types.h b/drivers/register_driver_types.h
index 3fdf802c9f..a3398964dd 100644
--- a/drivers/register_driver_types.h
+++ b/drivers/register_driver_types.h
@@ -31,10 +31,6 @@
#ifndef REGISTER_DRIVER_TYPES_H
#define REGISTER_DRIVER_TYPES_H
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
void register_core_driver_types();
void unregister_core_driver_types();
diff --git a/drivers/unix/dir_access_unix.h b/drivers/unix/dir_access_unix.h
index 579cb0e798..88674d2769 100644
--- a/drivers/unix/dir_access_unix.h
+++ b/drivers/unix/dir_access_unix.h
@@ -40,10 +40,6 @@
#include <sys/types.h>
#include <unistd.h>
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class DirAccessUnix : public DirAccess {
DIR *dir_stream;
diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp
index a285b3b65f..071734eb48 100644
--- a/drivers/unix/file_access_unix.cpp
+++ b/drivers/unix/file_access_unix.cpp
@@ -38,6 +38,8 @@
#include <sys/stat.h>
#include <sys/types.h>
+#include <errno.h>
+
#if defined(UNIX_ENABLED)
#include <unistd.h>
#endif
@@ -112,8 +114,15 @@ Error FileAccessUnix::_open(const String &p_path, int p_mode_flags) {
f = fopen(path.utf8().get_data(), mode_string);
if (f == NULL) {
- last_error = ERR_FILE_CANT_OPEN;
- return ERR_FILE_CANT_OPEN;
+ switch (errno) {
+ case ENOENT: {
+ last_error = ERR_FILE_NOT_FOUND;
+ } break;
+ default: {
+ last_error = ERR_FILE_CANT_OPEN;
+ } break;
+ }
+ return last_error;
} else {
last_error = OK;
flags = p_mode_flags;
@@ -288,8 +297,7 @@ uint64_t FileAccessUnix::_get_modified_time(const String &p_file) {
if (!err) {
return flags.st_mtime;
} else {
- ERR_EXPLAIN("Failed to get modified time for: " + p_file);
- ERR_FAIL_V(0);
+ ERR_FAIL_V_MSG(0, "Failed to get modified time for: " + p_file + ".");
};
}
@@ -302,8 +310,7 @@ uint32_t FileAccessUnix::_get_unix_permissions(const String &p_file) {
if (!err) {
return flags.st_mode & 0x7FF; //only permissions
} else {
- ERR_EXPLAIN("Failed to get unix permissions for: " + p_file);
- ERR_FAIL_V(0);
+ ERR_FAIL_V_MSG(0, "Failed to get unix permissions for: " + p_file + ".");
};
}
diff --git a/drivers/unix/file_access_unix.h b/drivers/unix/file_access_unix.h
index 2a369048a4..e26591e3e8 100644
--- a/drivers/unix/file_access_unix.h
+++ b/drivers/unix/file_access_unix.h
@@ -38,10 +38,6 @@
#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED)
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
typedef void (*CloseNotificationFunc)(const String &p_file, int p_flags);
class FileAccessUnix : public FileAccess {
diff --git a/drivers/unix/ip_unix.cpp b/drivers/unix/ip_unix.cpp
index ce66f07a19..ac7195abc1 100644
--- a/drivers/unix/ip_unix.cpp
+++ b/drivers/unix/ip_unix.cpp
@@ -184,9 +184,7 @@ void IP_Unix::get_local_interfaces(Map<String, Interface_Info> *r_interfaces) co
continue; // will go back and alloc the right size
};
- ERR_EXPLAIN("Call to GetAdaptersAddresses failed with error " + itos(err));
- ERR_FAIL();
- return;
+ ERR_FAIL_MSG("Call to GetAdaptersAddresses failed with error " + itos(err) + ".");
};
IP_ADAPTER_ADDRESSES *adapter = addrs;
diff --git a/drivers/unix/os_unix.cpp b/drivers/unix/os_unix.cpp
index aa61cf5dcc..ab5590dba4 100644
--- a/drivers/unix/os_unix.cpp
+++ b/drivers/unix/os_unix.cpp
@@ -72,8 +72,7 @@ static double _clock_scale = 0;
static void _setup_clock() {
mach_timebase_info_data_t info;
kern_return_t ret = mach_timebase_info(&info);
- ERR_EXPLAIN("OS CLOCK IS NOT WORKING!");
- ERR_FAIL_COND(ret != 0);
+ ERR_FAIL_COND_MSG(ret != 0, "OS CLOCK IS NOT WORKING!");
_clock_scale = ((double)info.numer / (double)info.denom) / 1000.0;
_clock_start = mach_absolute_time() * _clock_scale;
}
@@ -85,8 +84,7 @@ static void _setup_clock() {
#endif
static void _setup_clock() {
struct timespec tv_now = { 0, 0 };
- ERR_EXPLAIN("OS CLOCK IS NOT WORKING!");
- ERR_FAIL_COND(clock_gettime(GODOT_CLOCK, &tv_now) != 0);
+ ERR_FAIL_COND_MSG(clock_gettime(GODOT_CLOCK, &tv_now) != 0, "OS CLOCK IS NOT WORKING!");
_clock_start = ((uint64_t)tv_now.tv_nsec / 1000L) + (uint64_t)tv_now.tv_sec * 1000000L;
}
#endif
@@ -420,10 +418,7 @@ Error OS_Unix::open_dynamic_library(const String p_path, void *&p_library_handle
}
p_library_handle = dlopen(path.utf8().get_data(), RTLD_NOW);
- if (!p_library_handle) {
- ERR_EXPLAIN("Can't open dynamic library: " + p_path + ". Error: " + dlerror());
- ERR_FAIL_V(ERR_CANT_OPEN);
- }
+ ERR_FAIL_COND_V_MSG(!p_library_handle, ERR_CANT_OPEN, "Can't open dynamic library: " + p_path + ". Error: " + dlerror());
return OK;
}
@@ -442,12 +437,9 @@ Error OS_Unix::get_dynamic_library_symbol_handle(void *p_library_handle, const S
error = dlerror();
if (error != NULL) {
- if (!p_optional) {
- ERR_EXPLAIN("Can't resolve symbol " + p_name + ". Error: " + error);
- ERR_FAIL_V(ERR_CANT_RESOLVE);
- } else {
- return ERR_CANT_RESOLVE;
- }
+ ERR_FAIL_COND_V_MSG(!p_optional, ERR_CANT_RESOLVE, "Can't resolve symbol " + p_name + ". Error: " + error + ".");
+
+ return ERR_CANT_RESOLVE;
}
return OK;
}
diff --git a/drivers/unix/os_unix.h b/drivers/unix/os_unix.h
index 53446a6b6f..a263147e23 100644
--- a/drivers/unix/os_unix.h
+++ b/drivers/unix/os_unix.h
@@ -31,10 +31,6 @@
#ifndef OS_UNIX_H
#define OS_UNIX_H
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
#ifdef UNIX_ENABLED
#include "core/os/os.h"
diff --git a/drivers/unix/semaphore_posix.h b/drivers/unix/semaphore_posix.h
index 089f088d33..83e75c9a82 100644
--- a/drivers/unix/semaphore_posix.h
+++ b/drivers/unix/semaphore_posix.h
@@ -36,9 +36,7 @@
#if defined(UNIX_ENABLED) || defined(PTHREAD_ENABLED)
#include <semaphore.h>
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class SemaphorePosix : public Semaphore {
mutable sem_t sem;
diff --git a/drivers/unix/thread_posix.h b/drivers/unix/thread_posix.h
index d6b6267c49..5edacd3a0c 100644
--- a/drivers/unix/thread_posix.h
+++ b/drivers/unix/thread_posix.h
@@ -31,10 +31,6 @@
#ifndef THREAD_POSIX_H
#define THREAD_POSIX_H
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
#if (defined(UNIX_ENABLED) || defined(PTHREAD_ENABLED)) && !defined(NO_THREADS)
#include "core/os/thread.h"
diff --git a/drivers/wasapi/audio_driver_wasapi.cpp b/drivers/wasapi/audio_driver_wasapi.cpp
index b0f102f1a3..adc3cc8d65 100644
--- a/drivers/wasapi/audio_driver_wasapi.cpp
+++ b/drivers/wasapi/audio_driver_wasapi.cpp
@@ -296,8 +296,7 @@ Error AudioDriverWASAPI::audio_device_init(AudioDeviceWASAPI *p_device, bool p_c
}
hr = p_device->audio_client->Initialize(AUDCLNT_SHAREMODE_SHARED, streamflags, p_capture ? REFTIMES_PER_SEC : 0, 0, pwfex, NULL);
- ERR_EXPLAIN("WASAPI: Initialize failed with error 0x" + String::num_uint64(hr, 16));
- ERR_FAIL_COND_V(hr != S_OK, ERR_CANT_OPEN);
+ ERR_FAIL_COND_V_MSG(hr != S_OK, ERR_CANT_OPEN, "WASAPI: Initialize failed with error 0x" + String::num_uint64(hr, 16) + ".");
if (p_capture) {
hr = p_device->audio_client->GetService(IID_IAudioCaptureClient, (void **)&p_device->capture_client);
diff --git a/drivers/windows/file_access_windows.cpp b/drivers/windows/file_access_windows.cpp
index 646e744248..fb21c0c5a1 100644
--- a/drivers/windows/file_access_windows.cpp
+++ b/drivers/windows/file_access_windows.cpp
@@ -38,6 +38,7 @@
#include <shlwapi.h>
#include <windows.h>
+#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <tchar.h>
@@ -114,17 +115,25 @@ Error FileAccessWindows::_open(const String &p_path, int p_mode_flags) {
path = path + ".tmp";
}
- _wfopen_s(&f, path.c_str(), mode_string);
+ errno_t errcode = _wfopen_s(&f, path.c_str(), mode_string);
if (f == NULL) {
- last_error = ERR_FILE_CANT_OPEN;
- return ERR_FILE_CANT_OPEN;
+ switch (errcode) {
+ case ENOENT: {
+ last_error = ERR_FILE_NOT_FOUND;
+ } break;
+ default: {
+ last_error = ERR_FILE_CANT_OPEN;
+ } break;
+ }
+ return last_error;
} else {
last_error = OK;
flags = p_mode_flags;
return OK;
}
}
+
void FileAccessWindows::close() {
if (!f)
@@ -167,13 +176,11 @@ void FileAccessWindows::close() {
if (close_fail_notify) {
close_fail_notify(save_path);
}
-
- ERR_EXPLAIN("Safe save failed. This may be a permissions problem, but also may happen because you are running a paranoid antivirus. If this is the case, please switch to Windows Defender or disable the 'safe save' option in editor settings. This makes it work, but increases the risk of file corruption in a crash.");
}
save_path = "";
- ERR_FAIL_COND(rename_error);
+ ERR_FAIL_COND_MSG(rename_error, "Safe save failed. This may be a permissions problem, but also may happen because you are running a paranoid antivirus. If this is the case, please switch to Windows Defender or disable the 'safe save' option in editor settings. This makes it work, but increases the risk of file corruption in a crash.");
}
}
@@ -334,8 +341,7 @@ uint64_t FileAccessWindows::_get_modified_time(const String &p_file) {
return st.st_mtime;
} else {
- ERR_EXPLAIN("Failed to get modified time for: " + file);
- ERR_FAIL_V(0);
+ ERR_FAIL_V_MSG(0, "Failed to get modified time for: " + file + ".");
}
}
diff --git a/drivers/windows/file_access_windows.h b/drivers/windows/file_access_windows.h
index 2848ed5279..e7f9fc690d 100644
--- a/drivers/windows/file_access_windows.h
+++ b/drivers/windows/file_access_windows.h
@@ -38,10 +38,6 @@
#include <stdio.h>
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class FileAccessWindows : public FileAccess {
FILE *f;
diff --git a/drivers/windows/mutex_windows.h b/drivers/windows/mutex_windows.h
index 6d3b641a26..582d26029c 100644
--- a/drivers/windows/mutex_windows.h
+++ b/drivers/windows/mutex_windows.h
@@ -37,10 +37,6 @@
#include <windows.h>
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class MutexWindows : public Mutex {
#ifdef WINDOWS_USE_MUTEX
diff --git a/drivers/windows/semaphore_windows.h b/drivers/windows/semaphore_windows.h
index 8adeffbb7f..cfd33d033a 100644
--- a/drivers/windows/semaphore_windows.h
+++ b/drivers/windows/semaphore_windows.h
@@ -37,10 +37,6 @@
#include <windows.h>
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class SemaphoreWindows : public Semaphore {
mutable HANDLE semaphore;
diff --git a/drivers/windows/thread_windows.h b/drivers/windows/thread_windows.h
index a74d4e46f3..b47452838c 100644
--- a/drivers/windows/thread_windows.h
+++ b/drivers/windows/thread_windows.h
@@ -38,10 +38,6 @@
#include <windows.h>
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class ThreadWindows : public Thread {
ThreadCreateCallback callback;
diff --git a/drivers/xaudio2/audio_driver_xaudio2.cpp b/drivers/xaudio2/audio_driver_xaudio2.cpp
index 8674d24af6..6d729c50ab 100644
--- a/drivers/xaudio2/audio_driver_xaudio2.cpp
+++ b/drivers/xaudio2/audio_driver_xaudio2.cpp
@@ -63,15 +63,10 @@ Error AudioDriverXAudio2::init() {
HRESULT hr;
hr = XAudio2Create(&xaudio, 0, XAUDIO2_DEFAULT_PROCESSOR);
- if (hr != S_OK) {
- ERR_EXPLAIN("Error creating XAudio2 engine.");
- ERR_FAIL_V(ERR_UNAVAILABLE);
- }
+ ERR_FAIL_COND_V_MSG(hr != S_OK, ERR_UNAVAILABLE, "Error creating XAudio2 engine.");
+
hr = xaudio->CreateMasteringVoice(&mastering_voice);
- if (hr != S_OK) {
- ERR_EXPLAIN("Error creating XAudio2 mastering voice.");
- ERR_FAIL_V(ERR_UNAVAILABLE);
- }
+ ERR_FAIL_COND_V_MSG(hr != S_OK, ERR_UNAVAILABLE, "Error creating XAudio2 mastering voice.");
wave_format.nChannels = channels;
wave_format.cbSize = 0;
@@ -82,10 +77,7 @@ Error AudioDriverXAudio2::init() {
wave_format.nAvgBytesPerSec = mix_rate * wave_format.nBlockAlign;
hr = xaudio->CreateSourceVoice(&source_voice, &wave_format, 0, XAUDIO2_MAX_FREQ_RATIO, &voice_callback);
- if (hr != S_OK) {
- ERR_EXPLAIN("Error creating XAudio2 source voice. " + itos(hr));
- ERR_FAIL_V(ERR_UNAVAILABLE);
- }
+ ERR_FAIL_COND_V_MSG(hr != S_OK, ERR_UNAVAILABLE, "Error creating XAudio2 source voice. Error code: " + itos(hr) + ".");
mutex = Mutex::create();
thread = Thread::create(AudioDriverXAudio2::thread_func, this);
@@ -140,10 +132,7 @@ void AudioDriverXAudio2::start() {
active = true;
HRESULT hr = source_voice->Start(0);
- if (hr != S_OK) {
- ERR_EXPLAIN("XAudio2 start error " + itos(hr));
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(hr != S_OK, "Error starting XAudio2 driver. Error code: " + itos(hr) + ".");
}
int AudioDriverXAudio2::get_mix_rate() const {
diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp
index 14ea18f885..6728f60e06 100644
--- a/editor/animation_bezier_editor.cpp
+++ b/editor/animation_bezier_editor.cpp
@@ -354,10 +354,12 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
{ //guides
float min_left_scale = font->get_height() + vsep;
- float scale = 1;
+ float scale = (min_left_scale * 2) * v_zoom;
+ float step = Math::pow(10.0, Math::round(Math::log(scale / 5.0) / Math::log(10.0))) * 5.0;
+ scale = Math::stepify(scale, step);
while (scale / v_zoom < min_left_scale * 2) {
- scale *= 5;
+ scale += step;
}
bool first = true;
@@ -378,7 +380,7 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
draw_line(Point2(limit, i), Point2(right_limit, i), lc);
Color c = color;
c.a *= 0.5;
- draw_string(font, Point2(limit + 8, i - 2), itos((iv + 1) * scale), c);
+ draw_string(font, Point2(limit + 8, i - 2), rtos(Math::stepify((iv + 1) * scale, step)), c);
}
first = false;
@@ -628,24 +630,28 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_DOWN) {
+ float v_zoom_orig = v_zoom;
if (mb->get_command()) {
timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() * 1.05);
} else {
- if (v_zoom < 1000) {
+ if (v_zoom < 100000) {
v_zoom *= 1.2;
}
}
+ v_scroll = v_scroll + (mb->get_position().y - get_size().y / 2) * (v_zoom - v_zoom_orig);
update();
}
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_UP) {
+ float v_zoom_orig = v_zoom;
if (mb->get_command()) {
timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() / 1.05);
} else {
- if (v_zoom > 0.01) {
+ if (v_zoom > 0.000001) {
v_zoom /= 1.2;
}
}
+ v_scroll = v_scroll + (mb->get_position().y - get_size().y / 2) * (v_zoom - v_zoom_orig);
update();
}
diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp
index 014bb08144..a163490cfb 100644
--- a/editor/animation_track_editor.cpp
+++ b/editor/animation_track_editor.cpp
@@ -1748,7 +1748,11 @@ void AnimationTimelineEdit::_play_position_draw() {
if (px >= get_name_limit() && px < (play_position->get_size().width - get_buttons_width())) {
Color color = get_color("accent_color", "Editor");
- play_position->draw_line(Point2(px, 0), Point2(px, h), color, Math::round(EDSCALE));
+ play_position->draw_line(Point2(px, 0), Point2(px, h), color, Math::round(2 * EDSCALE));
+ play_position->draw_texture(
+ get_icon("TimelineIndicator", "EditorIcons"),
+ Point2(px - get_icon("TimelineIndicator", "EditorIcons")->get_width() * 0.5, 0),
+ color);
}
}
@@ -1795,6 +1799,13 @@ void AnimationTimelineEdit::_gui_input(const Ref<InputEvent> &p_event) {
if (mm.is_valid()) {
+ if (hsize_rect.has_point(mm->get_position())) {
+ // Change the cursor to indicate that the track name column's width can be adjusted
+ set_default_cursor_shape(Control::CURSOR_HSIZE);
+ } else {
+ set_default_cursor_shape(Control::CURSOR_ARROW);
+ }
+
if (dragging_hsize) {
int ofs = mm->get_position().x - dragging_hsize_from;
name_limit = dragging_hsize_at + ofs;
@@ -1853,7 +1864,7 @@ AnimationTimelineEdit::AnimationTimelineEdit() {
use_fps = false;
editing = false;
- name_limit = 150;
+ name_limit = 150 * EDSCALE;
zoom = NULL;
play_position_pos = 0;
@@ -2438,7 +2449,7 @@ void AnimationTrackEdit::_play_position_draw() {
if (px >= timeline->get_name_limit() && px < (get_size().width - timeline->get_buttons_width())) {
Color color = get_color("accent_color", "Editor");
- play_position->draw_line(Point2(px, 0), Point2(px, h), color, Math::round(EDSCALE));
+ play_position->draw_line(Point2(px, 0), Point2(px, h), color, Math::round(2 * EDSCALE));
}
}
@@ -3184,7 +3195,7 @@ void AnimationTrackEditGroup::_notification(int p_what) {
if (px >= timeline->get_name_limit() && px < (get_size().width - timeline->get_buttons_width())) {
Color accent = get_color("accent_color", "Editor");
- draw_line(Point2(px, 0), Point2(px, get_size().height), accent, Math::round(EDSCALE));
+ draw_line(Point2(px, 0), Point2(px, get_size().height), accent, Math::round(2 * EDSCALE));
}
}
}
@@ -5050,10 +5061,9 @@ float AnimationTrackEditor::get_moving_selection_offset() const {
void AnimationTrackEditor::_box_selection_draw() {
- Color color = get_color("accent_color", "Editor");
- color.a = 0.2;
- Rect2 rect = Rect2(Point2(), box_selection->get_size());
- box_selection->draw_rect(rect, color);
+ const Rect2 selection_rect = Rect2(Point2(), box_selection->get_size());
+ box_selection->draw_rect(selection_rect, get_color("box_selection_fill_color", "Editor"));
+ box_selection->draw_rect(selection_rect, get_color("box_selection_stroke_color", "Editor"), false, Math::round(EDSCALE));
}
void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) {
diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp
index 89a88dc6e7..b6cd69c3cd 100644
--- a/editor/code_editor.cpp
+++ b/editor/code_editor.cpp
@@ -163,16 +163,17 @@ bool FindReplaceBar::_search(uint32_t p_flags, int p_from_line, int p_from_col)
result_col = col;
_update_results_count();
- set_error(vformat(TTR("Found %d match(es)."), results_count));
} else {
+ results_count = 0;
result_line = -1;
result_col = -1;
text_edit->set_search_text("");
text_edit->set_search_flags(p_flags);
text_edit->set_current_search_result(line, col);
- set_error(text.empty() ? "" : TTR("No Matches"));
}
+ _update_matches_label();
+
return found;
}
@@ -196,7 +197,7 @@ void FindReplaceBar::_replace() {
void FindReplaceBar::_replace_all() {
text_edit->disconnect("text_changed", this, "_editor_text_changed");
- // line as x so it gets priority in comparison, column as y
+ // Line as x so it gets priority in comparison, column as y.
Point2i orig_cursor(text_edit->cursor_get_line(), text_edit->cursor_get_column());
Point2i prev_match = Point2(-1, -1);
@@ -228,7 +229,7 @@ void FindReplaceBar::_replace_all() {
Point2i match_to(result_line, result_col + search_text_len);
if (match_from < prev_match) {
- break; // done
+ break; // Done.
}
prev_match = Point2i(result_line, result_col + replace_text.length());
@@ -241,14 +242,14 @@ void FindReplaceBar::_replace_all() {
continue;
}
- // replace but adjust selection bounds
+ // Replace but adjust selection bounds.
text_edit->insert_text_at_cursor(replace_text);
if (match_to.x == selection_end.x) {
selection_end.y += replace_text.length() - search_text_len;
}
} else {
- // just replace
+ // Just replace.
text_edit->insert_text_at_cursor(replace_text);
}
@@ -260,12 +261,12 @@ void FindReplaceBar::_replace_all() {
replace_all_mode = false;
- // restore editor state (selection, cursor, scroll)
+ // Restore editor state (selection, cursor, scroll).
text_edit->cursor_set_line(orig_cursor.x);
text_edit->cursor_set_column(orig_cursor.y);
if (selection_enabled && is_selection_only()) {
- // reselect
+ // Reselect.
text_edit->select(selection_begin.x, selection_begin.y, selection_end.x, selection_end.y);
} else {
text_edit->deselect();
@@ -283,20 +284,6 @@ void FindReplaceBar::_get_search_from(int &r_line, int &r_col) {
r_line = text_edit->cursor_get_line();
r_col = text_edit->cursor_get_column();
- if (text_edit->is_selection_active() && !replace_all_mode) {
-
- int selection_line = text_edit->get_selection_from_line();
-
- if (text_edit->get_selection_text() == get_search_text() && r_line == selection_line) {
-
- int selection_from_col = text_edit->get_selection_from_column();
-
- if (r_col >= selection_from_col && r_col <= text_edit->get_selection_to_column()) {
- r_col = selection_from_col;
- }
- }
- }
-
if (r_line == result_line && r_col >= result_col && r_col <= result_col + get_search_text().length()) {
r_col = result_col;
}
@@ -332,6 +319,18 @@ void FindReplaceBar::_update_results_count() {
}
}
+void FindReplaceBar::_update_matches_label() {
+
+ if (search_text->get_text().empty() || results_count == -1) {
+ matches_label->hide();
+ } else {
+ matches_label->show();
+
+ matches_label->add_color_override("font_color", results_count > 0 ? Color(1, 1, 1) : EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
+ matches_label->set_text(vformat(results_count == 1 ? TTR("%d match.") : TTR("%d matches."), results_count));
+ }
+}
+
bool FindReplaceBar::search_current() {
uint32_t flags = 0;
@@ -349,6 +348,9 @@ bool FindReplaceBar::search_current() {
bool FindReplaceBar::search_prev() {
+ if (!is_visible())
+ popup_search(true);
+
uint32_t flags = 0;
String text = get_search_text();
@@ -361,6 +363,8 @@ bool FindReplaceBar::search_prev() {
int line, col;
_get_search_from(line, col);
+ if (text_edit->is_selection_active())
+ col--; // Skip currently selected word.
col -= text.length();
if (col < 0) {
@@ -375,6 +379,9 @@ bool FindReplaceBar::search_prev() {
bool FindReplaceBar::search_next() {
+ if (!is_visible())
+ popup_search(true);
+
uint32_t flags = 0;
String text;
if (replace_all_mode)
@@ -411,38 +418,54 @@ void FindReplaceBar::_hide_bar() {
text_edit->set_search_text("");
result_line = -1;
result_col = -1;
- set_error("");
hide();
}
-void FindReplaceBar::_show_search() {
+void FindReplaceBar::_show_search(bool p_focus_replace, bool p_show_only) {
show();
- search_text->call_deferred("grab_focus");
+ if (p_show_only)
+ return;
+
+ if (p_focus_replace) {
+ search_text->deselect();
+ replace_text->call_deferred("grab_focus");
+ } else {
+ replace_text->deselect();
+ search_text->call_deferred("grab_focus");
+ }
if (text_edit->is_selection_active() && !selection_only->is_pressed()) {
search_text->set_text(text_edit->get_selection_text());
}
if (!get_search_text().empty()) {
- search_text->select_all();
- search_text->set_cursor_position(search_text->get_text().length());
- search_current();
+ if (p_focus_replace) {
+ replace_text->select_all();
+ replace_text->set_cursor_position(replace_text->get_text().length());
+ } else {
+ search_text->select_all();
+ search_text->set_cursor_position(search_text->get_text().length());
+ }
+
+ results_count = -1;
+ _update_results_count();
+ _update_matches_label();
}
}
-void FindReplaceBar::popup_search() {
+void FindReplaceBar::popup_search(bool p_show_only) {
- replace_text->hide();
+ if (!is_visible())
+ replace_text->hide();
hbc_button_replace->hide();
hbc_option_replace->hide();
- _show_search();
+ _show_search(false, p_show_only);
}
void FindReplaceBar::popup_replace() {
if (!replace_text->is_visible_in_tree()) {
- replace_text->clear();
replace_text->show();
hbc_button_replace->show();
hbc_option_replace->show();
@@ -450,7 +473,7 @@ void FindReplaceBar::popup_replace() {
selection_only->set_pressed((text_edit->is_selection_active() && text_edit->get_selection_from_line() < text_edit->get_selection_to_line()));
- _show_search();
+ _show_search(is_visible() || text_edit->is_selection_active());
}
void FindReplaceBar::_search_options_changed(bool p_pressed) {
@@ -557,6 +580,7 @@ FindReplaceBar::FindReplaceBar() {
vbc_lineedit = memnew(VBoxContainer);
add_child(vbc_lineedit);
+ vbc_lineedit->set_alignment(ALIGN_CENTER);
vbc_lineedit->set_h_size_flags(SIZE_EXPAND_FILL);
VBoxContainer *vbc_button = memnew(VBoxContainer);
add_child(vbc_button);
@@ -565,8 +589,10 @@ FindReplaceBar::FindReplaceBar() {
HBoxContainer *hbc_button_search = memnew(HBoxContainer);
vbc_button->add_child(hbc_button_search);
+ hbc_button_search->set_alignment(ALIGN_END);
hbc_button_replace = memnew(HBoxContainer);
vbc_button->add_child(hbc_button_replace);
+ hbc_button_replace->set_alignment(ALIGN_END);
HBoxContainer *hbc_option_search = memnew(HBoxContainer);
vbc_option->add_child(hbc_option_search);
@@ -580,6 +606,10 @@ FindReplaceBar::FindReplaceBar() {
search_text->connect("text_changed", this, "_search_text_changed");
search_text->connect("text_entered", this, "_search_text_entered");
+ matches_label = memnew(Label);
+ hbc_button_search->add_child(matches_label);
+ matches_label->hide();
+
find_prev = memnew(ToolButton);
hbc_button_search->add_child(find_prev);
find_prev->set_focus_mode(FOCUS_NONE);
@@ -720,7 +750,7 @@ void CodeTextEditor::_zoom_changed() {
}
void CodeTextEditor::_reset_zoom() {
- Ref<DynamicFont> font = text_editor->get_font("font"); // reset source font size to default
+ Ref<DynamicFont> font = text_editor->get_font("font"); // Reset source font size to default.
if (font.is_valid()) {
EditorSettings::get_singleton()->set("interface/editor/code_font_size", 14);
@@ -855,31 +885,33 @@ bool CodeTextEditor::_add_font_size(int p_delta) {
void CodeTextEditor::update_editor_settings() {
- text_editor->set_auto_brace_completion(EditorSettings::get_singleton()->get("text_editor/completion/auto_brace_complete"));
- text_editor->set_scroll_pass_end_of_file(EditorSettings::get_singleton()->get("text_editor/cursor/scroll_past_end_of_file"));
+ text_editor->set_syntax_coloring(EditorSettings::get_singleton()->get("text_editor/highlighting/syntax_highlighting"));
+ text_editor->set_highlight_all_occurrences(EditorSettings::get_singleton()->get("text_editor/highlighting/highlight_all_occurrences"));
+ text_editor->set_highlight_current_line(EditorSettings::get_singleton()->get("text_editor/highlighting/highlight_current_line"));
text_editor->set_indent_using_spaces(EditorSettings::get_singleton()->get("text_editor/indent/type"));
text_editor->set_indent_size(EditorSettings::get_singleton()->get("text_editor/indent/size"));
text_editor->set_auto_indent(EditorSettings::get_singleton()->get("text_editor/indent/auto_indent"));
text_editor->set_draw_tabs(EditorSettings::get_singleton()->get("text_editor/indent/draw_tabs"));
text_editor->set_draw_spaces(EditorSettings::get_singleton()->get("text_editor/indent/draw_spaces"));
- text_editor->set_show_line_numbers(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_line_numbers"));
- text_editor->set_line_numbers_zero_padded(EditorSettings::get_singleton()->get("text_editor/line_numbers/line_numbers_zero_padded"));
- text_editor->set_show_line_length_guideline(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_line_length_guideline"));
- text_editor->set_line_length_guideline_column(EditorSettings::get_singleton()->get("text_editor/line_numbers/line_length_guideline_column"));
- text_editor->set_syntax_coloring(EditorSettings::get_singleton()->get("text_editor/highlighting/syntax_highlighting"));
- text_editor->set_highlight_all_occurrences(EditorSettings::get_singleton()->get("text_editor/highlighting/highlight_all_occurrences"));
- text_editor->set_highlight_current_line(EditorSettings::get_singleton()->get("text_editor/highlighting/highlight_current_line"));
+ text_editor->set_smooth_scroll_enabled(EditorSettings::get_singleton()->get("text_editor/navigation/smooth_scrolling"));
+ text_editor->set_v_scroll_speed(EditorSettings::get_singleton()->get("text_editor/navigation/v_scroll_speed"));
+ text_editor->set_draw_minimap(EditorSettings::get_singleton()->get("text_editor/navigation/show_minimap"));
+ text_editor->set_minimap_width(EditorSettings::get_singleton()->get("text_editor/navigation/minimap_width"));
+ text_editor->set_show_line_numbers(EditorSettings::get_singleton()->get("text_editor/appearance/show_line_numbers"));
+ text_editor->set_line_numbers_zero_padded(EditorSettings::get_singleton()->get("text_editor/appearance/line_numbers_zero_padded"));
+ text_editor->set_bookmark_gutter_enabled(EditorSettings::get_singleton()->get("text_editor/appearance/show_bookmark_gutter"));
+ text_editor->set_breakpoint_gutter_enabled(EditorSettings::get_singleton()->get("text_editor/appearance/show_breakpoint_gutter"));
+ text_editor->set_draw_info_gutter(EditorSettings::get_singleton()->get("text_editor/appearance/show_info_gutter"));
+ text_editor->set_hiding_enabled(EditorSettings::get_singleton()->get("text_editor/appearance/code_folding"));
+ text_editor->set_draw_fold_gutter(EditorSettings::get_singleton()->get("text_editor/appearance/code_folding"));
+ text_editor->set_wrap_enabled(EditorSettings::get_singleton()->get("text_editor/appearance/word_wrap"));
+ text_editor->set_show_line_length_guideline(EditorSettings::get_singleton()->get("text_editor/appearance/show_line_length_guideline"));
+ text_editor->set_line_length_guideline_column(EditorSettings::get_singleton()->get("text_editor/appearance/line_length_guideline_column"));
+ text_editor->set_scroll_pass_end_of_file(EditorSettings::get_singleton()->get("text_editor/cursor/scroll_past_end_of_file"));
+ text_editor->cursor_set_block_mode(EditorSettings::get_singleton()->get("text_editor/cursor/block_caret"));
text_editor->cursor_set_blink_enabled(EditorSettings::get_singleton()->get("text_editor/cursor/caret_blink"));
text_editor->cursor_set_blink_speed(EditorSettings::get_singleton()->get("text_editor/cursor/caret_blink_speed"));
- text_editor->set_bookmark_gutter_enabled(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_bookmark_gutter"));
- text_editor->set_breakpoint_gutter_enabled(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_breakpoint_gutter"));
- text_editor->set_hiding_enabled(EditorSettings::get_singleton()->get("text_editor/line_numbers/code_folding"));
- text_editor->set_draw_fold_gutter(EditorSettings::get_singleton()->get("text_editor/line_numbers/code_folding"));
- text_editor->set_wrap_enabled(EditorSettings::get_singleton()->get("text_editor/line_numbers/word_wrap"));
- text_editor->set_draw_info_gutter(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_info_gutter"));
- text_editor->cursor_set_block_mode(EditorSettings::get_singleton()->get("text_editor/cursor/block_caret"));
- text_editor->set_smooth_scroll_enabled(EditorSettings::get_singleton()->get("text_editor/open_scripts/smooth_scrolling"));
- text_editor->set_v_scroll_speed(EditorSettings::get_singleton()->get("text_editor/open_scripts/v_scroll_speed"));
+ text_editor->set_auto_brace_completion(EditorSettings::get_singleton()->get("text_editor/completion/auto_brace_complete"));
}
void CodeTextEditor::trim_trailing_whitespace() {
@@ -1230,7 +1262,7 @@ void CodeTextEditor::toggle_inline_comment(const String &delimiter) {
int col_to = text_editor->get_selection_to_column();
int cursor_pos = text_editor->cursor_get_column();
- // Check if all lines in the selected block are commented
+ // Check if all lines in the selected block are commented.
bool is_commented = true;
for (int i = begin; i <= end; i++) {
if (!text_editor->get_line(i).begins_with(delimiter)) {
@@ -1425,14 +1457,14 @@ void CodeTextEditor::_on_settings_change() {
font_size = EditorSettings::get_singleton()->get("interface/editor/code_font_size");
- // AUTO BRACE COMPLETION
+ // Auto brace completion.
text_editor->set_auto_brace_completion(
EDITOR_GET("text_editor/completion/auto_brace_complete"));
code_complete_timer->set_wait_time(
EDITOR_GET("text_editor/completion/code_complete_delay"));
- // call hint settings
+ // Call hint settings.
text_editor->set_callhint_settings(
EDITOR_GET("text_editor/completion/put_callhint_tooltip_below_current_line"),
EDITOR_GET("text_editor/completion/callhint_tooltip_offset"));
diff --git a/editor/code_editor.h b/editor/code_editor.h
index 700e72627c..f2a55cfb70 100644
--- a/editor/code_editor.h
+++ b/editor/code_editor.h
@@ -64,6 +64,7 @@ class FindReplaceBar : public HBoxContainer {
GDCLASS(FindReplaceBar, HBoxContainer);
LineEdit *search_text;
+ Label *matches_label;
ToolButton *find_prev;
ToolButton *find_next;
CheckBox *case_sensitive;
@@ -90,8 +91,9 @@ class FindReplaceBar : public HBoxContainer {
void _get_search_from(int &r_line, int &r_col);
void _update_results_count();
+ void _update_matches_label();
- void _show_search();
+ void _show_search(bool p_focus_replace = false, bool p_show_only = false);
void _hide_bar();
void _editor_text_changed();
@@ -123,7 +125,7 @@ public:
void set_text_edit(TextEdit *p_text_edit);
- void popup_search();
+ void popup_search(bool p_show_only = false);
void popup_replace();
bool search_current();
diff --git a/editor/collada/collada.cpp b/editor/collada/collada.cpp
index edd59f3057..1bb49a4167 100644
--- a/editor/collada/collada.cpp
+++ b/editor/collada/collada.cpp
@@ -28,8 +28,6 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#ifdef TOOLS_ENABLED
-
#include "collada.h"
#include <stdio.h>
@@ -1903,8 +1901,7 @@ void Collada::_parse_animation(XMLParser &parser) {
Vector<float> &output = float_sources[output_id];
- ERR_EXPLAIN("Wrong number of keys in output");
- ERR_CONTINUE((output.size() / stride) != key_count);
+ ERR_CONTINUE_MSG((output.size() / stride) != key_count, "Wrong number of keys in output.");
for (int j = 0; j < key_count; j++) {
track.keys.write[j].data.resize(output_len);
@@ -2447,8 +2444,7 @@ void Collada::_find_morph_nodes(VisualScene *p_vscene, Node *p_node) {
state.morph_ownership_map[base] = nj->id;
break;
} else {
- ERR_EXPLAIN("Invalid scene");
- ERR_FAIL();
+ ERR_FAIL_MSG("Invalid scene.");
}
}
}
@@ -2578,5 +2574,3 @@ Error Collada::load(const String &p_path, int p_flags) {
Collada::Collada() {
}
-
-#endif
diff --git a/editor/collada/collada.h b/editor/collada/collada.h
index 9ed62b46b7..317c3f1d37 100644
--- a/editor/collada/collada.h
+++ b/editor/collada/collada.h
@@ -28,8 +28,6 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#ifdef TOOLS_ENABLED
-
#ifndef COLLADA_H
#define COLLADA_H
@@ -647,5 +645,3 @@ private: // private stuff
};
#endif // COLLADA_H
-
-#endif
diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp
index 48bc409b73..c5b81c4685 100644
--- a/editor/connections_dialog.cpp
+++ b/editor/connections_dialog.cpp
@@ -881,7 +881,6 @@ void ConnectionsDock::update_tree() {
icon = get_icon(scr->get_class(), "EditorIcons");
}
}
-
} else {
ClassDB::get_signal_list(base, &node_signals2, true);
@@ -891,6 +890,10 @@ void ConnectionsDock::update_tree() {
name = base;
}
+ if (!icon.is_valid()) {
+ icon = get_icon("Object", "EditorIcons");
+ }
+
TreeItem *pitem = NULL;
if (node_signals2.size()) {
@@ -939,7 +942,7 @@ void ConnectionsDock::update_tree() {
item->set_metadata(0, sinfo);
item->set_icon(0, get_icon("Signal", "EditorIcons"));
- // Set tooltip with the signal's documentation
+ // Set tooltip with the signal's documentation.
{
String descr;
bool found = false;
diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp
index 8a8d52c6f1..d5f0dc01ee 100644
--- a/editor/create_dialog.cpp
+++ b/editor/create_dialog.cpp
@@ -191,34 +191,41 @@ void CreateDialog::add_type(const String &p_type, HashMap<String, TreeItem *> &p
item->set_custom_color(0, get_color("disabled_font_color", "Editor"));
item->set_selectable(0, false);
} else if (!(*to_select && (*to_select)->get_text(0) == search_box->get_text())) {
- bool current_type_prefered = _is_type_prefered(p_type);
- bool selected_type_prefered = *to_select ? _is_type_prefered((*to_select)->get_text(0).split(" ")[0]) : false;
-
String search_term = search_box->get_text().to_lower();
- bool is_subsequence_of_type = search_box->get_text().is_subsequence_ofi(p_type);
- bool is_substring_of_type = p_type.to_lower().find(search_term) >= 0;
- bool is_substring_of_selected = false;
- bool is_subsequence_of_selected = false;
- bool is_selected_equal = false;
-
- if (*to_select) {
- String name = (*to_select)->get_text(0).split(" ")[0].to_lower();
- is_substring_of_selected = name.find(search_term) >= 0;
- is_subsequence_of_selected = search_term.is_subsequence_of(name);
- is_selected_equal = name == search_term;
- }
- if (is_subsequence_of_type && !is_selected_equal) {
- if (is_substring_of_type) {
- if (!is_substring_of_selected || (current_type_prefered && !selected_type_prefered)) {
- *to_select = item;
- }
- } else {
- // substring results weigh more than subsequences, so let's make sure we don't override them
- if (!is_substring_of_selected) {
- if (!is_subsequence_of_selected || (current_type_prefered && !selected_type_prefered)) {
+ // if the node name matches exactly as the search, the node should be selected.
+ // this also fixes when the user clicks on recent nodes.
+ if (p_type.to_lower() == search_term) {
+ *to_select = item;
+ } else {
+ bool current_type_prefered = _is_type_prefered(p_type);
+ bool selected_type_prefered = *to_select ? _is_type_prefered((*to_select)->get_text(0).split(" ")[0]) : false;
+
+ bool is_subsequence_of_type = search_box->get_text().is_subsequence_ofi(p_type);
+ bool is_substring_of_type = p_type.to_lower().find(search_term) >= 0;
+ bool is_substring_of_selected = false;
+ bool is_subsequence_of_selected = false;
+ bool is_selected_equal = false;
+
+ if (*to_select) {
+ String name = (*to_select)->get_text(0).split(" ")[0].to_lower();
+ is_substring_of_selected = name.find(search_term) >= 0;
+ is_subsequence_of_selected = search_term.is_subsequence_of(name);
+ is_selected_equal = name == search_term;
+ }
+
+ if (is_subsequence_of_type && !is_selected_equal) {
+ if (is_substring_of_type) {
+ if (!is_substring_of_selected || (current_type_prefered && !selected_type_prefered)) {
*to_select = item;
}
+ } else {
+ // substring results weigh more than subsequences, so let's make sure we don't override them
+ if (!is_substring_of_selected) {
+ if (!is_subsequence_of_selected || (current_type_prefered && !selected_type_prefered)) {
+ *to_select = item;
+ }
+ }
}
}
}
diff --git a/editor/create_dialog.h b/editor/create_dialog.h
index f6c3b57589..f3ed1d7af6 100644
--- a/editor/create_dialog.h
+++ b/editor/create_dialog.h
@@ -38,9 +38,6 @@
#include "scene/gui/label.h"
#include "scene/gui/line_edit.h"
#include "scene/gui/tree.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class CreateDialog : public ConfirmationDialog {
diff --git a/editor/doc/doc_data.cpp b/editor/doc/doc_data.cpp
index 5b8c8fffb8..0f99e2ba1e 100644
--- a/editor/doc/doc_data.cpp
+++ b/editor/doc/doc_data.cpp
@@ -720,8 +720,7 @@ static Error _parse_methods(Ref<XMLParser> &parser, Vector<DocData::MethodDoc> &
methods.push_back(method);
} else {
- ERR_EXPLAIN("Invalid tag in doc file: " + parser->get_node_name());
- ERR_FAIL_V(ERR_FILE_CORRUPT);
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + parser->get_node_name() + ".");
}
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == section)
@@ -841,8 +840,7 @@ Error DocData::_load(Ref<XMLParser> parser) {
if (parser->get_node_type() == XMLParser::NODE_TEXT)
c.tutorials.push_back(parser->get_node_data().strip_edges());
} else {
- ERR_EXPLAIN("Invalid tag in doc file: " + name3);
- ERR_FAIL_V(ERR_FILE_CORRUPT);
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name3 + ".");
}
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "tutorials")
break; //end of <tutorials>
@@ -883,8 +881,7 @@ Error DocData::_load(Ref<XMLParser> parser) {
prop2.description = parser->get_node_data();
c.properties.push_back(prop2);
} else {
- ERR_EXPLAIN("Invalid tag in doc file: " + name3);
- ERR_FAIL_V(ERR_FILE_CORRUPT);
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name3 + ".");
}
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "members")
@@ -912,8 +909,7 @@ Error DocData::_load(Ref<XMLParser> parser) {
prop2.description = parser->get_node_data();
c.theme_properties.push_back(prop2);
} else {
- ERR_EXPLAIN("Invalid tag in doc file: " + name3);
- ERR_FAIL_V(ERR_FILE_CORRUPT);
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name3 + ".");
}
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "theme_items")
@@ -943,8 +939,7 @@ Error DocData::_load(Ref<XMLParser> parser) {
constant2.description = parser->get_node_data();
c.constants.push_back(constant2);
} else {
- ERR_EXPLAIN("Invalid tag in doc file: " + name3);
- ERR_FAIL_V(ERR_FILE_CORRUPT);
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name3 + ".");
}
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "constants")
@@ -953,8 +948,7 @@ Error DocData::_load(Ref<XMLParser> parser) {
} else {
- ERR_EXPLAIN("Invalid tag in doc file: " + name2);
- ERR_FAIL_V(ERR_FILE_CORRUPT);
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name2 + ".");
}
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "class")
@@ -991,10 +985,8 @@ Error DocData::save_classes(const String &p_default_path, const Map<String, Stri
Error err;
String save_file = save_path.plus_file(c.name + ".xml");
FileAccessRef f = FileAccess::open(save_file, FileAccess::WRITE, &err);
- if (err) {
- ERR_EXPLAIN("Can't write doc file: " + save_file);
- ERR_CONTINUE(err);
- }
+
+ ERR_CONTINUE_MSG(err != OK, "Can't write doc file: " + save_file + ".");
_write_string(f, 0, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
diff --git a/editor/editor_about.cpp b/editor/editor_about.cpp
index bea1980b09..b2567249d8 100644
--- a/editor/editor_about.cpp
+++ b/editor/editor_about.cpp
@@ -181,14 +181,14 @@ EditorAbout::EditorAbout() {
// Thirdparty License
VBoxContainer *license_thirdparty = memnew(VBoxContainer);
- license_thirdparty->set_name(TTR("Thirdparty License"));
+ license_thirdparty->set_name(TTR("Third-party Licenses"));
license_thirdparty->set_h_size_flags(Control::SIZE_EXPAND_FILL);
tc->add_child(license_thirdparty);
Label *tpl_label = memnew(Label);
tpl_label->set_h_size_flags(Control::SIZE_EXPAND_FILL);
tpl_label->set_autowrap(true);
- tpl_label->set_text(TTR("Godot Engine relies on a number of thirdparty free and open source libraries, all compatible with the terms of its MIT license. The following is an exhaustive list of all such thirdparty components with their respective copyright statements and license terms."));
+ tpl_label->set_text(TTR("Godot Engine relies on a number of third-party free and open source libraries, all compatible with the terms of its MIT license. The following is an exhaustive list of all such third-party components with their respective copyright statements and license terms."));
tpl_label->set_size(Size2(630, 1) * EDSCALE);
license_thirdparty->add_child(tpl_label);
diff --git a/editor/editor_about.h b/editor/editor_about.h
index 87e824083e..e2ba366c65 100644
--- a/editor/editor_about.h
+++ b/editor/editor_about.h
@@ -43,9 +43,6 @@
#include "scene/gui/tree.h"
#include "editor_scale.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class EditorAbout : public AcceptDialog {
diff --git a/editor/editor_asset_installer.cpp b/editor/editor_asset_installer.cpp
index b706f2cae6..98e670f952 100644
--- a/editor/editor_asset_installer.cpp
+++ b/editor/editor_asset_installer.cpp
@@ -90,7 +90,7 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) {
unzFile pkg = unzOpen2(p_path.utf8().get_data(), &io);
if (!pkg) {
- error->set_text(TTR("Error opening package file, not in zip format."));
+ error->set_text(TTR("Error opening package file, not in ZIP format."));
return;
}
@@ -217,7 +217,7 @@ void EditorAssetInstaller::ok_pressed() {
unzFile pkg = unzOpen2(package_path.utf8().get_data(), &io);
if (!pkg) {
- error->set_text(TTR("Error opening package file, not in zip format."));
+ error->set_text(TTR("Error opening package file, not in ZIP format."));
return;
}
diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp
index 7210211d90..f44e1b7b14 100644
--- a/editor/editor_autoload_settings.cpp
+++ b/editor/editor_autoload_settings.cpp
@@ -315,8 +315,7 @@ void EditorAutoloadSettings::_autoload_file_callback(const String &p_path) {
Node *EditorAutoloadSettings::_create_autoload(const String &p_path) {
RES res = ResourceLoader::load(p_path);
- ERR_EXPLAIN("Can't autoload: " + p_path);
- ERR_FAIL_COND_V(res.is_null(), NULL);
+ ERR_FAIL_COND_V_MSG(res.is_null(), NULL, "Can't autoload: " + p_path + ".");
Node *n = NULL;
if (res->is_class("PackedScene")) {
Ref<PackedScene> ps = res;
@@ -325,20 +324,17 @@ Node *EditorAutoloadSettings::_create_autoload(const String &p_path) {
Ref<Script> s = res;
StringName ibt = s->get_instance_base_type();
bool valid_type = ClassDB::is_parent_class(ibt, "Node");
- ERR_EXPLAIN("Script does not inherit a Node: " + p_path);
- ERR_FAIL_COND_V(!valid_type, NULL);
+ ERR_FAIL_COND_V_MSG(!valid_type, NULL, "Script does not inherit a Node: " + p_path + ".");
Object *obj = ClassDB::instance(ibt);
- ERR_EXPLAIN("Cannot instance script for autoload, expected 'Node' inheritance, got: " + String(ibt));
- ERR_FAIL_COND_V(obj == NULL, NULL);
+ ERR_FAIL_COND_V_MSG(obj == NULL, NULL, "Cannot instance script for autoload, expected 'Node' inheritance, got: " + String(ibt) + ".");
n = Object::cast_to<Node>(obj);
n->set_script(s.get_ref_ptr());
}
- ERR_EXPLAIN("Path in autoload not a node or script: " + p_path);
- ERR_FAIL_COND_V(!n, NULL);
+ ERR_FAIL_COND_V_MSG(!n, NULL, "Path in autoload not a node or script: " + p_path + ".");
return n;
}
@@ -443,11 +439,11 @@ void EditorAutoloadSettings::update_autoload() {
}
if (info.in_editor) {
ERR_CONTINUE(!info.node);
- get_tree()->get_root()->remove_child(info.node);
+ get_tree()->get_root()->call_deferred("remove_child", info.node);
}
if (info.node) {
- memdelete(info.node);
+ info.node->queue_delete();
info.node = NULL;
}
}
diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp
index f5846c10f6..c98635d16b 100644
--- a/editor/editor_data.cpp
+++ b/editor/editor_data.cpp
@@ -537,6 +537,7 @@ int EditorData::add_edited_scene(int p_at_pos) {
p_at_pos = edited_scene.size();
EditedScene es;
es.root = NULL;
+ es.path = String();
es.history_current = -1;
es.version = 0;
es.live_edit_root = NodePath(String("/root"));
@@ -653,6 +654,8 @@ bool EditorData::check_and_update_scene(int p_idx) {
memdelete(edited_scene[p_idx].root);
edited_scene.write[p_idx].root = new_scene;
+ if (new_scene->get_filename() != "")
+ edited_scene.write[p_idx].path = new_scene->get_filename();
edited_scene.write[p_idx].selection = new_selection;
return true;
@@ -684,6 +687,12 @@ void EditorData::set_edited_scene_root(Node *p_root) {
ERR_FAIL_INDEX(current_edited_scene, edited_scene.size());
edited_scene.write[current_edited_scene].root = p_root;
+ if (p_root) {
+ if (p_root->get_filename() != "")
+ edited_scene.write[current_edited_scene].path = p_root->get_filename();
+ else
+ p_root->set_filename(edited_scene[current_edited_scene].path);
+ }
}
int EditorData::get_edited_scene_count() const {
@@ -773,6 +782,7 @@ String EditorData::get_scene_title(int p_idx) const {
void EditorData::set_scene_path(int p_idx, const String &p_path) {
ERR_FAIL_INDEX(p_idx, edited_scene.size());
+ edited_scene.write[p_idx].path = p_path;
if (!edited_scene[p_idx].root)
return;
@@ -783,9 +793,14 @@ String EditorData::get_scene_path(int p_idx) const {
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), String());
- if (!edited_scene[p_idx].root)
- return "";
- return edited_scene[p_idx].root->get_filename();
+ if (edited_scene[p_idx].root) {
+ if (edited_scene[p_idx].root->get_filename() == "")
+ edited_scene[p_idx].root->set_filename(edited_scene[p_idx].path);
+ else
+ return edited_scene[p_idx].root->get_filename();
+ }
+
+ return edited_scene[p_idx].path;
}
void EditorData::set_edited_scene_live_edit_root(const NodePath &p_root) {
diff --git a/editor/editor_data.h b/editor/editor_data.h
index 845878e070..df83135942 100644
--- a/editor/editor_data.h
+++ b/editor/editor_data.h
@@ -117,6 +117,7 @@ public:
struct EditedScene {
Node *root;
+ String path;
Dictionary editor_states;
List<Node *> selection;
Vector<EditorHistory::History> history_stored;
diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp
index e1f2635275..e58c7c992a 100644
--- a/editor/editor_export.cpp
+++ b/editor/editor_export.cpp
@@ -30,11 +30,11 @@
#include "editor_export.h"
+#include "core/crypto/crypto_core.h"
#include "core/io/config_file.h"
#include "core/io/resource_loader.h"
#include "core/io/resource_saver.h"
#include "core/io/zip_io.h"
-#include "core/math/crypto_core.h"
#include "core/os/dir_access.h"
#include "core/os/file_access.h"
#include "core/project_settings.h"
@@ -148,6 +148,12 @@ String EditorExportPreset::get_include_filter() const {
void EditorExportPreset::set_export_path(const String &p_path) {
export_path = p_path;
+ /* NOTE(SonerSound): if there is a need to implement a PropertyHint that specifically indicates a relative path,
+ * this should be removed. */
+ if (export_path.is_abs_path()) {
+ String res_path = OS::get_singleton()->get_resource_dir();
+ export_path = res_path.path_to_file(export_path);
+ }
EditorExport::singleton->save_presets();
}
@@ -1011,7 +1017,7 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, c
if (!ftmp) {
memdelete(f);
DirAccess::remove_file_or_error(tmppath);
- ERR_FAIL_V_MSG(ERR_CANT_CREATE, "Can't open file to read from path: " + String(tmppath));
+ ERR_FAIL_V_MSG(ERR_CANT_CREATE, "Can't open file to read from path: " + String(tmppath) + ".");
}
const int bufsize = 16384;
diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp
index 1f43740858..80aeeef868 100644
--- a/editor/editor_file_dialog.cpp
+++ b/editor/editor_file_dialog.cpp
@@ -257,6 +257,7 @@ void EditorFileDialog::_post_popup() {
if (is_visible_in_tree()) {
Ref<Texture> folder = get_icon("folder", "FileDialog");
+ const Color folder_color = get_color("folder_icon_modulate", "FileDialog");
recent->clear();
bool res = access == ACCESS_RESOURCES;
@@ -274,6 +275,7 @@ void EditorFileDialog::_post_popup() {
recent->add_item(name, folder);
recent->set_item_metadata(recent->get_item_count() - 1, recentd[i]);
+ recent->set_item_icon_modulate(recent->get_item_count() - 1, folder_color);
}
local_history.clear();
@@ -734,6 +736,7 @@ void EditorFileDialog::update_file_list() {
dir_access->list_dir_begin();
Ref<Texture> folder = get_icon("folder", "FileDialog");
+ const Color folder_color = get_color("folder_icon_modulate", "FileDialog");
List<String> files;
List<String> dirs;
@@ -774,6 +777,7 @@ void EditorFileDialog::update_file_list() {
d["dir"] = true;
item_list->set_item_metadata(item_list->get_item_count() - 1, d);
+ item_list->set_item_icon_modulate(item_list->get_item_count() - 1, folder_color);
dirs.pop_front();
}
@@ -1200,6 +1204,7 @@ void EditorFileDialog::_update_favorites() {
String current = get_current_dir();
Ref<Texture> folder_icon = get_icon("Folder", "EditorIcons");
+ const Color folder_color = get_color("folder_icon_modulate", "FileDialog");
favorites->clear();
favorite->set_pressed(false);
@@ -1230,6 +1235,7 @@ void EditorFileDialog::_update_favorites() {
}
favorites->set_item_metadata(favorites->get_item_count() - 1, favorited[i]);
+ favorites->set_item_icon_modulate(favorites->get_item_count() - 1, folder_color);
if (setthis) {
favorite->set_pressed(true);
diff --git a/editor/editor_file_dialog.h b/editor/editor_file_dialog.h
index 86bf0f0eb3..2ecfa7db15 100644
--- a/editor/editor_file_dialog.h
+++ b/editor/editor_file_dialog.h
@@ -44,9 +44,6 @@
class DependencyRemoveDialog;
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class EditorFileDialog : public ConfirmationDialog {
GDCLASS(EditorFileDialog, ConfirmationDialog);
diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp
index be3df2815e..6d3377a85b 100644
--- a/editor/editor_file_system.cpp
+++ b/editor/editor_file_system.cpp
@@ -1930,8 +1930,7 @@ void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
Error err = da->make_dir(".import");
if (err) {
memdelete(da);
- ERR_EXPLAIN("Failed to create 'res://.import' folder.");
- ERR_FAIL();
+ ERR_FAIL_MSG("Failed to create 'res://.import' folder.");
}
}
memdelete(da);
diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp
index 73438ffc0c..55cae35a4a 100644
--- a/editor/editor_fonts.cpp
+++ b/editor/editor_fonts.cpp
@@ -94,7 +94,31 @@ void editor_register_fonts(Ref<Theme> p_theme) {
/* Custom font */
bool font_antialiased = (bool)EditorSettings::get_singleton()->get("interface/editor/font_antialiased");
- DynamicFontData::Hinting font_hinting = (DynamicFontData::Hinting)(int)EditorSettings::get_singleton()->get("interface/editor/font_hinting");
+ int font_hinting_setting = (int)EditorSettings::get_singleton()->get("interface/editor/font_hinting");
+
+ DynamicFontData::Hinting font_hinting;
+ switch (font_hinting_setting) {
+ case 0:
+ // The "Auto" setting uses the setting that best matches the OS' font rendering:
+ // - macOS doesn't use font hinting.
+ // - Windows uses ClearType, which is in between "Light" and "Normal" hinting.
+ // - Linux has configurable font hinting, but most distributions including Ubuntu default to "Light".
+#ifdef OSX_ENABLED
+ font_hinting = DynamicFontData::HINTING_NONE;
+#else
+ font_hinting = DynamicFontData::HINTING_LIGHT;
+#endif
+ break;
+ case 1:
+ font_hinting = DynamicFontData::HINTING_NONE;
+ break;
+ case 2:
+ font_hinting = DynamicFontData::HINTING_LIGHT;
+ break;
+ default:
+ font_hinting = DynamicFontData::HINTING_NORMAL;
+ break;
+ }
String custom_font_path = EditorSettings::get_singleton()->get("interface/editor/main_font");
Ref<DynamicFontData> CustomFont;
diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp
index 7aa24c7476..e6df00b48c 100644
--- a/editor/editor_help.cpp
+++ b/editor/editor_help.cpp
@@ -54,6 +54,7 @@ void EditorHelp::_init_colors() {
qualifier_color = text_color * Color(1, 1, 1, 0.8);
type_color = get_color("accent_color", "Editor").linear_interpolate(text_color, 0.5);
class_desc->add_color_override("selection_color", get_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
+ class_desc->add_constant_override("line_separation", Math::round(5 * EDSCALE));
}
void EditorHelp::_unhandled_key_input(const Ref<InputEvent> &p_ev) {
@@ -164,6 +165,17 @@ void EditorHelp::_class_desc_select(const String &p_select) {
void EditorHelp::_class_desc_input(const Ref<InputEvent> &p_input) {
}
+void EditorHelp::_class_desc_resized() {
+ // Add extra horizontal margins for better readability.
+ // The margins increase as the width of the editor help container increases.
+ const int display_margin = MAX(30 * EDSCALE, get_parent_anchorable_rect().size.width - 900 * EDSCALE) * 0.5;
+
+ Ref<StyleBox> class_desc_stylebox = EditorNode::get_singleton()->get_theme_base()->get_stylebox("normal", "RichTextLabel")->duplicate();
+ class_desc_stylebox->set_default_margin(MARGIN_LEFT, display_margin);
+ class_desc_stylebox->set_default_margin(MARGIN_RIGHT, display_margin);
+ class_desc->add_style_override("normal", class_desc_stylebox);
+}
+
void EditorHelp::_add_type(const String &p_type, const String &p_enum) {
String t = p_type;
@@ -1488,6 +1500,7 @@ void EditorHelp::_bind_methods() {
ClassDB::bind_method("_class_list_select", &EditorHelp::_class_list_select);
ClassDB::bind_method("_class_desc_select", &EditorHelp::_class_desc_select);
ClassDB::bind_method("_class_desc_input", &EditorHelp::_class_desc_input);
+ ClassDB::bind_method("_class_desc_resized", &EditorHelp::_class_desc_resized);
ClassDB::bind_method("_request_help", &EditorHelp::_request_help);
ClassDB::bind_method("_unhandled_key_input", &EditorHelp::_unhandled_key_input);
ClassDB::bind_method("_search", &EditorHelp::_search);
@@ -1506,8 +1519,11 @@ EditorHelp::EditorHelp() {
add_child(class_desc);
class_desc->set_v_size_flags(SIZE_EXPAND_FILL);
class_desc->add_color_override("selection_color", get_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
+
class_desc->connect("meta_clicked", this, "_class_desc_select");
class_desc->connect("gui_input", this, "_class_desc_input");
+ class_desc->connect("resized", this, "_class_desc_resized");
+ _class_desc_resized();
// Added second so it opens at the bottom so it won't offset the entire widget.
find_bar = memnew(FindBar);
@@ -1738,19 +1754,13 @@ void FindBar::_update_results_count() {
void FindBar::_update_matches_label() {
- if (results_count > 0) {
- matches_label->show();
-
- matches_label->add_color_override("font_color", Color(1, 1, 1));
- matches_label->set_text(vformat(TTR("Found %d match(es)."), results_count));
- } else if (search_text->get_text().empty()) {
-
+ if (search_text->get_text().empty() || results_count == -1) {
matches_label->hide();
} else {
matches_label->show();
- matches_label->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
- matches_label->set_text(TTR("No Matches"));
+ matches_label->add_color_override("font_color", results_count > 0 ? Color(1, 1, 1) : EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
+ matches_label->set_text(vformat(results_count == 1 ? TTR("%d match.") : TTR("%d matches."), results_count));
}
}
diff --git a/editor/editor_help.h b/editor/editor_help.h
index 3824ba231e..1019cafffc 100644
--- a/editor/editor_help.h
+++ b/editor/editor_help.h
@@ -151,6 +151,7 @@ class EditorHelp : public VBoxContainer {
void _class_list_select(const String &p_select);
void _class_desc_select(const String &p_select);
void _class_desc_input(const Ref<InputEvent> &p_input);
+ void _class_desc_resized();
Error _goto_desc(const String &p_class, int p_vscr = -1);
//void _update_history_buttons();
diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp
index fbfc999dbf..af79c21f85 100644
--- a/editor/editor_help_search.cpp
+++ b/editor/editor_help_search.cpp
@@ -354,7 +354,7 @@ bool EditorHelpSearch::Runner::_phase_match_classes() {
match.constants.push_back(const_cast<DocData::ConstantDoc *>(&class_doc.constants[i]));
if (search_flags & SEARCH_PROPERTIES)
for (int i = 0; i < class_doc.properties.size(); i++)
- if (_match_string(term, class_doc.properties[i].name))
+ if (_match_string(term, class_doc.properties[i].name) || _match_string(term, class_doc.properties[i].getter) || _match_string(term, class_doc.properties[i].setter))
match.properties.push_back(const_cast<DocData::PropertyDoc *>(&class_doc.properties[i]));
if (search_flags & SEARCH_THEME_ITEMS)
for (int i = 0; i < class_doc.theme_properties.size(); i++)
diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp
index 8b3e108690..a76d34e122 100644
--- a/editor/editor_inspector.cpp
+++ b/editor/editor_inspector.cpp
@@ -1044,7 +1044,6 @@ void EditorInspectorSection::_notification(int p_what) {
Ref<Font> font = get_font("font", "Tree");
Ref<Texture> arrow;
-#ifdef TOOLS_ENABLED
if (foldable) {
if (object->editor_is_section_unfolded(section)) {
arrow = get_icon("arrow_up", "Tree");
@@ -1052,7 +1051,6 @@ void EditorInspectorSection::_notification(int p_what) {
arrow = get_icon("arrow", "Tree");
}
}
-#endif
Size2 size = get_size();
Point2 offset;
@@ -1087,7 +1085,6 @@ void EditorInspectorSection::_notification(int p_what) {
Ref<Texture> arrow;
-#ifdef TOOLS_ENABLED
if (foldable) {
if (object->editor_is_section_unfolded(section)) {
arrow = get_icon("arrow_up", "Tree");
@@ -1095,7 +1092,6 @@ void EditorInspectorSection::_notification(int p_what) {
arrow = get_icon("arrow", "Tree");
}
}
-#endif
Ref<Font> font = get_font("font", "Tree");
@@ -1155,7 +1151,6 @@ void EditorInspectorSection::setup(const String &p_section, const String &p_labe
vbox_added = true;
}
-#ifdef TOOLS_ENABLED
if (foldable) {
_test_unfold();
if (object->editor_is_section_unfolded(section)) {
@@ -1164,7 +1159,6 @@ void EditorInspectorSection::setup(const String &p_section, const String &p_labe
vbox->hide();
}
}
-#endif
}
void EditorInspectorSection::_gui_input(const Ref<InputEvent> &p_event) {
@@ -1172,7 +1166,6 @@ void EditorInspectorSection::_gui_input(const Ref<InputEvent> &p_event) {
if (!foldable)
return;
-#ifdef TOOLS_ENABLED
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
@@ -1191,7 +1184,6 @@ void EditorInspectorSection::_gui_input(const Ref<InputEvent> &p_event) {
vbox->hide();
}
}
-#endif
}
VBoxContainer *EditorInspectorSection::get_vbox() {
@@ -1205,11 +1197,9 @@ void EditorInspectorSection::unfold() {
_test_unfold();
-#ifdef TOOLS_ENABLED
object->editor_set_section_unfold(section, true);
vbox->show();
update();
-#endif
}
void EditorInspectorSection::fold() {
@@ -1219,11 +1209,9 @@ void EditorInspectorSection::fold() {
if (!vbox_added)
return; //kinda pointless
-#ifdef TOOLS_ENABLED
object->editor_set_section_unfold(section, false);
vbox->hide();
update();
-#endif
}
void EditorInspectorSection::_bind_methods() {
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index ae2a6d2802..98f5fcbeec 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -135,6 +135,8 @@ void EditorNode::_update_scene_tabs() {
bool show_rb = EditorSettings::get_singleton()->get("interface/scene_tabs/show_script_button");
+ OS::get_singleton()->global_menu_clear("_dock");
+
scene_tabs->clear_tabs();
Ref<Texture> script_icon = gui_base->get_icon("Script", "EditorIcons");
for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
@@ -149,11 +151,16 @@ void EditorNode::_update_scene_tabs() {
bool unsaved = (i == current) ? saved_version != editor_data.get_undo_redo().get_version() : editor_data.get_scene_version(i) != 0;
scene_tabs->add_tab(editor_data.get_scene_title(i) + (unsaved ? "(*)" : ""), icon);
+ OS::get_singleton()->global_menu_add_item("_dock", editor_data.get_scene_title(i) + (unsaved ? "(*)" : ""), GLOBAL_SCENE, i);
+
if (show_rb && editor_data.get_scene_root_script(i).is_valid()) {
scene_tabs->set_tab_right_button(i, script_icon);
}
}
+ OS::get_singleton()->global_menu_add_separator("_dock");
+ OS::get_singleton()->global_menu_add_item("_dock", TTR("New Window"), GLOBAL_NEW_WINDOW, Variant());
+
scene_tabs->set_current_tab(editor_data.get_edited_scene());
if (scene_tabs->get_offset_buttons_visible()) {
@@ -290,6 +297,7 @@ void EditorNode::_notification(int p_what) {
get_tree()->get_root()->set_as_audio_listener_2d(false);
get_tree()->set_auto_accept_quit(false);
get_tree()->connect("files_dropped", this, "_dropped_files");
+ get_tree()->connect("global_menu_action", this, "_global_menu_action");
/* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */
} break;
@@ -1926,10 +1934,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
switch (p_option) {
case FILE_NEW_SCENE: {
- int idx = editor_data.add_edited_scene(-1);
- _scene_tab_changed(idx);
- editor_data.clear_editor_states();
- _update_scene_tabs();
+ new_scene();
} break;
case FILE_NEW_INHERITED_SCENE:
@@ -2627,11 +2632,8 @@ void EditorNode::_exit_editor() {
resource_preview->stop(); //stop early to avoid crashes
_save_docks();
- // Dim the editor window while it's quitting to make it clearer that it's busy.
- // No transition is applied, as the effect needs to be visible immediately
- float c = 0.4f;
- Color dim_color = Color(c, c, c);
- gui_base->set_modulate(dim_color);
+ // Dim the editor window while it's quitting to make it clearer that it's busy
+ dim_editor(true, true);
get_tree()->quit();
}
@@ -2798,8 +2800,7 @@ void EditorNode::select_editor_by_name(const String &p_name) {
}
}
- ERR_EXPLAIN("The editor name '" + p_name + "' was not found.");
- ERR_FAIL();
+ ERR_FAIL_MSG("The editor name '" + p_name + "' was not found.");
}
void EditorNode::add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed) {
@@ -2925,36 +2926,39 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled,
return;
}
- String path = cf->get_value("plugin", "script");
- path = String("res://addons").plus_file(p_addon).plus_file(path);
+ String script_path = cf->get_value("plugin", "script");
+ Ref<Script> script; // We need to save it for creating "ep" below.
- Ref<Script> script = ResourceLoader::load(path);
+ // Only try to load the script if it has a name. Else, the plugin has no init script.
+ if (script_path.length() > 0) {
+ script_path = String("res://addons").plus_file(p_addon).plus_file(script_path);
+ script = ResourceLoader::load(script_path);
- if (script.is_null()) {
- show_warning(vformat(TTR("Unable to load addon script from path: '%s'."), path));
- return;
- }
+ if (script.is_null()) {
+ show_warning(vformat(TTR("Unable to load addon script from path: '%s'."), script_path));
+ return;
+ }
- //errors in the script cause the base_type to be ""
- if (String(script->get_instance_base_type()) == "") {
- show_warning(vformat(TTR("Unable to load addon script from path: '%s' There seems to be an error in the code, please check the syntax."), path));
- return;
- }
+ // Errors in the script cause the base_type to be an empty string.
+ if (String(script->get_instance_base_type()) == "") {
+ show_warning(vformat(TTR("Unable to load addon script from path: '%s' There seems to be an error in the code, please check the syntax."), script_path));
+ return;
+ }
- //could check inheritance..
- if (String(script->get_instance_base_type()) != "EditorPlugin") {
- show_warning(vformat(TTR("Unable to load addon script from path: '%s' Base type is not EditorPlugin."), path));
- return;
- }
+ // Plugin init scripts must inherit from EditorPlugin and be tools.
+ if (String(script->get_instance_base_type()) != "EditorPlugin") {
+ show_warning(vformat(TTR("Unable to load addon script from path: '%s' Base type is not EditorPlugin."), script_path));
+ return;
+ }
- if (!script->is_tool()) {
- show_warning(vformat(TTR("Unable to load addon script from path: '%s' Script is not in tool mode."), path));
- return;
+ if (!script->is_tool()) {
+ show_warning(vformat(TTR("Unable to load addon script from path: '%s' Script is not in tool mode."), script_path));
+ return;
+ }
}
EditorPlugin *ep = memnew(EditorPlugin);
ep->set_script(script.get_ref_ptr());
- ep->set_dir_cache(p_addon);
plugin_addons[p_addon] = ep;
add_editor_plugin(ep, p_config_changed);
@@ -3162,6 +3166,14 @@ void EditorNode::fix_dependencies(const String &p_for_file) {
dependency_fixer->edit(p_for_file);
}
+int EditorNode::new_scene() {
+ int idx = editor_data.add_edited_scene(-1);
+ _scene_tab_changed(idx);
+ editor_data.clear_editor_states();
+ _update_scene_tabs();
+ return idx;
+}
+
Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, bool p_set_inherited, bool p_clear_errors, bool p_force_open_imported) {
if (!is_inside_tree()) {
@@ -3820,9 +3832,13 @@ void EditorNode::show_accept(const String &p_text, const String &p_title) {
void EditorNode::show_warning(const String &p_text, const String &p_title) {
- warning->set_text(p_text);
- warning->set_title(p_title);
- warning->popup_centered_minsize();
+ if (warning->is_inside_tree()) {
+ warning->set_text(p_text);
+ warning->set_title(p_title);
+ warning->popup_centered_minsize();
+ } else {
+ WARN_PRINTS(p_title + " " + p_text);
+ }
}
void EditorNode::_copy_warning(const String &p_str) {
@@ -4366,6 +4382,15 @@ bool EditorNode::ensure_main_scene(bool p_from_native) {
return true;
}
+void EditorNode::run_play() {
+ _menu_option_confirm(RUN_STOP, true);
+ _run(false);
+}
+
+void EditorNode::run_stop() {
+ _menu_option_confirm(RUN_STOP, false);
+}
+
int EditorNode::get_current_tab() {
return scene_tabs->get_current_tab();
}
@@ -4783,8 +4808,7 @@ void EditorNode::remove_control_from_dock(Control *p_control) {
}
}
- ERR_EXPLAIN("Control was not in dock");
- ERR_FAIL_COND(!dock);
+ ERR_FAIL_COND_MSG(!dock, "Control was not in dock.");
dock->remove_child(p_control);
_update_dock_slots_visibility();
@@ -4922,6 +4946,23 @@ void EditorNode::remove_tool_menu_item(const String &p_name) {
}
}
+void EditorNode::_global_menu_action(const Variant &p_id, const Variant &p_meta) {
+
+ int id = (int)p_id;
+ if (id == GLOBAL_NEW_WINDOW) {
+ if (OS::get_singleton()->get_main_loop()) {
+ List<String> args;
+ String exec = OS::get_singleton()->get_executable_path();
+
+ OS::ProcessID pid = 0;
+ OS::get_singleton()->execute(exec, args, false, &pid);
+ }
+ } else if (id == GLOBAL_SCENE) {
+ int idx = (int)p_meta;
+ scene_tabs->set_current_tab(idx);
+ }
+}
+
void EditorNode::_dropped_files(const Vector<String> &p_files, int p_screen) {
String to_path = ProjectSettings::get_singleton()->globalize_path(get_filesystem_dock()->get_selected_path());
@@ -5089,46 +5130,12 @@ void EditorNode::_open_imported() {
load_scene(open_import_request, true, false, true, true);
}
-void EditorNode::dim_editor(bool p_dimming) {
- static int dim_count = 0;
- bool dim_ui = EditorSettings::get_singleton()->get("interface/editor/dim_editor_on_dialog_popup");
- if (p_dimming) {
- if (dim_ui && dim_count == 0) {
- _start_dimming(true);
- }
- dim_count++;
- } else {
- if (dim_count == 1) {
- _start_dimming(false);
- }
- if (dim_count > 0) {
- dim_count--;
- } else {
- ERR_PRINT("Undimmed before dimming!");
- }
- }
-}
-
-void EditorNode::_start_dimming(bool p_dimming) {
- _dimming = p_dimming;
- _dim_time = 0.0f;
- _dim_timer->start();
-}
-
-void EditorNode::_dim_timeout() {
-
- _dim_time += _dim_timer->get_wait_time();
- float wait_time = 0.08f;
- float c = 0.4f;
-
- Color base = _dimming ? Color(1, 1, 1) : Color(c, c, c);
- Color final = _dimming ? Color(c, c, c) : Color(1, 1, 1);
-
- if (_dim_time + _dim_timer->get_wait_time() >= wait_time) {
- gui_base->set_modulate(final);
- _dim_timer->stop();
+void EditorNode::dim_editor(bool p_dimming, bool p_force_dim) {
+ // Dimming can be forced regardless of the editor setting, which is useful when quitting the editor
+ if ((p_force_dim || EditorSettings::get_singleton()->get("interface/editor/dim_editor_on_dialog_popup")) && p_dimming) {
+ gui_base->set_modulate(Color(0.5, 0.5, 0.5));
} else {
- gui_base->set_modulate(base.linear_interpolate(final, _dim_time / wait_time));
+ gui_base->set_modulate(Color(1, 1, 1));
}
}
@@ -5303,6 +5310,7 @@ void EditorNode::_bind_methods() {
ClassDB::bind_method("_clear_undo_history", &EditorNode::_clear_undo_history);
ClassDB::bind_method("_dropped_files", &EditorNode::_dropped_files);
+ ClassDB::bind_method(D_METHOD("_global_menu_action"), &EditorNode::_global_menu_action, DEFVAL(Variant()));
ClassDB::bind_method("_toggle_distraction_free_mode", &EditorNode::_toggle_distraction_free_mode);
ClassDB::bind_method("edit_item_resource", &EditorNode::edit_item_resource);
@@ -5311,7 +5319,6 @@ void EditorNode::_bind_methods() {
ClassDB::bind_method(D_METHOD("_open_imported"), &EditorNode::_open_imported);
ClassDB::bind_method(D_METHOD("_inherit_imported"), &EditorNode::_inherit_imported);
- ClassDB::bind_method(D_METHOD("_dim_timeout"), &EditorNode::_dim_timeout);
ClassDB::bind_method("_copy_warning", &EditorNode::_copy_warning);
@@ -5496,6 +5503,9 @@ EditorNode::EditorNode() {
}
}
+ // Define a minimum window size to prevent UI elements from overlapping or being cut off
+ OS::get_singleton()->set_min_window_size(Size2(1024, 600) * EDSCALE);
+
ResourceLoader::set_abort_on_missing_resources(false);
FileDialog::set_default_show_hidden_files(EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files"));
EditorFileDialog::set_default_show_hidden_files(EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files"));
@@ -5627,6 +5637,8 @@ EditorNode::EditorNode() {
EDITOR_DEF("interface/inspector/horizontal_vector_types_editing", true);
EDITOR_DEF("interface/inspector/open_resources_in_current_inspector", true);
EDITOR_DEF("interface/inspector/resources_to_open_in_new_inspector", "SpatialMaterial,Script,MeshLibrary,TileSet");
+ EDITOR_DEF("interface/inspector/default_color_picker_mode", 0);
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "interface/inspector/default_color_picker_mode", PROPERTY_HINT_ENUM, "RGB,HSV,RAW", PROPERTY_USAGE_DEFAULT));
EDITOR_DEF("run/auto_save/save_before_running", true);
theme_base = memnew(Control);
@@ -5770,6 +5782,7 @@ EditorNode::EditorNode() {
dock_slot[i]->set_drag_to_rearrange_enabled(true);
dock_slot[i]->set_tabs_rearrange_group(1);
dock_slot[i]->connect("tab_changed", this, "_dock_tab_changed");
+ dock_slot[i]->set_use_hidden_tabs_for_min_size(true);
}
dock_drag_timer = memnew(Timer);
@@ -5934,19 +5947,19 @@ EditorNode::EditorNode() {
p->add_shortcut(ED_SHORTCUT("editor/new_scene", TTR("New Scene")), FILE_NEW_SCENE);
p->add_shortcut(ED_SHORTCUT("editor/new_inherited_scene", TTR("New Inherited Scene...")), FILE_NEW_INHERITED_SCENE);
p->add_shortcut(ED_SHORTCUT("editor/open_scene", TTR("Open Scene..."), KEY_MASK_CMD + KEY_O), FILE_OPEN_SCENE);
+ p->add_shortcut(ED_SHORTCUT("editor/reopen_closed_scene", TTR("Reopen Closed Scene"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_T), FILE_OPEN_PREV);
+ p->add_submenu_item(TTR("Open Recent"), "RecentScenes", FILE_OPEN_RECENT);
+
p->add_separator();
p->add_shortcut(ED_SHORTCUT("editor/save_scene", TTR("Save Scene"), KEY_MASK_CMD + KEY_S), FILE_SAVE_SCENE);
p->add_shortcut(ED_SHORTCUT("editor/save_scene_as", TTR("Save Scene As..."), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_S), FILE_SAVE_AS_SCENE);
p->add_shortcut(ED_SHORTCUT("editor/save_all_scenes", TTR("Save All Scenes"), KEY_MASK_ALT + KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_S), FILE_SAVE_ALL_SCENES);
- p->add_separator();
- p->add_shortcut(ED_SHORTCUT("editor/close_scene", TTR("Close Scene"), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_W), FILE_CLOSE);
- p->add_separator();
- p->add_submenu_item(TTR("Open Recent"), "RecentScenes", FILE_OPEN_RECENT);
- p->add_shortcut(ED_SHORTCUT("editor/reopen_closed_scene", TTR("Reopen Closed Scene"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_T), FILE_OPEN_PREV);
+
p->add_separator();
p->add_shortcut(ED_SHORTCUT("editor/quick_open", TTR("Quick Open..."), KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_O), FILE_QUICK_OPEN);
p->add_shortcut(ED_SHORTCUT("editor/quick_open_scene", TTR("Quick Open Scene..."), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_O), FILE_QUICK_OPEN_SCENE);
p->add_shortcut(ED_SHORTCUT("editor/quick_open_script", TTR("Quick Open Script..."), KEY_MASK_ALT + KEY_MASK_CMD + KEY_O), FILE_QUICK_OPEN_SCRIPT);
+
p->add_separator();
PopupMenu *pm_export = memnew(PopupMenu);
pm_export->set_name("Export");
@@ -5959,8 +5972,10 @@ EditorNode::EditorNode() {
p->add_separator();
p->add_shortcut(ED_SHORTCUT("editor/undo", TTR("Undo"), KEY_MASK_CMD + KEY_Z), EDIT_UNDO, true);
p->add_shortcut(ED_SHORTCUT("editor/redo", TTR("Redo"), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_Z), EDIT_REDO, true);
+
p->add_separator();
p->add_shortcut(ED_SHORTCUT("editor/revert_scene", TTR("Revert Scene")), EDIT_REVERT);
+ p->add_shortcut(ED_SHORTCUT("editor/close_scene", TTR("Close Scene"), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_W), FILE_CLOSE);
recent_scenes = memnew(PopupMenu);
recent_scenes->set_name("RecentScenes");
@@ -5980,27 +5995,27 @@ EditorNode::EditorNode() {
p = project_menu->get_popup();
p->set_hide_on_window_lose_focus(true);
- p->add_shortcut(ED_SHORTCUT("editor/project_settings", TTR("Project Settings")), RUN_SETTINGS);
- p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("editor/project_settings", TTR("Project Settings...")), RUN_SETTINGS);
p->connect("id_pressed", this, "_menu_option");
- p->add_shortcut(ED_SHORTCUT("editor/export", TTR("Export")), FILE_EXPORT_PROJECT);
+
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("editor/export", TTR("Export...")), FILE_EXPORT_PROJECT);
+ p->add_item(TTR("Install Android Build Template..."), FILE_INSTALL_ANDROID_SOURCE);
+ p->add_item(TTR("Open Project Data Folder"), RUN_PROJECT_DATA_FOLDER);
plugin_config_dialog = memnew(PluginConfigDialog);
plugin_config_dialog->connect("plugin_ready", this, "_on_plugin_ready");
gui_base->add_child(plugin_config_dialog);
+ p->add_separator();
tool_menu = memnew(PopupMenu);
tool_menu->set_name("Tools");
tool_menu->connect("index_pressed", this, "_tool_menu_option");
- p->add_separator();
p->add_child(tool_menu);
p->add_submenu_item(TTR("Tools"), "Tools");
- tool_menu->add_item(TTR("Orphan Resource Explorer"), TOOLS_ORPHAN_RESOURCES);
- tool_menu->add_item(TTR("Open Project Data Folder"), RUN_PROJECT_DATA_FOLDER);
- p->add_separator();
- p->add_item(TTR("Install Android Build Template"), FILE_INSTALL_ANDROID_SOURCE);
- p->add_separator();
+ tool_menu->add_item(TTR("Orphan Resource Explorer..."), TOOLS_ORPHAN_RESOURCES);
+ p->add_separator();
#ifdef OSX_ENABLED
p->add_shortcut(ED_SHORTCUT("editor/quit_to_project_list", TTR("Quit to Project List"), KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_Q), RUN_PROJECT_MANAGER, true);
#else
@@ -6052,7 +6067,7 @@ EditorNode::EditorNode() {
p = settings_menu->get_popup();
p->set_hide_on_window_lose_focus(true);
- p->add_shortcut(ED_SHORTCUT("editor/editor_settings", TTR("Editor Settings")), SETTINGS_PREFERENCES);
+ p->add_shortcut(ED_SHORTCUT("editor/editor_settings", TTR("Editor Settings...")), SETTINGS_PREFERENCES);
p->add_separator();
editor_layouts = memnew(PopupMenu);
@@ -6087,11 +6102,8 @@ EditorNode::EditorNode() {
}
p->add_separator();
- p->add_item(TTR("Manage Editor Features"), SETTINGS_MANAGE_FEATURE_PROFILES);
-
- p->add_separator();
-
- p->add_item(TTR("Manage Export Templates"), SETTINGS_MANAGE_EXPORT_TEMPLATES);
+ p->add_item(TTR("Manage Editor Features..."), SETTINGS_MANAGE_FEATURE_PROFILES);
+ p->add_item(TTR("Manage Export Templates..."), SETTINGS_MANAGE_EXPORT_TEMPLATES);
// Help Menu
help_menu = memnew(MenuButton);
@@ -6364,13 +6376,13 @@ EditorNode::EditorNode() {
gui_base->add_child(custom_build_manage_templates);
install_android_build_template = memnew(ConfirmationDialog);
- install_android_build_template->set_text(TTR("This will install the Android project for custom builds.\nNote that, in order to use it, it needs to be enabled per export preset."));
+ install_android_build_template->set_text(TTR("This will set up your project for custom Android builds by installing the source template to \"res://android/build\".\nYou can then apply modifications and build your own custom APK on export (adding modules, changing the AndroidManifest.xml, etc.).\nNote that in order to make custom builds instead of using pre-built APKs, the \"Use Custom Build\" option should be enabled in the Android export preset."));
install_android_build_template->get_ok()->set_text(TTR("Install"));
install_android_build_template->connect("confirmed", this, "_menu_confirm_current");
gui_base->add_child(install_android_build_template);
remove_android_build_template = memnew(ConfirmationDialog);
- remove_android_build_template->set_text(TTR("Android build template is already installed and it won't be overwritten.\nRemove the \"build\" directory manually before attempting this operation again."));
+ remove_android_build_template->set_text(TTR("The Android build template is already installed in this project and it won't be overwritten.\nRemove the \"res://android/build\" directory manually before attempting this operation again."));
remove_android_build_template->get_ok()->set_text(TTR("Show in File Manager"));
remove_android_build_template->connect("confirmed", this, "_menu_option", varray(FILE_EXPLORE_ANDROID_BUILD_TEMPLATES));
gui_base->add_child(remove_android_build_template);
@@ -6640,13 +6652,6 @@ EditorNode::EditorNode() {
waiting_for_first_scan = true;
- _dimming = false;
- _dim_time = 0.0f;
- _dim_timer = memnew(Timer);
- _dim_timer->set_wait_time(0.01666f);
- _dim_timer->connect("timeout", this, "_dim_timeout");
- add_child(_dim_timer);
-
print_handler.printfunc = _print_handler;
print_handler.userdata = this;
add_print_handler(&print_handler);
diff --git a/editor/editor_node.h b/editor/editor_node.h
index 8d536a1b86..54bcf14c1b 100644
--- a/editor/editor_node.h
+++ b/editor/editor_node.h
@@ -86,10 +86,6 @@
#include "scene/gui/tree.h"
#include "scene/gui/viewport_container.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
typedef void (*EditorNodeInitCallback)();
typedef void (*EditorPluginInitializeCallback)();
typedef bool (*EditorBuildCallback)();
@@ -211,6 +207,9 @@ private:
SET_VIDEO_DRIVER_SAVE_AND_RESTART,
+ GLOBAL_NEW_WINDOW,
+ GLOBAL_SCENE,
+
IMPORT_PLUGIN_BASE = 100,
TOOL_MENU_BASE = 1000
@@ -508,6 +507,7 @@ private:
void _add_to_recent_scenes(const String &p_scene);
void _update_recent_scenes();
void _open_recent_scene(int p_idx);
+ void _global_menu_action(const Variant &p_id, const Variant &p_meta);
void _dropped_files(const Vector<String> &p_files, int p_screen);
void _add_dropped_files_recursive(const Vector<String> &p_files, String to_path);
String _recent_scene;
@@ -633,13 +633,6 @@ private:
static int build_callback_count;
static EditorBuildCallback build_callbacks[MAX_BUILD_CALLBACKS];
- bool _dimming;
- float _dim_time;
- Timer *_dim_timer;
-
- void _start_dimming(bool p_dimming);
- void _dim_timeout();
-
void _license_tree_selected();
void _update_update_spinner();
@@ -749,6 +742,7 @@ public:
void fix_dependencies(const String &p_for_file);
void clear_scene() { _cleanup_scene(); }
+ int new_scene();
Error load_scene(const String &p_scene, bool p_ignore_broken_deps = false, bool p_set_inherited = false, bool p_clear_errors = true, bool p_force_open_imported = false);
Error load_resource(const String &p_resource, bool p_ignore_broken_deps = false);
@@ -848,7 +842,7 @@ public:
void save_scene_list(Vector<String> p_scene_filenames);
void restart_editor();
- void dim_editor(bool p_dimming);
+ void dim_editor(bool p_dimming, bool p_force_dim = false);
void edit_current() { _edit_current(); };
@@ -869,6 +863,9 @@ public:
static void add_build_callback(EditorBuildCallback p_callback);
bool ensure_main_scene(bool p_from_native);
+
+ void run_play();
+ void run_stop();
};
struct EditorProgress {
diff --git a/editor/editor_path.cpp b/editor/editor_path.cpp
index 12510e27de..23d28261d1 100644
--- a/editor/editor_path.cpp
+++ b/editor/editor_path.cpp
@@ -78,6 +78,9 @@ void EditorPath::_about_to_show() {
}
void EditorPath::update_path() {
+ set_text("");
+ set_tooltip("");
+ set_icon(NULL);
for (int i = 0; i < history->get_path_size(); i++) {
diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp
index 4b6afcbb86..310a107ca9 100644
--- a/editor/editor_plugin.cpp
+++ b/editor/editor_plugin.cpp
@@ -211,6 +211,10 @@ String EditorInterface::get_selected_path() const {
return EditorNode::get_singleton()->get_filesystem_dock()->get_selected_path();
}
+String EditorInterface::get_current_path() const {
+ return EditorNode::get_singleton()->get_filesystem_dock()->get_current_path();
+}
+
void EditorInterface::inspect_object(Object *p_obj, const String &p_for_property) {
EditorNode::get_singleton()->push_item(p_obj, p_for_property);
@@ -238,7 +242,7 @@ Control *EditorInterface::get_base_control() {
}
void EditorInterface::set_plugin_enabled(const String &p_plugin, bool p_enabled) {
- EditorNode::get_singleton()->set_addon_plugin_enabled(p_plugin, p_enabled);
+ EditorNode::get_singleton()->set_addon_plugin_enabled(p_plugin, p_enabled, true);
}
bool EditorInterface::is_plugin_enabled(const String &p_plugin) const {
@@ -288,6 +292,7 @@ void EditorInterface::_bind_methods() {
ClassDB::bind_method(D_METHOD("make_mesh_previews", "meshes", "preview_size"), &EditorInterface::_make_mesh_previews);
ClassDB::bind_method(D_METHOD("select_file", "file"), &EditorInterface::select_file);
ClassDB::bind_method(D_METHOD("get_selected_path"), &EditorInterface::get_selected_path);
+ ClassDB::bind_method(D_METHOD("get_current_path"), &EditorInterface::get_current_path);
ClassDB::bind_method(D_METHOD("set_plugin_enabled", "plugin", "enabled"), &EditorInterface::set_plugin_enabled);
ClassDB::bind_method(D_METHOD("is_plugin_enabled", "plugin"), &EditorInterface::is_plugin_enabled);
@@ -324,13 +329,6 @@ void EditorPlugin::remove_autoload_singleton(const String &p_name) {
EditorNode::get_singleton()->get_project_settings()->get_autoload_settings()->autoload_remove(p_name);
}
-Ref<ConfigFile> EditorPlugin::get_config() {
- Ref<ConfigFile> cf = memnew(ConfigFile);
- Error err = cf->load(_dir_cache.plus_file("plugin.cfg"));
- ERR_FAIL_COND_V(err != OK, cf);
- return cf;
-}
-
ToolButton *EditorPlugin::add_control_to_bottom_panel(Control *p_control, const String &p_title) {
ERR_FAIL_NULL_V(p_control, NULL);
return EditorNode::get_singleton()->add_bottom_panel_item(p_title, p_control);
diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h
index 52ab444522..63f5a4f87a 100644
--- a/editor/editor_plugin.h
+++ b/editor/editor_plugin.h
@@ -41,10 +41,6 @@
#include "scene/main/node.h"
#include "scene/resources/texture.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class EditorNode;
class Spatial;
class Camera;
@@ -82,6 +78,7 @@ public:
void select_file(const String &p_file);
String get_selected_path() const;
+ String get_current_path() const;
void inspect_object(Object *p_obj, const String &p_for_property = String());
@@ -121,7 +118,6 @@ class EditorPlugin : public Node {
bool force_draw_over_forwarding_enabled;
String last_main_screen_name;
- String _dir_cache;
protected:
static void _bind_methods();
@@ -240,10 +236,6 @@ public:
void add_autoload_singleton(const String &p_name, const String &p_path);
void remove_autoload_singleton(const String &p_name);
- void set_dir_cache(const String &p_dir) { _dir_cache = p_dir; }
- String get_dir_cache() { return _dir_cache; }
- Ref<ConfigFile> get_config();
-
void enable_plugin();
void disable_plugin();
diff --git a/editor/editor_plugin_settings.cpp b/editor/editor_plugin_settings.cpp
index 09577e39e1..514b3ff5d2 100644
--- a/editor/editor_plugin_settings.cpp
+++ b/editor/editor_plugin_settings.cpp
@@ -96,45 +96,59 @@ void EditorPluginSettings::update_plugins() {
if (err2 != OK) {
WARN_PRINTS("Can't load plugin config: " + path);
- } else if (!cf->has_section_key("plugin", "name")) {
- WARN_PRINTS("Plugin misses plugin/name: " + path);
- } else if (!cf->has_section_key("plugin", "author")) {
- WARN_PRINTS("Plugin misses plugin/author: " + path);
- } else if (!cf->has_section_key("plugin", "version")) {
- WARN_PRINTS("Plugin misses plugin/version: " + path);
- } else if (!cf->has_section_key("plugin", "description")) {
- WARN_PRINTS("Plugin misses plugin/description: " + path);
- } else if (!cf->has_section_key("plugin", "script")) {
- WARN_PRINTS("Plugin misses plugin/script: " + path);
} else {
+ bool key_missing = false;
- String d2 = plugins[i];
- String name = cf->get_value("plugin", "name");
- String author = cf->get_value("plugin", "author");
- String version = cf->get_value("plugin", "version");
- String description = cf->get_value("plugin", "description");
- String script = cf->get_value("plugin", "script");
-
- TreeItem *item = plugin_list->create_item(root);
- item->set_text(0, name);
- item->set_tooltip(0, "Name: " + name + "\nPath: " + path + "\nMain Script: " + script + "\nDescription: " + description);
- item->set_metadata(0, d2);
- item->set_text(1, version);
- item->set_metadata(1, script);
- item->set_text(2, author);
- item->set_metadata(2, description);
- item->set_cell_mode(3, TreeItem::CELL_MODE_RANGE);
- item->set_range_config(3, 0, 1, 1);
- item->set_text(3, "Inactive,Active");
- item->set_editable(3, true);
- item->add_button(4, get_icon("Edit", "EditorIcons"), BUTTON_PLUGIN_EDIT, false, TTR("Edit Plugin"));
-
- if (EditorNode::get_singleton()->is_addon_plugin_enabled(d2)) {
- item->set_custom_color(3, get_color("success_color", "Editor"));
- item->set_range(3, 1);
- } else {
- item->set_custom_color(3, get_color("disabled_font_color", "Editor"));
- item->set_range(3, 0);
+ if (!cf->has_section_key("plugin", "name")) {
+ WARN_PRINTS("Plugin config misses \"plugin/name\" key: " + path);
+ key_missing = true;
+ }
+ if (!cf->has_section_key("plugin", "author")) {
+ WARN_PRINTS("Plugin config misses \"plugin/author\" key: " + path);
+ key_missing = true;
+ }
+ if (!cf->has_section_key("plugin", "version")) {
+ WARN_PRINTS("Plugin config misses \"plugin/version\" key: " + path);
+ key_missing = true;
+ }
+ if (!cf->has_section_key("plugin", "description")) {
+ WARN_PRINTS("Plugin config misses \"plugin/description\" key: " + path);
+ key_missing = true;
+ }
+ if (!cf->has_section_key("plugin", "script")) {
+ WARN_PRINTS("Plugin config misses \"plugin/script\" key: " + path);
+ key_missing = true;
+ }
+
+ if (!key_missing) {
+ String d2 = plugins[i];
+ String name = cf->get_value("plugin", "name");
+ String author = cf->get_value("plugin", "author");
+ String version = cf->get_value("plugin", "version");
+ String description = cf->get_value("plugin", "description");
+ String script = cf->get_value("plugin", "script");
+
+ TreeItem *item = plugin_list->create_item(root);
+ item->set_text(0, name);
+ item->set_tooltip(0, TTR("Name:") + " " + name + "\n" + TTR("Path:") + " " + path + "\n" + TTR("Main Script:") + " " + script + "\n" + TTR("Description:") + " " + description);
+ item->set_metadata(0, d2);
+ item->set_text(1, version);
+ item->set_metadata(1, script);
+ item->set_text(2, author);
+ item->set_metadata(2, description);
+ item->set_cell_mode(3, TreeItem::CELL_MODE_RANGE);
+ item->set_range_config(3, 0, 1, 1);
+ item->set_text(3, "Inactive,Active");
+ item->set_editable(3, true);
+ item->add_button(4, get_icon("Edit", "EditorIcons"), BUTTON_PLUGIN_EDIT, false, TTR("Edit Plugin"));
+
+ if (EditorNode::get_singleton()->is_addon_plugin_enabled(d2)) {
+ item->set_custom_color(3, get_color("success_color", "Editor"));
+ item->set_range(3, 1);
+ } else {
+ item->set_custom_color(3, get_color("disabled_font_color", "Editor"));
+ item->set_range(3, 0);
+ }
}
}
}
diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp
index 20ba07c102..30fb561fbe 100644
--- a/editor/editor_properties.cpp
+++ b/editor/editor_properties.cpp
@@ -209,13 +209,7 @@ EditorPropertyTextEnum::EditorPropertyTextEnum() {
void EditorPropertyPath::_path_selected(const String &p_path) {
- String final_path = p_path;
- if (final_path.is_abs_path()) {
- String res_path = OS::get_singleton()->get_resource_dir() + "/";
- final_path = res_path.path_to_file(final_path);
- }
-
- emit_changed(get_edited_property(), final_path);
+ emit_changed(get_edited_property(), p_path);
update_property();
}
void EditorPropertyPath::_path_pressed() {
@@ -228,13 +222,6 @@ void EditorPropertyPath::_path_pressed() {
}
String full_path = get_edited_object()->get(get_edited_property());
- if (full_path.is_rel_path()) {
-
- if (!DirAccess::exists(full_path.get_base_dir())) {
- DirAccessRef da(DirAccess::create(DirAccess::ACCESS_FILESYSTEM));
- da->make_dir_recursive(full_path.get_base_dir());
- }
- }
dialog->clear_filters();
@@ -1855,10 +1842,20 @@ void EditorPropertyColor::_popup_closed() {
emit_changed(get_edited_property(), picker->get_pick_color(), "", false);
}
+void EditorPropertyColor::_picker_created() {
+ // get default color picker mode from editor settings
+ int default_color_mode = EDITOR_GET("interface/inspector/default_color_picker_mode");
+ if (default_color_mode == 1)
+ picker->get_picker()->set_hsv_mode(true);
+ else if (default_color_mode == 2)
+ picker->get_picker()->set_raw_mode(true);
+}
+
void EditorPropertyColor::_bind_methods() {
ClassDB::bind_method(D_METHOD("_color_changed"), &EditorPropertyColor::_color_changed);
ClassDB::bind_method(D_METHOD("_popup_closed"), &EditorPropertyColor::_popup_closed);
+ ClassDB::bind_method(D_METHOD("_picker_created"), &EditorPropertyColor::_picker_created);
}
void EditorPropertyColor::update_property() {
@@ -1877,6 +1874,7 @@ EditorPropertyColor::EditorPropertyColor() {
picker->set_flat(true);
picker->connect("color_changed", this, "_color_changed");
picker->connect("popup_closed", this, "_popup_closed");
+ picker->connect("picker_created", this, "_picker_created");
}
////////////// NODE PATH //////////////////////
@@ -2553,7 +2551,7 @@ void EditorPropertyResource::update_property() {
if (res.is_valid() != assign->is_toggle_mode()) {
assign->set_toggle_mode(res.is_valid());
}
-#ifdef TOOLS_ENABLED
+
if (res.is_valid() && get_edited_object()->editor_is_section_unfolded(get_edited_property())) {
if (!sub_inspector) {
@@ -2622,7 +2620,6 @@ void EditorPropertyResource::update_property() {
}
}
}
-#endif
}
preview->set_texture(Ref<Texture>());
diff --git a/editor/editor_properties.h b/editor/editor_properties.h
index 0a4a07cdc0..adf7779dc4 100644
--- a/editor/editor_properties.h
+++ b/editor/editor_properties.h
@@ -493,6 +493,7 @@ class EditorPropertyColor : public EditorProperty {
ColorPickerButton *picker;
void _color_changed(const Color &p_color);
void _popup_closed();
+ void _picker_created();
protected:
static void _bind_methods();
diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp
index d1371a04b1..ff19be8bd5 100644
--- a/editor/editor_properties_array_dict.cpp
+++ b/editor/editor_properties_array_dict.cpp
@@ -271,8 +271,6 @@ void EditorPropertyArray::update_property() {
edit->set_text(arrtype + " (size " + itos(array.call("size")) + ")");
-#ifdef TOOLS_ENABLED
-
bool unfolded = get_edited_object()->editor_is_section_unfolded(get_edited_property());
if (edit->is_pressed() != unfolded) {
edit->set_pressed(unfolded);
@@ -397,7 +395,6 @@ void EditorPropertyArray::update_property() {
vbox = NULL;
}
}
-#endif
}
void EditorPropertyArray::_remove_pressed(int p_index) {
@@ -643,8 +640,6 @@ void EditorPropertyDictionary::update_property() {
edit->set_text("Dictionary (size " + itos(dict.size()) + ")");
-#ifdef TOOLS_ENABLED
-
bool unfolded = get_edited_object()->editor_is_section_unfolded(get_edited_property());
if (edit->is_pressed() != unfolded) {
edit->set_pressed(unfolded);
@@ -959,7 +954,6 @@ void EditorPropertyDictionary::update_property() {
vbox = NULL;
}
}
-#endif
}
void EditorPropertyDictionary::_object_id_selected(const String &p_property, ObjectID p_id) {
diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp
index 327e61cea3..4a7a9fb863 100644
--- a/editor/editor_resource_preview.cpp
+++ b/editor/editor_resource_preview.cpp
@@ -46,8 +46,7 @@ bool EditorResourcePreviewGenerator::handles(const String &p_type) const {
if (get_script_instance() && get_script_instance()->has_method("handles")) {
return get_script_instance()->call("handles", p_type);
}
- ERR_EXPLAIN("EditorResourcePreviewGenerator::handles needs to be overridden");
- ERR_FAIL_V(false);
+ ERR_FAIL_V_MSG(false, "EditorResourcePreviewGenerator::handles needs to be overridden.");
}
Ref<Texture> EditorResourcePreviewGenerator::generate(const RES &p_from, const Size2 &p_size) const {
@@ -55,8 +54,7 @@ Ref<Texture> EditorResourcePreviewGenerator::generate(const RES &p_from, const S
if (get_script_instance() && get_script_instance()->has_method("generate")) {
return get_script_instance()->call("generate", p_from, p_size);
}
- ERR_EXPLAIN("EditorResourcePreviewGenerator::generate needs to be overridden");
- ERR_FAIL_V(Ref<Texture>());
+ ERR_FAIL_V_MSG(Ref<Texture>(), "EditorResourcePreviewGenerator::generate needs to be overridden.");
}
Ref<Texture> EditorResourcePreviewGenerator::generate_from_path(const String &p_path, const Size2 &p_size) const {
diff --git a/editor/editor_sectioned_inspector.cpp b/editor/editor_sectioned_inspector.cpp
index ad6b280b6d..abff8190af 100644
--- a/editor/editor_sectioned_inspector.cpp
+++ b/editor/editor_sectioned_inspector.cpp
@@ -316,7 +316,7 @@ SectionedInspector::SectionedInspector() :
add_constant_override("autohide", 1); // Fixes the dragger always showing up
VBoxContainer *left_vb = memnew(VBoxContainer);
- left_vb->set_custom_minimum_size(Size2(170, 0) * EDSCALE);
+ left_vb->set_custom_minimum_size(Size2(190, 0) * EDSCALE);
add_child(left_vb);
sections->set_v_size_flags(SIZE_EXPAND_FILL);
diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp
index e3f2a888d6..479fe5f0cb 100644
--- a/editor/editor_settings.cpp
+++ b/editor/editor_settings.cpp
@@ -324,8 +324,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("interface/editor/code_font_size", 14);
hints["interface/editor/code_font_size"] = PropertyInfo(Variant::INT, "interface/editor/code_font_size", PROPERTY_HINT_RANGE, "8,48,1", PROPERTY_USAGE_DEFAULT);
_initial_set("interface/editor/font_antialiased", true);
- _initial_set("interface/editor/font_hinting", 2);
- hints["interface/editor/font_hinting"] = PropertyInfo(Variant::INT, "interface/editor/font_hinting", PROPERTY_HINT_ENUM, "None,Light,Normal", PROPERTY_USAGE_DEFAULT);
+ _initial_set("interface/editor/font_hinting", 0);
+ hints["interface/editor/font_hinting"] = PropertyInfo(Variant::INT, "interface/editor/font_hinting", PROPERTY_HINT_ENUM, "Auto,None,Light,Normal", PROPERTY_USAGE_DEFAULT);
_initial_set("interface/editor/main_font", "");
hints["interface/editor/main_font"] = PropertyInfo(Variant::STRING, "interface/editor/main_font", PROPERTY_HINT_GLOBAL_FILE, "*.ttf,*.otf", PROPERTY_USAGE_DEFAULT);
_initial_set("interface/editor/main_font_bold", "");
@@ -334,9 +334,9 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
hints["interface/editor/code_font"] = PropertyInfo(Variant::STRING, "interface/editor/code_font", PROPERTY_HINT_GLOBAL_FILE, "*.ttf,*.otf", PROPERTY_USAGE_DEFAULT);
_initial_set("interface/editor/dim_editor_on_dialog_popup", true);
_initial_set("interface/editor/low_processor_mode_sleep_usec", 6900); // ~144 FPS
- hints["interface/editor/low_processor_mode_sleep_usec"] = PropertyInfo(Variant::REAL, "interface/editor/low_processor_mode_sleep_usec", PROPERTY_HINT_RANGE, "1,100000,1", PROPERTY_USAGE_DEFAULT);
+ hints["interface/editor/low_processor_mode_sleep_usec"] = PropertyInfo(Variant::REAL, "interface/editor/low_processor_mode_sleep_usec", PROPERTY_HINT_RANGE, "1,100000,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/editor/unfocused_low_processor_mode_sleep_usec", 50000); // 20 FPS
- hints["interface/editor/unfocused_low_processor_mode_sleep_usec"] = PropertyInfo(Variant::REAL, "interface/editor/unfocused_low_processor_mode_sleep_usec", PROPERTY_HINT_RANGE, "1,100000,1", PROPERTY_USAGE_DEFAULT);
+ hints["interface/editor/unfocused_low_processor_mode_sleep_usec"] = PropertyInfo(Variant::REAL, "interface/editor/unfocused_low_processor_mode_sleep_usec", PROPERTY_HINT_RANGE, "1,100000,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/editor/separate_distraction_mode", false);
_initial_set("interface/editor/automatically_open_screenshots", true);
_initial_set("interface/editor/hide_console_window", false);
@@ -440,22 +440,27 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("text_editor/indent/draw_tabs", true);
_initial_set("text_editor/indent/draw_spaces", false);
- // Line numbers
- _initial_set("text_editor/line_numbers/show_line_numbers", true);
- _initial_set("text_editor/line_numbers/line_numbers_zero_padded", false);
- _initial_set("text_editor/line_numbers/show_bookmark_gutter", true);
- _initial_set("text_editor/line_numbers/show_breakpoint_gutter", true);
- _initial_set("text_editor/line_numbers/show_info_gutter", true);
- _initial_set("text_editor/line_numbers/code_folding", true);
- _initial_set("text_editor/line_numbers/word_wrap", false);
- _initial_set("text_editor/line_numbers/show_line_length_guideline", false);
- _initial_set("text_editor/line_numbers/line_length_guideline_column", 80);
- hints["text_editor/line_numbers/line_length_guideline_column"] = PropertyInfo(Variant::INT, "text_editor/line_numbers/line_length_guideline_column", PROPERTY_HINT_RANGE, "20, 160, 1");
-
- // Open scripts
- _initial_set("text_editor/open_scripts/smooth_scrolling", true);
- _initial_set("text_editor/open_scripts/v_scroll_speed", 80);
- _initial_set("text_editor/open_scripts/show_members_overview", true);
+ // Navigation
+ _initial_set("text_editor/navigation/smooth_scrolling", true);
+ _initial_set("text_editor/navigation/v_scroll_speed", 80);
+ _initial_set("text_editor/navigation/show_minimap", true);
+ _initial_set("text_editor/navigation/minimap_width", 80);
+ hints["text_editor/navigation/minimap_width"] = PropertyInfo(Variant::INT, "text_editor/navigation/minimap_width", PROPERTY_HINT_RANGE, "50,250,1");
+
+ // Appearance
+ _initial_set("text_editor/appearance/show_line_numbers", true);
+ _initial_set("text_editor/appearance/line_numbers_zero_padded", false);
+ _initial_set("text_editor/appearance/show_bookmark_gutter", true);
+ _initial_set("text_editor/appearance/show_breakpoint_gutter", true);
+ _initial_set("text_editor/appearance/show_info_gutter", true);
+ _initial_set("text_editor/appearance/code_folding", true);
+ _initial_set("text_editor/appearance/word_wrap", false);
+ _initial_set("text_editor/appearance/show_line_length_guideline", false);
+ _initial_set("text_editor/appearance/line_length_guideline_column", 80);
+ hints["text_editor/appearance/line_length_guideline_column"] = PropertyInfo(Variant::INT, "text_editor/appearance/line_length_guideline_column", PROPERTY_HINT_RANGE, "20, 160, 1");
+
+ // Script list
+ _initial_set("text_editor/script_list/show_members_overview", true);
// Files
_initial_set("text_editor/files/trim_trailing_whitespace_on_save", false);
@@ -561,6 +566,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
// 2D
_initial_set("editors/2d/grid_color", Color(1.0, 1.0, 1.0, 0.07));
_initial_set("editors/2d/guides_color", Color(0.6, 0.0, 0.8));
+ _initial_set("editors/2d/smart_snapping_line_color", Color(0.9, 0.1, 0.1));
_initial_set("editors/2d/bone_width", 5);
_initial_set("editors/2d/bone_color1", Color(1.0, 1.0, 1.0, 0.9));
_initial_set("editors/2d/bone_color2", Color(0.6, 0.6, 0.6, 0.9));
@@ -608,6 +614,18 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("run/output/always_open_output_on_play", true);
_initial_set("run/output/always_close_output_on_stop", false);
+ /* Network */
+
+ // Debug
+ _initial_set("network/debug/remote_host", "127.0.0.1"); // Hints provided in setup_network
+
+ _initial_set("network/debug/remote_port", 6007);
+ hints["network/debug/remote_port"] = PropertyInfo(Variant::INT, "network/debug/remote_port", PROPERTY_HINT_RANGE, "1,65535,1");
+
+ // SSL
+ _initial_set("network/ssl/editor_ssl_certificates", _SYSTEM_CERTS_PATH);
+ hints["network/ssl/editor_ssl_certificates"] = PropertyInfo(Variant::STRING, "network/ssl/editor_ssl_certificates", PROPERTY_HINT_GLOBAL_FILE, "*.crt,*.pem");
+
/* Extra config */
_initial_set("project_manager/sorting_order", 0);
@@ -993,11 +1011,11 @@ void EditorSettings::setup_network() {
List<IP_Address> local_ip;
IP::get_singleton()->get_local_addresses(&local_ip);
- String lip = "127.0.0.1";
String hint;
String current = has_setting("network/debug/remote_host") ? get("network/debug/remote_host") : "";
- int port = has_setting("network/debug/remote_port") ? (int)get("network/debug/remote_port") : 6007;
+ String selected = "127.0.0.1";
+ // Check that current remote_host is a valid interface address and populate hints.
for (List<IP_Address>::Element *E = local_ip.front(); E; E = E->next()) {
String ip = E->get();
@@ -1008,22 +1026,18 @@ void EditorSettings::setup_network() {
// Same goes for IPv4 link-local (APIPA) addresses.
if (ip.begins_with("169.254.")) // 169.254.0.0/16
continue;
+ // Select current IP (found)
if (ip == current)
- lip = current; //so it saves
+ selected = ip;
if (hint != "")
hint += ",";
hint += ip;
}
- _initial_set("network/debug/remote_host", lip);
+ // Add hints with valid IP addresses to remote_host property.
add_property_hint(PropertyInfo(Variant::STRING, "network/debug/remote_host", PROPERTY_HINT_ENUM, hint));
-
- _initial_set("network/debug/remote_port", port);
- add_property_hint(PropertyInfo(Variant::INT, "network/debug/remote_port", PROPERTY_HINT_RANGE, "1,65535,1"));
-
- // Editor SSL certificates override
- _initial_set("network/ssl/editor_ssl_certificates", _SYSTEM_CERTS_PATH);
- add_property_hint(PropertyInfo(Variant::STRING, "network/ssl/editor_ssl_certificates", PROPERTY_HINT_GLOBAL_FILE, "*.crt,*.pem"));
+ // Fix potentially invalid remote_host due to network change.
+ set("network/debug/remote_host", selected);
}
void EditorSettings::save() {
@@ -1197,6 +1211,11 @@ String EditorSettings::get_script_templates_dir() const {
return get_settings_dir().plus_file("script_templates");
}
+String EditorSettings::get_project_script_templates_dir() const {
+
+ return ProjectSettings::get_singleton()->get("editor/script_templates_search_path");
+}
+
// Cache directory
String EditorSettings::get_cache_dir() const {
@@ -1216,7 +1235,7 @@ void EditorSettings::set_project_metadata(const String &p_section, const String
String path = get_project_settings_dir().plus_file("project_metadata.cfg");
Error err;
err = cf->load(path);
- ERR_FAIL_COND(err != OK);
+ ERR_FAIL_COND(err != OK && err != ERR_FILE_NOT_FOUND);
cf->set_value(p_section, p_key, p_data);
err = cf->save(path);
ERR_FAIL_COND(err != OK);
@@ -1417,10 +1436,14 @@ bool EditorSettings::is_default_text_editor_theme() {
return _is_default_text_editor_theme(p_file.get_file().to_lower());
}
-Vector<String> EditorSettings::get_script_templates(const String &p_extension) {
+Vector<String> EditorSettings::get_script_templates(const String &p_extension, const String &p_custom_path) {
Vector<String> templates;
- DirAccess *d = DirAccess::open(get_script_templates_dir());
+ String template_dir = get_script_templates_dir();
+ if (!p_custom_path.empty()) {
+ template_dir = p_custom_path;
+ }
+ DirAccess *d = DirAccess::open(template_dir);
if (d) {
d->list_dir_begin();
String file = d->get_next();
@@ -1451,10 +1474,7 @@ void EditorSettings::add_shortcut(const String &p_name, Ref<ShortCut> &p_shortcu
bool EditorSettings::is_shortcut(const String &p_name, const Ref<InputEvent> &p_event) const {
const Map<String, Ref<ShortCut> >::Element *E = shortcuts.find(p_name);
- if (!E) {
- ERR_EXPLAIN("Unknown Shortcut: " + p_name);
- ERR_FAIL_V(false);
- }
+ ERR_FAIL_COND_V_MSG(!E, false, "Unknown Shortcut: " + p_name + ".");
return E->get()->is_shortcut(p_event);
}
@@ -1483,10 +1503,8 @@ Ref<ShortCut> ED_GET_SHORTCUT(const String &p_path) {
}
Ref<ShortCut> sc = EditorSettings::get_singleton()->get_shortcut(p_path);
- if (!sc.is_valid()) {
- ERR_EXPLAIN("Used ED_GET_SHORTCUT with invalid shortcut: " + p_path);
- ERR_FAIL_COND_V(!sc.is_valid(), sc);
- }
+
+ ERR_FAIL_COND_V_MSG(!sc.is_valid(), sc, "Used ED_GET_SHORTCUT with invalid shortcut: " + p_path + ".");
return sc;
}
diff --git a/editor/editor_settings.h b/editor/editor_settings.h
index 890850629e..0738185e95 100644
--- a/editor/editor_settings.h
+++ b/editor/editor_settings.h
@@ -166,6 +166,7 @@ public:
String get_project_settings_dir() const;
String get_text_editor_themes_dir() const;
String get_script_templates_dir() const;
+ String get_project_script_templates_dir() const;
String get_cache_dir() const;
String get_feature_profiles_dir() const;
@@ -187,7 +188,7 @@ public:
bool save_text_editor_theme_as(String p_file);
bool is_default_text_editor_theme();
- Vector<String> get_script_templates(const String &p_extension);
+ Vector<String> get_script_templates(const String &p_extension, const String &p_custom_path = String());
String get_editor_layouts_config() const;
void add_shortcut(const String &p_name, Ref<ShortCut> &p_shortcut);
diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp
index 743149aba9..35fe366526 100644
--- a/editor/editor_spin_slider.cpp
+++ b/editor/editor_spin_slider.cpp
@@ -47,42 +47,48 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
return;
Ref<InputEventMouseButton> mb = p_event;
- if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) {
+ if (mb.is_valid()) {
- if (mb->is_pressed()) {
+ if (mb->get_button_index() == BUTTON_LEFT) {
+ if (mb->is_pressed()) {
- if (updown_offset != -1 && mb->get_position().x > updown_offset) {
- //there is an updown, so use it.
- if (mb->get_position().y < get_size().height / 2) {
- set_value(get_value() + get_step());
+ if (updown_offset != -1 && mb->get_position().x > updown_offset) {
+ //there is an updown, so use it.
+ if (mb->get_position().y < get_size().height / 2) {
+ set_value(get_value() + get_step());
+ } else {
+ set_value(get_value() - get_step());
+ }
+ return;
} else {
- set_value(get_value() - get_step());
+
+ grabbing_spinner_attempt = true;
+ grabbing_spinner_dist_cache = 0;
+ pre_grab_value = get_value();
+ grabbing_spinner = false;
+ grabbing_spinner_mouse_pos = Input::get_singleton()->get_mouse_position();
}
- return;
} else {
- grabbing_spinner_attempt = true;
- grabbing_spinner_dist_cache = 0;
- pre_grab_value = get_value();
- grabbing_spinner = false;
- grabbing_spinner_mouse_pos = Input::get_singleton()->get_mouse_position();
- }
- } else {
+ if (grabbing_spinner_attempt) {
- if (grabbing_spinner_attempt) {
+ if (grabbing_spinner) {
- if (grabbing_spinner) {
+ Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
+ Input::get_singleton()->warp_mouse_position(grabbing_spinner_mouse_pos);
+ update();
+ } else {
+ _focus_entered();
+ }
- Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
- Input::get_singleton()->warp_mouse_position(grabbing_spinner_mouse_pos);
- update();
- } else {
- _focus_entered();
+ grabbing_spinner = false;
+ grabbing_spinner_attempt = false;
}
-
- grabbing_spinner = false;
- grabbing_spinner_attempt = false;
}
+ } else if (mb->get_button_index() == BUTTON_WHEEL_UP || mb->get_button_index() == BUTTON_WHEEL_DOWN) {
+
+ if (grabber->is_visible())
+ call_deferred("update");
}
}
diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp
index 97af0d08ea..e29e44caa2 100644
--- a/editor/editor_themes.cpp
+++ b/editor/editor_themes.cpp
@@ -108,16 +108,17 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme =
#ifdef SVG_ENABLED
Dictionary dark_icon_color_dictionary;
if (!p_dark_theme) {
- //convert color: FROM TO
- ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#e0e0e0", "#4f4f4f"); // common icon color
- ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#ffffff", "#000000"); // white
- ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#b4b4b4", "#000000"); // script darker color
+ // convert color: FROM TO
+ ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#e0e0e0", "#5a5a5a"); // common icon color
+ ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#ffffff", "#414141"); // white
+ ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#b4b4b4", "#363636"); // script darker color
+ ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#f9f9f9", "#606060"); // scrollbar grabber highlight color
ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#cea4f1", "#a85de9"); // animation
ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#fc9c9c", "#cd3838"); // spatial
ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#a5b7f3", "#3d64dd"); // 2d
ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#708cea", "#1a3eac"); // 2d dark
- ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#a5efac", "#2aa235"); // control
+ ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#a5efac", "#2fa139"); // control
// rainbow
ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#ff7070", "#ff2929"); // red
@@ -145,9 +146,14 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme =
ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#ea9568", "#bd5e2c"); // 3D Transform track
ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#66f376", "#16a827"); // Call Method track
ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#5792f6", "#236be6"); // Bezier Curve track
- ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#eae668", "#aea923"); // Audio Playback track
+ ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#eae668", "#9f9722"); // Audio Playback track
ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#b76ef0", "#9853ce"); // Animation Playback track
+ // TileSet editor icons
+ ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#fce844", "#aa8d24"); // New Single Tile
+ ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#4490fc", "#0350bd"); // New Autotile
+ ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#c9cfd4", "#828f9b"); // New Atlas
+
ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#69ecbd", "#25e3a0"); // VS variant
ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#8da6f0", "#6d8eeb"); // VS bool
ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#7dc6ef", "#4fb2e9"); // VS int
@@ -339,6 +345,13 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
const Color color_disabled = mono_color.inverted().linear_interpolate(base_color, 0.7);
const Color color_disabled_bg = mono_color.inverted().linear_interpolate(base_color, 0.9);
+ Color icon_color_hover = Color(1, 1, 1) * (dark_theme ? 1.15 : 1.45);
+ icon_color_hover.a = 1.0;
+ // Make the pressed icon color overbright because icons are not completely white on a dark theme.
+ // On a light theme, icons are dark, so we need to modulate them with an even brighter color.
+ Color icon_color_pressed = accent_color * (dark_theme ? 1.15 : 3.5);
+ icon_color_pressed.a = 1.0;
+
const Color separator_color = Color(mono_color.r, mono_color.g, mono_color.b, 0.1);
const Color highlight_color = Color(mono_color.r, mono_color.g, mono_color.b, 0.2);
@@ -351,6 +364,8 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_color("dark_color_3", "Editor", dark_color_3);
theme->set_color("contrast_color_1", "Editor", contrast_color_1);
theme->set_color("contrast_color_2", "Editor", contrast_color_2);
+ theme->set_color("box_selection_fill_color", "Editor", accent_color * Color(1, 1, 1, 0.3));
+ theme->set_color("box_selection_stroke_color", "Editor", accent_color * Color(1, 1, 1, 0.8));
theme->set_color("font_color", "Editor", font_color);
theme->set_color("highlighted_font_color", "Editor", font_color_hl);
@@ -563,9 +578,8 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_color("font_color_hover", "Button", font_color_hl);
theme->set_color("font_color_pressed", "Button", accent_color);
theme->set_color("font_color_disabled", "Button", font_color_disabled);
- theme->set_color("icon_color_hover", "Button", font_color_hl);
- // make icon color value bigger because icon image is not complete white
- theme->set_color("icon_color_pressed", "Button", Color(accent_color.r * 1.15, accent_color.g * 1.15, accent_color.b * 1.15, accent_color.a));
+ theme->set_color("icon_color_hover", "Button", icon_color_hover);
+ theme->set_color("icon_color_pressed", "Button", icon_color_pressed);
// OptionButton
theme->set_stylebox("normal", "OptionButton", style_widget);
@@ -578,7 +592,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_color("font_color_hover", "OptionButton", font_color_hl);
theme->set_color("font_color_pressed", "OptionButton", accent_color);
theme->set_color("font_color_disabled", "OptionButton", font_color_disabled);
- theme->set_color("icon_color_hover", "OptionButton", font_color_hl);
+ theme->set_color("icon_color_hover", "OptionButton", icon_color_hover);
theme->set_icon("arrow", "OptionButton", theme->get_icon("GuiOptionArrow", "EditorIcons"));
theme->set_constant("arrow_margin", "OptionButton", default_margin_size * EDSCALE);
theme->set_constant("modulate_arrow", "OptionButton", true);
@@ -599,7 +613,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_color("font_color_hover", "CheckButton", font_color_hl);
theme->set_color("font_color_pressed", "CheckButton", accent_color);
theme->set_color("font_color_disabled", "CheckButton", font_color_disabled);
- theme->set_color("icon_color_hover", "CheckButton", font_color_hl);
+ theme->set_color("icon_color_hover", "CheckButton", icon_color_hover);
theme->set_constant("hseparation", "CheckButton", 4 * EDSCALE);
theme->set_constant("check_vadjust", "CheckButton", 0 * EDSCALE);
@@ -624,7 +638,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_color("font_color_hover", "CheckBox", font_color_hl);
theme->set_color("font_color_pressed", "CheckBox", accent_color);
theme->set_color("font_color_disabled", "CheckBox", font_color_disabled);
- theme->set_color("icon_color_hover", "CheckBox", font_color_hl);
+ theme->set_color("icon_color_hover", "CheckBox", icon_color_hover);
theme->set_constant("hseparation", "CheckBox", 4 * EDSCALE);
theme->set_constant("check_vadjust", "CheckBox", 0 * EDSCALE);
@@ -981,8 +995,13 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
// GraphEdit
theme->set_stylebox("bg", "GraphEdit", style_tree_bg);
- theme->set_color("grid_major", "GraphEdit", Color(1.0, 1.0, 1.0, 0.15));
- theme->set_color("grid_minor", "GraphEdit", Color(1.0, 1.0, 1.0, 0.07));
+ if (dark_theme) {
+ theme->set_color("grid_major", "GraphEdit", Color(1.0, 1.0, 1.0, 0.15));
+ theme->set_color("grid_minor", "GraphEdit", Color(1.0, 1.0, 1.0, 0.07));
+ } else {
+ theme->set_color("grid_major", "GraphEdit", Color(0.0, 0.0, 0.0, 0.15));
+ theme->set_color("grid_minor", "GraphEdit", Color(0.0, 0.0, 0.0, 0.07));
+ }
theme->set_color("activity", "GraphEdit", accent_color);
theme->set_icon("minus", "GraphEdit", theme->get_icon("ZoomLess", "EditorIcons"));
theme->set_icon("more", "GraphEdit", theme->get_icon("ZoomMore", "EditorIcons"));
@@ -1047,6 +1066,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_color("title_color", "GraphNode", default_node_color);
default_node_color.a = 0.7;
theme->set_color("close_color", "GraphNode", default_node_color);
+ theme->set_color("resizer_color", "GraphNode", default_node_color);
theme->set_constant("port_offset", "GraphNode", 14 * EDSCALE);
theme->set_constant("title_h_offset", "GraphNode", -16 * EDSCALE);
@@ -1064,6 +1084,9 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
// FileDialog
theme->set_icon("folder", "FileDialog", theme->get_icon("Folder", "EditorIcons"));
+ // Use a different color for folder icons to make them easier to distinguish from files.
+ // On a light theme, the icon will be dark, so we need to lighten it before blending it with the accent color.
+ theme->set_color("folder_icon_modulate", "FileDialog", (dark_theme ? Color(1, 1, 1) : Color(4.25, 4.25, 4.25)).linear_interpolate(accent_color, 0.7));
theme->set_color("files_disabled", "FileDialog", font_color_disabled);
// color picker
diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp
index 8a5f77c25f..536cfaa1dd 100644
--- a/editor/export_template_manager.cpp
+++ b/editor/export_template_manager.cpp
@@ -69,6 +69,9 @@ void ExportTemplateManager::_update_template_list() {
memdelete(d);
String current_version = VERSION_FULL_CONFIG;
+ // Downloadable export templates are only available for stable, alpha, beta and RC versions.
+ // Therefore, don't display download-related features when using a development version
+ const bool downloads_available = String(VERSION_STATUS) != String("dev");
Label *current = memnew(Label);
current->set_h_size_flags(SIZE_EXPAND_FILL);
@@ -76,10 +79,14 @@ void ExportTemplateManager::_update_template_list() {
if (templates.has(current_version)) {
current->add_color_override("font_color", get_color("success_color", "Editor"));
- Button *redownload = memnew(Button);
- redownload->set_text(TTR("Re-Download"));
- current_hb->add_child(redownload);
- redownload->connect("pressed", this, "_download_template", varray(current_version));
+
+ // Only display a redownload button if it can be downloaded in the first place
+ if (downloads_available) {
+ Button *redownload = memnew(Button);
+ redownload->set_text(TTR("Redownload"));
+ current_hb->add_child(redownload);
+ redownload->connect("pressed", this, "_download_template", varray(current_version));
+ }
Button *uninstall = memnew(Button);
uninstall->set_text(TTR("Uninstall"));
@@ -91,6 +98,12 @@ void ExportTemplateManager::_update_template_list() {
current->add_color_override("font_color", get_color("error_color", "Editor"));
Button *redownload = memnew(Button);
redownload->set_text(TTR("Download"));
+
+ if (!downloads_available) {
+ redownload->set_disabled(true);
+ redownload->set_tooltip(TTR("Official export templates aren't available for development builds."));
+ }
+
redownload->connect("pressed", this, "_download_template", varray(current_version));
current_hb->add_child(redownload);
current->set_text(current_version + " " + TTR("(Missing)"));
@@ -308,8 +321,7 @@ bool ExportTemplateManager::_install_from_file(const String &p_file, bool p_use_
if (!f) {
ret = unzGoToNextFile(pkg);
fc++;
- ERR_EXPLAIN("Can't open file from path: " + String(to_write));
- ERR_CONTINUE(true);
+ ERR_CONTINUE_MSG(true, "Can't open file from path: " + String(to_write) + ".");
}
f->store_buffer(data.ptr(), data.size());
@@ -530,7 +542,6 @@ void ExportTemplateManager::_notification(int p_what) {
template_list_state->set_text(status);
if (errored) {
set_process(false);
- ;
}
}
@@ -543,25 +554,33 @@ void ExportTemplateManager::_notification(int p_what) {
bool ExportTemplateManager::can_install_android_template() {
- return FileAccess::exists(EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG).plus_file("android_source.zip"));
+ const String templates_dir = EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG);
+ return FileAccess::exists(templates_dir.plus_file("android_source.zip")) &&
+ FileAccess::exists(templates_dir.plus_file("android_release.apk")) &&
+ FileAccess::exists(templates_dir.plus_file("android_debug.apk"));
}
Error ExportTemplateManager::install_android_template() {
+ // To support custom Android builds, we install various things to the project's res://android folder.
+ // First is the Java source code and buildsystem from android_source.zip.
+ // Then we extract the Godot Android libraries from pre-build android_release.apk
+ // and android_debug.apk, to place them in the libs folder.
+
DirAccessRef da = DirAccess::open("res://");
ERR_FAIL_COND_V(!da, ERR_CANT_CREATE);
- //make android dir (if it does not exist)
+ // Make res://android dir (if it does not exist).
da->make_dir("android");
{
- //add an empty .gdignore file to avoid scan
+ // Add an empty .gdignore file to avoid scan.
FileAccessRef f = FileAccess::open("res://android/.gdignore", FileAccess::WRITE);
ERR_FAIL_COND_V(!f, ERR_CANT_CREATE);
f->store_line("");
f->close();
}
{
- //add version, to ensure building won't work if template and Godot version don't match
+ // Add version, to ensure building won't work if template and Godot version don't match.
FileAccessRef f = FileAccess::open("res://android/.build_version", FileAccess::WRITE);
ERR_FAIL_COND_V(!f, ERR_CANT_CREATE);
f->store_line(VERSION_FULL_CONFIG);
@@ -571,48 +590,46 @@ Error ExportTemplateManager::install_android_template() {
Error err = da->make_dir_recursive("android/build");
ERR_FAIL_COND_V(err != OK, err);
- String source_zip = EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG).plus_file("android_source.zip");
+ // Uncompress source template.
+
+ const String &templates_path = EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG);
+ const String &source_zip = templates_path.plus_file("android_source.zip");
ERR_FAIL_COND_V(!FileAccess::exists(source_zip), ERR_CANT_OPEN);
FileAccess *src_f = NULL;
zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
unzFile pkg = unzOpen2(source_zip.utf8().get_data(), &io);
- ERR_EXPLAIN("Android sources not in zip format");
- ERR_FAIL_COND_V(!pkg, ERR_CANT_OPEN);
+ ERR_FAIL_COND_V_MSG(!pkg, ERR_CANT_OPEN, "Android sources not in ZIP format.");
int ret = unzGoToFirstFile(pkg);
-
int total_files = 0;
- //count files
+ // Count files to unzip.
while (ret == UNZ_OK) {
total_files++;
ret = unzGoToNextFile(pkg);
}
-
ret = unzGoToFirstFile(pkg);
- //decompress files
- ProgressDialog::get_singleton()->add_task("uncompress", TTR("Uncompressing Android Build Sources"), total_files);
- Set<String> dirs_tested;
+ ProgressDialog::get_singleton()->add_task("uncompress_src", TTR("Uncompressing Android Build Sources"), total_files);
+ Set<String> dirs_tested;
int idx = 0;
while (ret == UNZ_OK) {
- //get filename
+ // Get file path.
unz_file_info info;
- char fname[16384];
- ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, NULL, 0, NULL, 0);
+ char fpath[16384];
+ ret = unzGetCurrentFileInfo(pkg, &info, fpath, 16384, NULL, 0, NULL, 0);
- String name = fname;
+ String path = fpath;
+ String base_dir = path.get_base_dir();
- String base_dir = name.get_base_dir();
-
- if (!name.ends_with("/")) {
+ if (!path.ends_with("/")) {
Vector<uint8_t> data;
data.resize(info.uncompressed_size);
- //read
+ // Read.
unzOpenCurrentFile(pkg);
unzReadCurrentFile(pkg, data.ptrw(), data.size());
unzCloseCurrentFile(pkg);
@@ -622,7 +639,7 @@ Error ExportTemplateManager::install_android_template() {
dirs_tested.insert(base_dir);
}
- String to_write = String("res://android/build").plus_file(name);
+ String to_write = String("res://android/build").plus_file(path);
FileAccess *f = FileAccess::open(to_write, FileAccess::WRITE);
if (f) {
f->store_buffer(data.ptr(), data.size());
@@ -635,13 +652,96 @@ Error ExportTemplateManager::install_android_template() {
}
}
- ProgressDialog::get_singleton()->task_step("uncompress", name, idx);
+ ProgressDialog::get_singleton()->task_step("uncompress_src", path, idx);
+
+ idx++;
+ ret = unzGoToNextFile(pkg);
+ }
+
+ ProgressDialog::get_singleton()->end_task("uncompress_src");
+ unzClose(pkg);
+
+ // Extract libs from pre-built APKs.
+ err = _extract_libs_from_apk("release");
+ ERR_FAIL_COND_V_MSG(err != OK, err, "Can't extract Android libs from android_release.apk.");
+ err = _extract_libs_from_apk("debug");
+ ERR_FAIL_COND_V_MSG(err != OK, err, "Can't extract Android libs from android_debug.apk.");
+
+ return OK;
+}
+
+Error ExportTemplateManager::_extract_libs_from_apk(const String &p_target_name) {
+
+ const String &templates_path = EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG);
+ const String &apk_file = templates_path.plus_file("android_" + p_target_name + ".apk");
+ ERR_FAIL_COND_V(!FileAccess::exists(apk_file), ERR_CANT_OPEN);
+
+ FileAccess *src_f = NULL;
+ zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
+
+ unzFile pkg = unzOpen2(apk_file.utf8().get_data(), &io);
+ ERR_FAIL_COND_V_MSG(!pkg, ERR_CANT_OPEN, "Android APK can't be extracted.");
+
+ DirAccessRef da = DirAccess::open("res://");
+ ERR_FAIL_COND_V(!da, ERR_CANT_CREATE);
+
+ // 8 steps because 4 arches, 2 libs per arch.
+ ProgressDialog::get_singleton()->add_task("extract_libs_from_apk", TTR("Extracting Android Libraries From APKs"), 8);
+
+ int ret = unzGoToFirstFile(pkg);
+ Set<String> dirs_tested;
+ int idx = 0;
+ while (ret == UNZ_OK) {
+ // Get file path.
+ unz_file_info info;
+ char fpath[16384];
+ ret = unzGetCurrentFileInfo(pkg, &info, fpath, 16384, NULL, 0, NULL, 0);
+
+ String path = fpath;
+ String base_dir = path.get_base_dir();
+ String file = path.get_file();
+
+ if (!base_dir.begins_with("lib") || path.ends_with("/")) {
+ ret = unzGoToNextFile(pkg);
+ continue;
+ }
+
+ Vector<uint8_t> data;
+ data.resize(info.uncompressed_size);
+
+ // Read.
+ unzOpenCurrentFile(pkg);
+ unzReadCurrentFile(pkg, data.ptrw(), data.size());
+ unzCloseCurrentFile(pkg);
+
+ // We have a "lib" folder in the APK, but it should be "libs/{release,debug}" in the source dir.
+ String target_base_dir = base_dir.replace_first("lib", String("libs").plus_file(p_target_name));
+
+ if (!dirs_tested.has(base_dir)) {
+ da->make_dir_recursive(String("android/build").plus_file(target_base_dir));
+ dirs_tested.insert(base_dir);
+ }
+
+ String to_write = String("res://android/build").plus_file(target_base_dir.plus_file(path.get_file()));
+ FileAccess *f = FileAccess::open(to_write, FileAccess::WRITE);
+ if (f) {
+ f->store_buffer(data.ptr(), data.size());
+ memdelete(f);
+#ifndef WINDOWS_ENABLED
+ // We can't retrieve Unix permissions from the APK it seems, so simply set 0755 as should be.
+ FileAccess::set_unix_permissions(to_write, 0755);
+#endif
+ } else {
+ ERR_PRINTS("Can't uncompress file: " + to_write);
+ }
+
+ ProgressDialog::get_singleton()->task_step("extract_libs_from_apk", path, idx);
idx++;
ret = unzGoToNextFile(pkg);
}
- ProgressDialog::get_singleton()->end_task("uncompress");
+ ProgressDialog::get_singleton()->end_task("extract_libs_from_apk");
unzClose(pkg);
return OK;
diff --git a/editor/export_template_manager.h b/editor/export_template_manager.h
index ad3ab507b3..ecb8e85b21 100644
--- a/editor/export_template_manager.h
+++ b/editor/export_template_manager.h
@@ -72,6 +72,8 @@ class ExportTemplateManager : public ConfirmationDialog {
virtual void ok_pressed();
bool _install_from_file(const String &p_file, bool p_use_progress = true);
+ Error _extract_libs_from_apk(const String &p_target_name);
+
void _http_download_mirror_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data);
void _http_download_templates_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data);
diff --git a/editor/file_type_cache.cpp b/editor/file_type_cache.cpp
index 1bcbc45d3b..746d38f2b5 100644
--- a/editor/file_type_cache.cpp
+++ b/editor/file_type_cache.cpp
@@ -83,11 +83,8 @@ void FileTypeCache::save() {
GLOBAL_LOCK_FUNCTION
String project = ProjectSettings::get_singleton()->get_resource_path();
FileAccess *f = FileAccess::open(project + "/file_type_cache.cch", FileAccess::WRITE);
- if (!f) {
- ERR_EXPLAIN(TTR("Can't open file_type_cache.cch for writing, not saving file type cache!"));
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(!f, "Can't open file_type_cache.cch for writing, not saving file type cache!");
const String *K = NULL;
diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp
index 8e332ad20e..a729befe8e 100644
--- a/editor/filesystem_dock.cpp
+++ b/editor/filesystem_dock.cpp
@@ -39,6 +39,7 @@
#include "editor_node.h"
#include "editor_settings.h"
#include "scene/main/viewport.h"
+#include "scene/resources/packed_scene.h"
Ref<Texture> FileSystemDock::_get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx) {
Ref<Texture> file_icon;
@@ -52,10 +53,9 @@ Ref<Texture> FileSystemDock::_get_tree_item_icon(EditorFileSystemDirectory *p_di
}
bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites) {
-
bool parent_should_expand = false;
- // Create a tree item for the subdirectory
+ // Create a tree item for the subdirectory.
TreeItem *subdirectory_item = tree->create_item(p_parent);
String dname = p_dir->get_name();
if (dname == "")
@@ -63,6 +63,7 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
subdirectory_item->set_text(0, dname);
subdirectory_item->set_icon(0, get_icon("Folder", "EditorIcons"));
+ subdirectory_item->set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog"));
subdirectory_item->set_selectable(0, true);
String lpath = p_dir->get_path();
subdirectory_item->set_metadata(0, lpath);
@@ -79,28 +80,28 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
parent_should_expand = true;
}
- // Create items for all subdirectories
+ // Create items for all subdirectories.
for (int i = 0; i < p_dir->get_subdir_count(); i++)
parent_should_expand = (_create_tree(subdirectory_item, p_dir->get_subdir(i), uncollapsed_paths, p_select_in_favorites) || parent_should_expand);
- // Create all items for the files in the subdirectory
+ // Create all items for the files in the subdirectory.
if (display_mode == DISPLAY_MODE_TREE_ONLY) {
for (int i = 0; i < p_dir->get_file_count(); i++) {
String file_type = p_dir->get_file_type(i);
if (_is_file_type_disabled_by_feature_profile(file_type)) {
- //if type is disabled, file won't be displayed.
+ // If type is disabled, file won't be displayed.
continue;
}
String file_name = p_dir->get_file(i);
if (searched_string.length() > 0) {
if (file_name.to_lower().find(searched_string) < 0) {
- // The searched string is not in the file name, we skip it
+ // The searched string is not in the file name, we skip it.
continue;
} else {
- // We expand all parents
+ // We expand all parents.
parent_should_expand = true;
}
}
@@ -133,7 +134,7 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
}
Vector<String> FileSystemDock::_compute_uncollapsed_paths() {
- // Register currently collapsed paths
+ // Register currently collapsed paths.
Vector<String> uncollapsed_paths;
TreeItem *root = tree->get_root();
if (root) {
@@ -164,14 +165,13 @@ Vector<String> FileSystemDock::_compute_uncollapsed_paths() {
}
void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, bool p_uncollapse_root, bool p_select_in_favorites) {
-
- // Recreate the tree
+ // Recreate the tree.
tree->clear();
tree_update_id++;
updating_tree = true;
TreeItem *root = tree->create_item();
- // Handles the favorites
+ // Handles the favorites.
TreeItem *favorites = tree->create_item(root);
favorites->set_icon(0, get_icon("Favorites", "EditorIcons"));
favorites->set_text(0, TTR("Favorites:"));
@@ -185,15 +185,19 @@ void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, boo
continue;
Ref<Texture> folder_icon = get_icon("Folder", "EditorIcons");
+ const Color folder_color = get_color("folder_icon_modulate", "FileDialog");
String text;
Ref<Texture> icon;
+ Color color;
if (fave == "res://") {
text = "/";
icon = folder_icon;
+ color = folder_color;
} else if (fave.ends_with("/")) {
text = fave.substr(0, fave.length() - 1).get_file();
icon = folder_icon;
+ color = folder_color;
} else {
text = fave.get_file();
int index;
@@ -203,12 +207,14 @@ void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, boo
} else {
icon = get_icon("File", "EditorIcons");
}
+ color = Color(1, 1, 1);
}
if (searched_string.length() == 0 || text.to_lower().find(searched_string) >= 0) {
TreeItem *ti = tree->create_item(favorites);
ti->set_text(0, text);
ti->set_icon(0, icon);
+ ti->set_icon_modulate(0, color);
ti->set_tooltip(0, fave);
ti->set_selectable(0, true);
ti->set_metadata(0, fave);
@@ -230,7 +236,7 @@ void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, boo
uncollapsed_paths.push_back("res://");
}
- // Create the remaining of the tree
+ // Create the remaining of the tree.
_create_tree(root, EditorFileSystem::get_singleton()->get_filesystem(), uncollapsed_paths, p_select_in_favorites);
tree->ensure_cursor_is_visible();
updating_tree = false;
@@ -242,7 +248,7 @@ void FileSystemDock::set_display_mode(DisplayMode p_display_mode) {
}
void FileSystemDock::_update_display_mode(bool p_force) {
- // Compute the new display mode
+ // Compute the new display mode.
if (p_force || old_display_mode != display_mode) {
button_toggle_display_mode->set_pressed(display_mode == DISPLAY_MODE_SPLIT);
switch (display_mode) {
@@ -275,11 +281,8 @@ void FileSystemDock::_update_display_mode(bool p_force) {
}
void FileSystemDock::_notification(int p_what) {
-
switch (p_what) {
-
case NOTIFICATION_ENTER_TREE: {
-
if (initialized)
return;
initialized = true;
@@ -319,18 +322,15 @@ void FileSystemDock::_notification(int p_what) {
} else {
_update_tree(Vector<String>(), true);
}
-
} break;
+
case NOTIFICATION_PROCESS: {
if (EditorFileSystem::get_singleton()->is_scanning()) {
scanning_progress->set_value(EditorFileSystem::get_singleton()->get_scanning_progress() * 100);
}
} break;
- case NOTIFICATION_EXIT_TREE: {
- } break;
case NOTIFICATION_DRAG_BEGIN: {
-
Dictionary dd = get_viewport()->gui_get_drag_data();
if (tree->is_visible_in_tree() && dd.has("type")) {
if ((String(dd["type"]) == "files") || (String(dd["type"]) == "files_and_dirs") || (String(dd["type"]) == "resource")) {
@@ -339,20 +339,20 @@ void FileSystemDock::_notification(int p_what) {
tree->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN);
}
}
-
} break;
- case NOTIFICATION_DRAG_END: {
+ case NOTIFICATION_DRAG_END: {
tree->set_drop_mode_flags(0);
-
} break;
+
case NOTIFICATION_THEME_CHANGED: {
if (is_visible_in_tree()) {
_update_display_mode(true);
}
} break;
+
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
- // Update icons
+ // Update icons.
String ei = "EditorIcons";
button_reload->set_icon(get_icon("Reload", ei));
button_toggle_display_mode->set_icon(get_icon("Panels2", ei));
@@ -369,48 +369,47 @@ void FileSystemDock::_notification(int p_what) {
file_list_search_box->set_right_icon(get_icon("Search", ei));
file_list_search_box->set_clear_button_enabled(true);
- // Update always showfolders
+ // Update always show folders.
bool new_always_show_folders = bool(EditorSettings::get_singleton()->get("docks/filesystem/always_show_folders"));
if (new_always_show_folders != always_show_folders) {
always_show_folders = new_always_show_folders;
_update_file_list(true);
}
- // Change full tree mode
+ // Change full tree mode.
_update_display_mode();
-
} break;
}
}
void FileSystemDock::_tree_multi_selected(Object *p_item, int p_column, bool p_selected) {
- // Update the import dock
+ // Update the import dock.
import_dock_needs_update = true;
call_deferred("_update_import_dock");
- // Return if we don't select something new
+ // Return if we don't select something new.
if (!p_selected)
return;
- // Tree item selected
+ // Tree item selected.
TreeItem *selected = tree->get_selected();
if (!selected)
return;
TreeItem *favorites_item = tree->get_root()->get_children();
if (selected->get_parent() == favorites_item && !String(selected->get_metadata(0)).ends_with("/")) {
- // Go to the favorites if we click in the favorites and the path has changed
+ // Go to the favorites if we click in the favorites and the path has changed.
path = "Favorites";
} else {
path = selected->get_metadata(0);
- // Note: the "Favorites" item also leads to this path
+ // Note: the "Favorites" item also leads to this path.
}
- // Set the current path
+ // Set the current path.
_set_current_path_text(path);
_push_to_history();
- // Update the file list
+ // Update the file list.
if (!updating_tree && display_mode == DISPLAY_MODE_SPLIT) {
_update_file_list(false);
}
@@ -424,7 +423,6 @@ String FileSystemDock::get_selected_path() const {
}
String FileSystemDock::get_current_path() const {
-
return path;
}
@@ -452,8 +450,7 @@ void FileSystemDock::_navigate_to_path(const String &p_path, bool p_select_in_fa
path = target_path + "/";
} else {
memdelete(dirAccess);
- ERR_EXPLAIN(vformat(TTR("Cannot navigate to '%s' as it has not been found in the file system!"), p_path));
- ERR_FAIL();
+ ERR_FAIL_MSG(vformat("Cannot navigate to '%s' as it has not been found in the file system!", p_path));
}
memdelete(dirAccess);
}
@@ -484,7 +481,6 @@ void FileSystemDock::navigate_to_path(const String &p_path) {
}
void FileSystemDock::_file_list_thumbnail_done(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, const Variant &p_udata) {
-
if ((file_list_vb->is_visible_in_tree() || path == p_path.get_base_dir()) && p_preview.is_valid()) {
Array uarr = p_udata;
int idx = uarr[0];
@@ -532,7 +528,6 @@ void FileSystemDock::_set_file_display(bool p_active) {
}
bool FileSystemDock::_is_file_type_disabled_by_feature_profile(const StringName &p_class) {
-
Ref<EditorFeatureProfile> profile = EditorFeatureProfileManager::get_singleton()->get_current_profile();
if (profile.is_null()) {
return false;
@@ -552,7 +547,6 @@ bool FileSystemDock::_is_file_type_disabled_by_feature_profile(const StringName
}
void FileSystemDock::_search(EditorFileSystemDirectory *p_path, List<FileInfo> *matches, int p_max_items) {
-
if (matches->size() > p_max_items)
return;
@@ -570,10 +564,9 @@ void FileSystemDock::_search(EditorFileSystemDirectory *p_path, List<FileInfo> *
fi.type = p_path->get_file_type(i);
fi.path = p_path->get_file_path(i);
fi.import_broken = !p_path->get_file_import_is_valid(i);
- fi.import_status = 0;
if (_is_file_type_disabled_by_feature_profile(fi.type)) {
- //this type is disabled, will not appear here
+ // This type is disabled, will not appear here.
continue;
}
@@ -585,8 +578,7 @@ void FileSystemDock::_search(EditorFileSystemDirectory *p_path, List<FileInfo> *
}
void FileSystemDock::_update_file_list(bool p_keep_selection) {
-
- // Register the previously selected items
+ // Register the previously selected items.
Set<String> cselection;
if (p_keep_selection) {
for (int i = 0; i < files->get_item_count(); i++) {
@@ -612,7 +604,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
bool use_thumbnails = (file_list_display_mode == FILE_LIST_DISPLAY_THUMBNAILS);
if (use_thumbnails) {
- // Thumbnails mode
+ // Thumbnails mode.
files->set_max_columns(0);
files->set_icon_mode(ItemList::ICON_MODE_TOP);
files->set_fixed_column_width(thumbnail_size * 3 / 2);
@@ -629,8 +621,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
file_thumbnail_broken = get_icon("FileDeadBigThumb", ei);
}
} else {
-
- // No thumbnails
+ // No thumbnails.
files->set_icon_mode(ItemList::ICON_MODE_LEFT);
files->set_max_columns(1);
files->set_max_text_lines(1);
@@ -639,11 +630,12 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
}
Ref<Texture> folder_icon = (use_thumbnails) ? folder_thumbnail : get_icon("folder", "FileDialog");
+ const Color folder_color = get_color("folder_icon_modulate", "FileDialog");
- // Build the FileInfo list
+ // Build the FileInfo list.
List<FileInfo> filelist;
if (path == "Favorites") {
- // Display the favorites
+ // Display the favorites.
Vector<String> favorites = EditorSettings::get_singleton()->get_favorites();
for (int i = 0; i < favorites.size(); i++) {
String favorite = favorites[i];
@@ -677,7 +669,6 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
fi.type = "";
fi.import_broken = true;
}
- fi.import_status = 0;
if (searched_string.length() == 0 || fi.name.to_lower().find(searched_string) >= 0) {
filelist.push_back(fi);
@@ -685,8 +676,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
}
}
} else {
-
- // Get infos on the directory + file
+ // Get infos on the directory + file.
if (directory.ends_with("/") && directory != "res://") {
directory = directory.substr(0, directory.length() - 1);
}
@@ -700,13 +690,11 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
return;
if (searched_string.length() > 0) {
- // Display the search results
+ // Display the search results.
_search(EditorFileSystem::get_singleton()->get_filesystem(), &filelist, 128);
} else {
-
if (display_mode == DISPLAY_MODE_TREE_ONLY || always_show_folders) {
- // Display folders in the list
-
+ // Display folders in the list.
if (directory != "res://") {
files->add_item("..", folder_icon, true);
@@ -716,14 +704,15 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
files->set_item_metadata(files->get_item_count() - 1, bd);
files->set_item_selectable(files->get_item_count() - 1, false);
+ files->set_item_icon_modulate(files->get_item_count() - 1, folder_color);
}
for (int i = 0; i < efd->get_subdir_count(); i++) {
-
String dname = efd->get_subdir(i)->get_name();
files->add_item(dname, folder_icon, true);
files->set_item_metadata(files->get_item_count() - 1, directory.plus_file(dname) + "/");
+ files->set_item_icon_modulate(files->get_item_count() - 1, folder_color);
if (cselection.has(dname)) {
files->select(files->get_item_count() - 1, false);
@@ -731,15 +720,13 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
}
}
- // Display the folder content
+ // Display the folder content.
for (int i = 0; i < efd->get_file_count(); i++) {
-
FileInfo fi;
fi.name = efd->get_file(i);
fi.path = directory.plus_file(fi.name);
fi.type = efd->get_file_type(i);
fi.import_broken = !efd->get_file_import_is_valid(i);
- fi.import_status = 0;
filelist.push_back(fi);
}
@@ -747,7 +734,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
filelist.sort();
}
- // Fills the ItemList control node from the FileInfos
+ // Fills the ItemList control node from the FileInfos.
String oi = "Object";
for (List<FileInfo>::Element *E = filelist.front(); E; E = E->next()) {
FileInfo *finfo = &(E->get());
@@ -760,7 +747,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
String tooltip = fpath;
- // Select the icons
+ // Select the icons.
if (!finfo->import_broken) {
type_icon = (has_icon(ftype, ei)) ? get_icon(ftype, ei) : get_icon(oi, ei);
big_icon = file_thumbnail;
@@ -770,7 +757,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
tooltip += "\n" + TTR("Status: Import of file failed. Please fix file and reimport manually.");
}
- // Add the item to the ItemList
+ // Add the item to the ItemList.
int item_index;
if (use_thumbnails) {
files->add_item(fname, big_icon, true);
@@ -784,7 +771,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
files->set_item_metadata(item_index, fpath);
}
- // Generate the preview
+ // Generate the preview.
if (!finfo->import_broken) {
Array udata;
udata.resize(2);
@@ -793,7 +780,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
EditorResourcePreview::get_singleton()->queue_resource_preview(fpath, this, "_file_list_thumbnail_done", udata);
}
- // Select the items
+ // Select the items.
if (cselection.has(fname))
files->select(item_index, false);
@@ -802,7 +789,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
files->ensure_current_is_visible();
}
- // Tooltip
+ // Tooltip.
if (finfo->sources.size()) {
for (int j = 0; j < finfo->sources.size(); j++) {
tooltip += "\nSource: " + finfo->sources[j];
@@ -849,13 +836,12 @@ void FileSystemDock::_file_list_activate_file(int p_idx) {
}
void FileSystemDock::_preview_invalidated(const String &p_path) {
-
if (file_list_display_mode == FILE_LIST_DISPLAY_THUMBNAILS && p_path.get_base_dir() == path && searched_string.length() == 0 && file_list_vb->is_visible_in_tree()) {
for (int i = 0; i < files->get_item_count(); i++) {
if (files->get_item_metadata(i) == p_path) {
- //re-request preview
+ // Re-request preview.
Array udata;
udata.resize(2);
udata[0] = i;
@@ -868,7 +854,6 @@ void FileSystemDock::_preview_invalidated(const String &p_path) {
}
void FileSystemDock::_fs_changed() {
-
button_hist_prev->set_disabled(history_pos == 0);
button_hist_next->set_disabled(history_pos == history.size() - 1);
scanning_vb->hide();
@@ -886,7 +871,6 @@ void FileSystemDock::_fs_changed() {
}
void FileSystemDock::_set_scanning_mode() {
-
button_hist_prev->set_disabled(true);
button_hist_next->set_disabled(true);
split_box->hide();
@@ -900,7 +884,6 @@ void FileSystemDock::_set_scanning_mode() {
}
void FileSystemDock::_fw_history() {
-
if (history_pos < history.size() - 1)
history_pos++;
@@ -978,7 +961,7 @@ void FileSystemDock::_find_remaps(EditorFileSystemDirectory *efsd, const Map<Str
void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_new_path,
Map<String, String> &p_file_renames, Map<String, String> &p_folder_renames) {
- //Ensure folder paths end with "/"
+ // Ensure folder paths end with "/".
String old_path = (p_item.is_file || p_item.path.ends_with("/")) ? p_item.path : (p_item.path + "/");
String new_path = (p_item.is_file || p_new_path.ends_with("/")) ? p_new_path : (p_new_path + "/");
@@ -988,12 +971,12 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_
EditorNode::get_singleton()->add_io_error(TTR("Cannot move/rename resources root."));
return;
} else if (!p_item.is_file && new_path.begins_with(old_path)) {
- //This check doesn't erroneously catch renaming to a longer name as folder paths always end with "/"
+ // This check doesn't erroneously catch renaming to a longer name as folder paths always end with "/".
EditorNode::get_singleton()->add_io_error(TTR("Cannot move a folder into itself.") + "\n" + old_path + "\n");
return;
}
- //Build a list of files which will have new paths as a result of this operation
+ // Build a list of files which will have new paths as a result of this operation.
Vector<String> file_changed_paths;
Vector<String> folder_changed_paths;
if (p_item.is_file) {
@@ -1007,8 +990,7 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_
print_verbose("Moving " + old_path + " -> " + new_path);
Error err = da->rename(old_path, new_path);
if (err == OK) {
-
- //Move/Rename any corresponding import settings too
+ // Move/Rename any corresponding import settings too.
if (p_item.is_file && FileAccess::exists(old_path + ".import")) {
err = da->rename(old_path + ".import", new_path + ".import");
if (err != OK) {
@@ -1016,7 +998,7 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_
}
}
- // update scene if it is open
+ // Update scene if it is open.
for (int i = 0; i < file_changed_paths.size(); ++i) {
String new_item_path = p_item.is_file ? new_path : file_changed_paths[i].replace_first(old_path, new_path);
if (ResourceLoader::get_resource_type(new_item_path) == "PackedScene" && editor->is_scene_open(file_changed_paths[i])) {
@@ -1031,7 +1013,7 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_
}
}
- //Only treat as a changed dependency if it was successfully moved
+ // Only treat as a changed dependency if it was successfully moved.
for (int i = 0; i < file_changed_paths.size(); ++i) {
p_file_renames[file_changed_paths[i]] = file_changed_paths[i].replace_first(old_path, new_path);
print_verbose(" Remap: " + file_changed_paths[i] + " -> " + p_file_renames[file_changed_paths[i]]);
@@ -1048,7 +1030,7 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_
}
void FileSystemDock::_try_duplicate_item(const FileOrFolder &p_item, const String &p_new_path) const {
- //Ensure folder paths end with "/"
+ // Ensure folder paths end with "/".
String old_path = (p_item.is_file || p_item.path.ends_with("/")) ? p_item.path : (p_item.path + "/");
String new_path = (p_item.is_file || p_new_path.ends_with("/")) ? p_new_path : (p_new_path + "/");
@@ -1058,7 +1040,7 @@ void FileSystemDock::_try_duplicate_item(const FileOrFolder &p_item, const Strin
EditorNode::get_singleton()->add_io_error(TTR("Cannot move/rename resources root."));
return;
} else if (!p_item.is_file && new_path.begins_with(old_path)) {
- //This check doesn't erroneously catch renaming to a longer name as folder paths always end with "/"
+ // This check doesn't erroneously catch renaming to a longer name as folder paths always end with "/".
EditorNode::get_singleton()->add_io_error(TTR("Cannot move a folder into itself.") + "\n" + old_path + "\n");
return;
}
@@ -1067,7 +1049,7 @@ void FileSystemDock::_try_duplicate_item(const FileOrFolder &p_item, const Strin
print_verbose("Duplicating " + old_path + " -> " + new_path);
Error err = p_item.is_file ? da->copy(old_path, new_path) : da->copy_dir(old_path, new_path);
if (err == OK) {
- //Move/Rename any corresponding import settings too
+ // Move/Rename any corresponding import settings too.
if (p_item.is_file && FileAccess::exists(old_path + ".import")) {
err = da->copy(old_path + ".import", new_path + ".import");
if (err != OK) {
@@ -1081,13 +1063,11 @@ void FileSystemDock::_try_duplicate_item(const FileOrFolder &p_item, const Strin
}
void FileSystemDock::_update_resource_paths_after_move(const Map<String, String> &p_renames) const {
-
- //Rename all resources loaded, be it subresources or actual resources
+ // Rename all resources loaded, be it subresources or actual resources.
List<Ref<Resource> > cached;
ResourceCache::get_cached_resources(&cached);
for (List<Ref<Resource> >::Element *E = cached.front(); E; E = E->next()) {
-
Ref<Resource> r = E->get();
String base_path = r->get_path();
@@ -1106,7 +1086,6 @@ void FileSystemDock::_update_resource_paths_after_move(const Map<String, String>
}
for (int i = 0; i < EditorNode::get_editor_data().get_edited_scene_count(); i++) {
-
String path;
if (i == EditorNode::get_editor_data().get_edited_scene()) {
if (!get_tree()->get_edited_scene_root())
@@ -1114,7 +1093,6 @@ void FileSystemDock::_update_resource_paths_after_move(const Map<String, String>
path = get_tree()->get_edited_scene_root()->get_filename();
} else {
-
path = EditorNode::get_editor_data().get_scene_path(i);
}
@@ -1123,23 +1101,21 @@ void FileSystemDock::_update_resource_paths_after_move(const Map<String, String>
}
if (i == EditorNode::get_editor_data().get_edited_scene()) {
-
get_tree()->get_edited_scene_root()->set_filename(path);
} else {
-
EditorNode::get_editor_data().set_scene_path(i, path);
}
}
}
void FileSystemDock::_update_dependencies_after_move(const Map<String, String> &p_renames) const {
- //The following code assumes that the following holds:
+ // The following code assumes that the following holds:
// 1) EditorFileSystem contains the old paths/folder structure from before the rename/move.
// 2) ResourceLoader can use the new paths without needing to call rescan.
Vector<String> remaps;
_find_remaps(EditorFileSystem::get_singleton()->get_filesystem(), p_renames, remaps);
for (int i = 0; i < remaps.size(); ++i) {
- //Because we haven't called a rescan yet the found remap might still be an old path itself.
+ // Because we haven't called a rescan yet the found remap might still be an old path itself.
String file = p_renames.has(remaps[i]) ? p_renames[remaps[i]] : remaps[i];
print_verbose("Remapping dependencies for: " + file);
Error err = ResourceLoader::rename_dependencies(file, p_renames);
@@ -1153,8 +1129,7 @@ void FileSystemDock::_update_dependencies_after_move(const Map<String, String> &
}
void FileSystemDock::_update_project_settings_after_move(const Map<String, String> &p_renames) const {
-
- // Find all project settings of type FILE and replace them if needed
+ // Find all project settings of type FILE and replace them if needed.
const Map<StringName, PropertyInfo> prop_info = ProjectSettings::get_singleton()->get_custom_property_info();
for (const Map<StringName, PropertyInfo>::Element *E = prop_info.front(); E; E = E->next()) {
if (E->get().hint == PROPERTY_HINT_FILE) {
@@ -1185,7 +1160,6 @@ void FileSystemDock::_update_project_settings_after_move(const Map<String, Strin
}
void FileSystemDock::_update_favorites_list_after_move(const Map<String, String> &p_files_renames, const Map<String, String> &p_folders_renames) const {
-
Vector<String> favorites = EditorSettings::get_singleton()->get_favorites();
Vector<String> new_favorites;
@@ -1250,6 +1224,48 @@ void FileSystemDock::_make_dir_confirm() {
}
}
+void FileSystemDock::_make_scene_confirm() {
+ String scene_name = make_scene_dialog_text->get_text().strip_edges();
+
+ if (scene_name.length() == 0) {
+ EditorNode::get_singleton()->show_warning(TTR("No name provided."));
+ return;
+ }
+
+ String directory = path;
+ if (!directory.ends_with("/")) {
+ directory = directory.get_base_dir();
+ }
+
+ String extension = scene_name.get_extension();
+ List<String> extensions;
+ Ref<PackedScene> sd = memnew(PackedScene);
+ ResourceSaver::get_recognized_extensions(sd, &extensions);
+
+ bool extension_correct = false;
+ for (List<String>::Element *E = extensions.front(); E; E = E->next()) {
+ if (E->get() == extension) {
+ extension_correct = true;
+ break;
+ }
+ }
+ if (!extension_correct)
+ scene_name = scene_name.get_basename() + ".tscn";
+
+ scene_name = directory.plus_file(scene_name);
+
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ if (da->file_exists(scene_name)) {
+ EditorNode::get_singleton()->show_warning(TTR("A file or folder with this name already exists."));
+ memdelete(da);
+ return;
+ }
+ memdelete(da);
+
+ int idx = editor->new_scene();
+ editor->get_editor_data().set_scene_path(idx, scene_name);
+}
+
void FileSystemDock::_file_deleted(String p_file) {
emit_signal("file_deleted", p_file);
}
@@ -1259,7 +1275,6 @@ void FileSystemDock::_folder_deleted(String p_folder) {
}
void FileSystemDock::_rename_operation_confirm() {
-
String new_name = rename_dialog_text->get_text().strip_edges();
if (new_name.length() == 0) {
EditorNode::get_singleton()->show_warning(TTR("No name provided."));
@@ -1279,10 +1294,10 @@ void FileSystemDock::_rename_operation_confirm() {
EditorFileSystem::get_singleton()->move_group_file(old_path, new_path);
}
- //Present a more user friendly warning for name conflict
+ // Present a more user friendly warning for name conflict.
DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
#if defined(WINDOWS_ENABLED) || defined(UWP_ENABLED)
- // Workaround case insensitivity on Windows
+ // Workaround case insensitivity on Windows.
if ((da->file_exists(new_path) || da->dir_exists(new_path)) && new_path.to_lower() != old_path.to_lower()) {
#else
if (da->file_exists(new_path) || da->dir_exists(new_path)) {
@@ -1314,7 +1329,6 @@ void FileSystemDock::_rename_operation_confirm() {
}
void FileSystemDock::_duplicate_operation_confirm() {
-
String new_name = duplicate_dialog_text->get_text().strip_edges();
if (new_name.length() == 0) {
EditorNode::get_singleton()->show_warning(TTR("No name provided."));
@@ -1332,7 +1346,7 @@ void FileSystemDock::_duplicate_operation_confirm() {
String new_path = base_dir.plus_file(new_name);
- //Present a more user friendly warning for name conflict
+ // Present a more user friendly warning for name conflict
DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
if (da->file_exists(new_path) || da->dir_exists(new_path)) {
EditorNode::get_singleton()->show_warning(TTR("A file or folder with this name already exists."));
@@ -1343,7 +1357,7 @@ void FileSystemDock::_duplicate_operation_confirm() {
_try_duplicate_item(to_duplicate, new_path);
- //Rescan everything
+ // Rescan everything.
print_verbose("FileSystem: calling rescan.");
_rescan();
}
@@ -1376,14 +1390,14 @@ void FileSystemDock::_move_operation_confirm(const String &p_to_path, bool overw
to_move_path = p_to_path;
bool can_move = _check_existing();
if (!can_move) {
- //ask to do something
+ // Ask to do something.
overwrite_dialog->popup_centered_minsize();
overwrite_dialog->grab_focus();
return;
}
}
- //check groups
+ // Check groups.
for (int i = 0; i < to_move.size(); i++) {
print_line("is group: " + to_move[i].path + ": " + itos(EditorFileSystem::get_singleton()->is_group_file(to_move[i].path)));
@@ -1424,7 +1438,7 @@ void FileSystemDock::_move_operation_confirm(const String &p_to_path, bool overw
}
Vector<String> FileSystemDock::_tree_get_selected(bool remove_self_inclusion) {
- // Build a list of selected items with the active one at the first position
+ // Build a list of selected items with the active one at the first position.
Vector<String> selected_strings;
TreeItem *favorites_item = tree->get_root()->get_children();
@@ -1442,8 +1456,15 @@ Vector<String> FileSystemDock::_tree_get_selected(bool remove_self_inclusion) {
selected = tree->get_next_selected(selected);
}
- // Remove paths or files that are included into another
- if (remove_self_inclusion && selected_strings.size() > 1) {
+ if (remove_self_inclusion) {
+ selected_strings = _remove_self_included_paths(selected_strings);
+ }
+ return selected_strings;
+}
+
+Vector<String> FileSystemDock::_remove_self_included_paths(Vector<String> selected_strings) {
+ // Remove paths or files that are included into another.
+ if (selected_strings.size() > 1) {
selected_strings.sort_custom<NaturalNoCaseComparator>();
String last_path = "";
for (int i = 0; i < selected_strings.size(); i++) {
@@ -1460,10 +1481,9 @@ Vector<String> FileSystemDock::_tree_get_selected(bool remove_self_inclusion) {
}
void FileSystemDock::_tree_rmb_option(int p_option) {
+ Vector<String> selected_strings = _tree_get_selected(false);
- Vector<String> selected_strings = _tree_get_selected();
-
- // Execute the current option
+ // Execute the current option.
switch (p_option) {
case FOLDER_EXPAND_ALL:
case FOLDER_COLLAPSE_ALL: {
@@ -1503,11 +1523,11 @@ void FileSystemDock::_file_list_rmb_option(int p_option) {
}
void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected) {
- // The first one should be the active item
+ // The first one should be the active item.
switch (p_option) {
case FILE_SHOW_IN_EXPLORER: {
- // Show the file / folder in the OS explorer
+ // Show the file/folder in the OS explorer.
String fpath = path;
if (path == "Favorites") {
fpath = p_selected[0];
@@ -1521,7 +1541,7 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
} break;
case FILE_OPEN: {
- // Open folders
+ // Open folders.
TreeItem *selected = tree->get_root();
selected = tree->get_next_selected(selected);
while (selected) {
@@ -1530,21 +1550,21 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
}
selected = tree->get_next_selected(selected);
}
- // Open the file
+ // Open the file.
for (int i = 0; i < p_selected.size(); i++) {
_select_file(p_selected[i]);
}
} break;
case FILE_INHERIT: {
- // Create a new scene inherited from the selected one
+ // Create a new scene inherited from the selected one.
if (p_selected.size() == 1) {
emit_signal("inherit", p_selected[0]);
}
} break;
case FILE_INSTANCE: {
- // Instance all selected scenes
+ // Instance all selected scenes.
Vector<String> paths;
for (int i = 0; i < p_selected.size(); i++) {
String fpath = p_selected[i];
@@ -1558,7 +1578,7 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
} break;
case FILE_ADD_FAVORITE: {
- // Add the files from favorites
+ // Add the files from favorites.
Vector<String> favorites = EditorSettings::get_singleton()->get_favorites();
for (int i = 0; i < p_selected.size(); i++) {
if (favorites.find(p_selected[i]) == -1) {
@@ -1570,7 +1590,7 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
} break;
case FILE_REMOVE_FAVORITE: {
- // Remove the files from favorites
+ // Remove the files from favorites.
Vector<String> favorites = EditorSettings::get_singleton()->get_favorites();
for (int i = 0; i < p_selected.size(); i++) {
favorites.erase(p_selected[i]);
@@ -1582,7 +1602,7 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
} break;
case FILE_DEPENDENCIES: {
- // Checkout the file dependencies
+ // Checkout the file dependencies.
if (!p_selected.empty()) {
String fpath = p_selected[0];
deps_editor->edit(fpath);
@@ -1590,7 +1610,7 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
} break;
case FILE_OWNERS: {
- // Checkout the file owners
+ // Checkout the file owners.
if (!p_selected.empty()) {
String fpath = p_selected[0];
owners_editor->show(fpath);
@@ -1598,10 +1618,11 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
} break;
case FILE_MOVE: {
- // Move the files to a given location
+ // Move the files to a given location.
to_move.clear();
- for (int i = 0; i < p_selected.size(); i++) {
- String fpath = p_selected[i];
+ Vector<String> collapsed_paths = _remove_self_included_paths(p_selected);
+ for (int i = collapsed_paths.size() - 1; i >= 0; i--) {
+ String fpath = collapsed_paths[i];
if (fpath != "res://") {
to_move.push_back(FileOrFolder(fpath, !fpath.ends_with("/")));
}
@@ -1612,7 +1633,7 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
} break;
case FILE_RENAME: {
- // Rename the active file
+ // Rename the active file.
if (!p_selected.empty()) {
to_rename.path = p_selected[0];
if (to_rename.path != "res://") {
@@ -1635,12 +1656,13 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
} break;
case FILE_REMOVE: {
- // Remove the selected files
+ // Remove the selected files.
Vector<String> remove_files;
Vector<String> remove_folders;
+ Vector<String> collapsed_paths = _remove_self_included_paths(p_selected);
- for (int i = 0; i < p_selected.size(); i++) {
- String fpath = p_selected[i];
+ for (int i = 0; i < collapsed_paths.size(); i++) {
+ String fpath = collapsed_paths[i];
if (fpath != "res://") {
if (fpath.ends_with("/")) {
remove_folders.push_back(fpath);
@@ -1656,7 +1678,7 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
} break;
case FILE_DUPLICATE: {
- // Duplicate the selected files
+ // Duplicate the selected files.
for (int i = 0; i < p_selected.size(); i++) {
to_duplicate.path = p_selected[i];
to_duplicate.is_file = !to_duplicate.path.ends_with("/");
@@ -1681,7 +1703,7 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
} break;
case FILE_REIMPORT: {
- // Reimport all selected files
+ // Reimport all selected files.
Vector<String> reimport;
for (int i = 0; i < p_selected.size(); i++) {
reimport.push_back(p_selected[i]);
@@ -1691,15 +1713,20 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
} break;
case FILE_NEW_FOLDER: {
- // Create a new folder
make_dir_dialog_text->set_text("new folder");
make_dir_dialog_text->select_all();
make_dir_dialog->popup_centered_minsize(Size2(250, 80) * EDSCALE);
make_dir_dialog_text->grab_focus();
} break;
+ case FILE_NEW_SCENE: {
+ make_scene_dialog_text->set_text("new scene");
+ make_scene_dialog_text->select_all();
+ make_scene_dialog->popup_centered_minsize(Size2(250, 80) * EDSCALE);
+ make_scene_dialog_text->grab_focus();
+ } break;
+
case FILE_NEW_SCRIPT: {
- // Create a new script
String fpath = path;
if (!fpath.ends_with("/")) {
fpath = fpath.get_base_dir();
@@ -1709,7 +1736,6 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
} break;
case FILE_COPY_PATH: {
- // Copy the file path
if (!p_selected.empty()) {
String fpath = p_selected[0];
OS::get_singleton()->set_clipboard(fpath);
@@ -1717,7 +1743,6 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
} break;
case FILE_NEW_RESOURCE: {
- // Create a new resource
new_resource_dialog->popup_create(true);
} break;
}
@@ -1745,7 +1770,7 @@ void FileSystemDock::_resource_created() const {
void FileSystemDock::_search_changed(const String &p_text, const Control *p_from) {
if (searched_string.length() == 0 && p_text.length() > 0) {
- // Register the uncollapsed paths before they change
+ // Register the uncollapsed paths before they change.
uncollapsed_paths_before_search = _compute_uncollapsed_paths();
}
@@ -1753,7 +1778,7 @@ void FileSystemDock::_search_changed(const String &p_text, const Control *p_from
if (p_from == tree_search_box)
file_list_search_box->set_text(searched_string);
- else // file_list_search_box
+ else // File_list_search_box.
tree_search_box->set_text(searched_string);
switch (display_mode) {
@@ -1768,7 +1793,6 @@ void FileSystemDock::_search_changed(const String &p_text, const Control *p_from
}
void FileSystemDock::_rescan() {
-
_set_scanning_mode();
EditorFileSystem::get_singleton()->scan();
}
@@ -1783,12 +1807,10 @@ void FileSystemDock::fix_dependencies(const String &p_for_file) {
}
void FileSystemDock::focus_on_filter() {
-
file_list_search_box->grab_focus();
}
void FileSystemDock::set_file_list_display_mode(FileListDisplayMode p_mode) {
-
if (p_mode == file_list_display_mode)
return;
@@ -1802,12 +1824,12 @@ Variant FileSystemDock::get_drag_data_fw(const Point2 &p_point, Control *p_from)
Vector<String> paths;
if (p_from == tree) {
- // Check if the first selected is in favorite
+ // Check if the first selected is in favorite.
TreeItem *selected = tree->get_next_selected(tree->get_root());
while (selected) {
TreeItem *favorites_item = tree->get_root()->get_children();
if (selected == favorites_item) {
- // The "Favorites" item is not draggable
+ // The "Favorites" item is not draggable.
return Variant();
}
@@ -1845,12 +1867,11 @@ Variant FileSystemDock::get_drag_data_fw(const Point2 &p_point, Control *p_from)
}
bool FileSystemDock::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
Dictionary drag_data = p_data;
if (drag_data.has("type") && String(drag_data["type"]) == "favorite") {
- // Moving favorite around
+ // Moving favorite around.
TreeItem *ti = tree->get_item_at_position(p_point);
if (!ti)
return false;
@@ -1861,20 +1882,20 @@ bool FileSystemDock::can_drop_data_fw(const Point2 &p_point, const Variant &p_da
TreeItem *resources_item = favorites_item->get_next();
if (ti == favorites_item) {
- return (drop_section == 1); // The parent, first fav
+ return (drop_section == 1); // The parent, first fav.
}
if (ti->get_parent() && favorites_item == ti->get_parent()) {
return true; // A favorite
}
if (ti == resources_item) {
- return (drop_section == -1); // The tree, last fav
+ return (drop_section == -1); // The tree, last fav.
}
return false;
}
if (drag_data.has("type") && String(drag_data["type"]) == "resource") {
- // Move resources
+ // Move resources.
String to_dir;
bool favorite;
_get_drag_target_folder(to_dir, favorite, p_point, p_from);
@@ -1882,7 +1903,7 @@ bool FileSystemDock::can_drop_data_fw(const Point2 &p_point, const Variant &p_da
}
if (drag_data.has("type") && (String(drag_data["type"]) == "files" || String(drag_data["type"]) == "files_and_dirs")) {
- // Move files or dir
+ // Move files or dir.
String to_dir;
bool favorite;
_get_drag_target_folder(to_dir, favorite, p_point, p_from);
@@ -1893,8 +1914,8 @@ bool FileSystemDock::can_drop_data_fw(const Point2 &p_point, const Variant &p_da
if (to_dir.empty())
return false;
- //Attempting to move a folder into itself will fail later
- //Rather than bring up a message don't try to do it in the first place
+ // Attempting to move a folder into itself will fail later,
+ // rather than bring up a message don't try to do it in the first place
to_dir = to_dir.ends_with("/") ? to_dir : (to_dir + "/");
Vector<String> fnames = drag_data["files"];
for (int i = 0; i < fnames.size(); ++i) {
@@ -1909,7 +1930,6 @@ bool FileSystemDock::can_drop_data_fw(const Point2 &p_point, const Variant &p_da
}
void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
-
if (!can_drop_data_fw(p_point, p_data, p_from))
return;
Dictionary drag_data = p_data;
@@ -1917,7 +1937,7 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data,
Vector<String> dirs = EditorSettings::get_singleton()->get_favorites();
if (drag_data.has("type") && String(drag_data["type"]) == "favorite") {
- // Moving favorite around
+ // Moving favorite around.
TreeItem *ti = tree->get_item_at_position(p_point);
if (!ti)
return;
@@ -1929,20 +1949,20 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data,
TreeItem *resources_item = favorites_item->get_next();
if (ti == favorites_item) {
- // Drop on the favorite folder
+ // Drop on the favorite folder.
drop_position = 0;
} else if (ti == resources_item) {
- // Drop on the resource item
+ // Drop on the resource item.
drop_position = dirs.size();
} else {
- // Drop in the list
+ // Drop in the list.
drop_position = dirs.find(ti->get_metadata(0));
if (drop_section == 1) {
drop_position++;
}
}
- // Remove dragged favorites
+ // Remove dragged favorites.
Vector<int> to_remove;
int offset = 0;
for (int i = 0; i < files.size(); i++) {
@@ -1958,7 +1978,7 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data,
dirs.remove(to_remove[i] - i);
}
- // Re-add them at the right position
+ // Re-add them at the right position.
for (int i = 0; i < files.size(); i++) {
dirs.insert(drop_position, files[i]);
drop_position++;
@@ -1973,7 +1993,7 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data,
}
if (drag_data.has("type") && String(drag_data["type"]) == "resource") {
- // Moving resource
+ // Moving resource.
Ref<Resource> res = drag_data["resource"];
String to_dir;
bool favorite;
@@ -1985,7 +2005,7 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data,
}
if (drag_data.has("type") && (String(drag_data["type"]) == "files" || String(drag_data["type"]) == "files_and_dirs")) {
- // Move files or add to favorites
+ // Move files or add to favorites.
String to_dir;
bool favorite;
_get_drag_target_folder(to_dir, favorite, p_point, p_from);
@@ -2015,7 +2035,7 @@ void FileSystemDock::_get_drag_target_folder(String &target, bool &target_favori
target = String();
target_favorites = false;
- // In the file list
+ // In the file list.
if (p_from == files) {
int pos = files->get_item_at_position(p_point, true);
if (pos == -1) {
@@ -2027,12 +2047,12 @@ void FileSystemDock::_get_drag_target_folder(String &target, bool &target_favori
return;
}
- // In the tree
+ // In the tree.
if (p_from == tree) {
TreeItem *ti = tree->get_item_at_position(p_point);
int section = tree->get_drop_section_at_position(p_point);
if (ti) {
- // Check the favorites first
+ // Check the favorites first.
if (ti == tree->get_root()->get_children() && section >= 0) {
target_favorites = true;
return;
@@ -2043,13 +2063,13 @@ void FileSystemDock::_get_drag_target_folder(String &target, bool &target_favori
String fpath = ti->get_metadata(0);
if (section == 0) {
if (fpath.ends_with("/")) {
- // We drop on a folder
+ // We drop on a folder.
target = fpath;
return;
}
} else {
if (ti->get_parent() != tree->get_root()->get_children()) {
- // Not in the favorite section
+ // Not in the favorite section.
if (fpath != "res://") {
// We drop between two files
if (fpath.ends_with("/")) {
@@ -2066,7 +2086,7 @@ void FileSystemDock::_get_drag_target_folder(String &target, bool &target_favori
}
void FileSystemDock::_file_and_folders_fill_popup(PopupMenu *p_popup, Vector<String> p_paths, bool p_display_path_dependent_options) {
- // Add options for files and folders
+ // Add options for files and folders.
ERR_FAIL_COND(p_paths.empty());
Vector<String> filenames;
@@ -2090,7 +2110,7 @@ void FileSystemDock::_file_and_folders_fill_popup(PopupMenu *p_popup, Vector<Str
all_files_scenes &= (EditorFileSystem::get_singleton()->get_file_type(fpath) == "PackedScene");
}
- // Check if in favorites
+ // Check if in favorites.
bool found = false;
for (int j = 0; j < favorites.size(); j++) {
if (favorites[j] == fpath) {
@@ -2106,7 +2126,6 @@ void FileSystemDock::_file_and_folders_fill_popup(PopupMenu *p_popup, Vector<Str
}
if (all_files) {
-
if (all_files_scenes) {
if (filenames.size() == 1) {
p_popup->add_item(TTR("Open Scene"), FILE_OPEN);
@@ -2146,19 +2165,25 @@ void FileSystemDock::_file_and_folders_fill_popup(PopupMenu *p_popup, Vector<Str
if (p_paths.size() == 1) {
p_popup->add_item(TTR("Copy Path"), FILE_COPY_PATH);
- p_popup->add_item(TTR("Rename..."), FILE_RENAME);
- p_popup->add_item(TTR("Duplicate..."), FILE_DUPLICATE);
+ if (p_paths[0] != "res://") {
+ p_popup->add_item(TTR("Rename..."), FILE_RENAME);
+ p_popup->add_item(TTR("Duplicate..."), FILE_DUPLICATE);
+ }
}
- p_popup->add_item(TTR("Move To..."), FILE_MOVE);
- p_popup->add_item(TTR("Delete"), FILE_REMOVE);
+ if (p_paths.size() > 1 || p_paths[0] != "res://") {
+ p_popup->add_item(TTR("Move To..."), FILE_MOVE);
+ p_popup->add_item(TTR("Delete"), FILE_REMOVE);
+ }
if (p_paths.size() == 1) {
p_popup->add_separator();
if (p_display_path_dependent_options) {
p_popup->add_item(TTR("New Folder..."), FILE_NEW_FOLDER);
+ p_popup->add_item(TTR("New Scene..."), FILE_NEW_SCENE);
p_popup->add_item(TTR("New Script..."), FILE_NEW_SCRIPT);
p_popup->add_item(TTR("New Resource..."), FILE_NEW_RESOURCE);
+ p_popup->add_separator();
}
String fpath = p_paths[0];
@@ -2168,8 +2193,8 @@ void FileSystemDock::_file_and_folders_fill_popup(PopupMenu *p_popup, Vector<Str
}
void FileSystemDock::_tree_rmb_select(const Vector2 &p_pos) {
- // Right click is pressed in the tree
- Vector<String> paths = _tree_get_selected();
+ // Right click is pressed in the tree.
+ Vector<String> paths = _tree_get_selected(false);
if (paths.size() == 1) {
if (paths[0].ends_with("/")) {
@@ -2179,7 +2204,7 @@ void FileSystemDock::_tree_rmb_select(const Vector2 &p_pos) {
}
}
- // Popup
+ // Popup.
if (!paths.empty()) {
tree_popup->clear();
tree_popup->set_size(Size2(1, 1));
@@ -2190,11 +2215,12 @@ void FileSystemDock::_tree_rmb_select(const Vector2 &p_pos) {
}
void FileSystemDock::_tree_rmb_empty(const Vector2 &p_pos) {
- // Right click is pressed in the empty space of the tree
+ // Right click is pressed in the empty space of the tree.
path = "res://";
tree_popup->clear();
tree_popup->set_size(Size2(1, 1));
tree_popup->add_item(TTR("New Folder..."), FILE_NEW_FOLDER);
+ tree_popup->add_item(TTR("New Scene..."), FILE_NEW_SCENE);
tree_popup->add_item(TTR("New Script..."), FILE_NEW_SCRIPT);
tree_popup->add_item(TTR("New Resource..."), FILE_NEW_RESOURCE);
tree_popup->set_position(tree->get_global_position() + p_pos);
@@ -2206,7 +2232,7 @@ void FileSystemDock::_tree_empty_selected() {
}
void FileSystemDock::_file_list_rmb_select(int p_item, const Vector2 &p_pos) {
- // Right click is pressed in the file list
+ // Right click is pressed in the file list.
Vector<String> paths;
for (int i = 0; i < files->get_item_count(); i++) {
if (!files->is_selected(i))
@@ -2218,7 +2244,7 @@ void FileSystemDock::_file_list_rmb_select(int p_item, const Vector2 &p_pos) {
paths.push_back(files->get_item_metadata(i));
}
- // Popup
+ // Popup.
if (!paths.empty()) {
file_list_popup->clear();
file_list_popup->set_size(Size2(1, 1));
@@ -2229,7 +2255,7 @@ void FileSystemDock::_file_list_rmb_select(int p_item, const Vector2 &p_pos) {
}
void FileSystemDock::_file_list_rmb_pressed(const Vector2 &p_pos) {
- // Right click on empty space for file list
+ // Right click on empty space for file list.
if (searched_string.length() > 0)
return;
@@ -2237,21 +2263,21 @@ void FileSystemDock::_file_list_rmb_pressed(const Vector2 &p_pos) {
file_list_popup->set_size(Size2(1, 1));
file_list_popup->add_item(TTR("New Folder..."), FILE_NEW_FOLDER);
+ file_list_popup->add_item(TTR("New Scene..."), FILE_NEW_SCENE);
file_list_popup->add_item(TTR("New Script..."), FILE_NEW_SCRIPT);
file_list_popup->add_item(TTR("New Resource..."), FILE_NEW_RESOURCE);
- file_list_popup->add_item(TTR("Show in File Manager"), FILE_SHOW_IN_EXPLORER);
+ file_list_popup->add_separator();
+ file_list_popup->add_item(TTR("Open in File Manager"), FILE_SHOW_IN_EXPLORER);
file_list_popup->set_position(files->get_global_position() + p_pos);
file_list_popup->popup();
}
void FileSystemDock::select_file(const String &p_file) {
-
_navigate_to_path(p_file);
}
void FileSystemDock::_file_multi_selected(int p_index, bool p_selected) {
-
- // Set the path to the current focused item
+ // Set the path to the current focused item.
int current = files->get_current();
if (current == p_index) {
String fpath = files->get_item_metadata(current);
@@ -2263,15 +2289,14 @@ void FileSystemDock::_file_multi_selected(int p_index, bool p_selected) {
}
}
- // Update the import dock
+ // Update the import dock.
import_dock_needs_update = true;
call_deferred("_update_import_dock");
}
void FileSystemDock::_tree_gui_input(Ref<InputEvent> p_event) {
-
if (get_viewport()->get_modal_stack_top())
- return; //ignore because of modal window
+ return; // Ignore because of modal window.
Ref<InputEventKey> key = p_event;
if (key.is_valid() && key->is_pressed() && !key->is_echo()) {
@@ -2288,9 +2313,8 @@ void FileSystemDock::_tree_gui_input(Ref<InputEvent> p_event) {
}
void FileSystemDock::_file_list_gui_input(Ref<InputEvent> p_event) {
-
if (get_viewport()->get_modal_stack_top())
- return; //ignore because of modal window
+ return; // Ignore because of modal window.
Ref<InputEventKey> key = p_event;
if (key.is_valid() && key->is_pressed() && !key->is_echo()) {
@@ -2307,18 +2331,17 @@ void FileSystemDock::_file_list_gui_input(Ref<InputEvent> p_event) {
}
void FileSystemDock::_update_import_dock() {
-
if (!import_dock_needs_update)
return;
- // List selected
+ // List selected.
Vector<String> selected;
if (display_mode == DISPLAY_MODE_TREE_ONLY) {
// Use the tree
selected = _tree_get_selected();
} else {
- // Use the file list
+ // Use the file list.
for (int i = 0; i < files->get_item_count(); i++) {
if (!files->is_selected(i))
continue;
@@ -2327,7 +2350,7 @@ void FileSystemDock::_update_import_dock() {
}
}
- // Check import
+ // Check import.
Vector<String> imports;
String import_type;
for (int i = 0; i < selected.size(); i++) {
@@ -2354,7 +2377,7 @@ void FileSystemDock::_update_import_dock() {
if (import_type == "") {
import_type = type;
} else if (import_type != type) {
- //all should be the same type
+ // All should be the same type.
imports.clear();
break;
}
@@ -2373,12 +2396,10 @@ void FileSystemDock::_update_import_dock() {
}
void FileSystemDock::_feature_profile_changed() {
-
_update_display_mode(true);
}
void FileSystemDock::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("_file_list_gui_input"), &FileSystemDock::_file_list_gui_input);
ClassDB::bind_method(D_METHOD("_tree_gui_input"), &FileSystemDock::_tree_gui_input);
@@ -2411,6 +2432,7 @@ void FileSystemDock::_bind_methods() {
ClassDB::bind_method(D_METHOD("_fs_changed"), &FileSystemDock::_fs_changed);
ClassDB::bind_method(D_METHOD("_tree_multi_selected"), &FileSystemDock::_tree_multi_selected);
ClassDB::bind_method(D_METHOD("_make_dir_confirm"), &FileSystemDock::_make_dir_confirm);
+ ClassDB::bind_method(D_METHOD("_make_scene_confirm"), &FileSystemDock::_make_scene_confirm);
ClassDB::bind_method(D_METHOD("_resource_created"), &FileSystemDock::_resource_created);
ClassDB::bind_method(D_METHOD("_move_operation_confirm", "to_path", "overwrite"), &FileSystemDock::_move_operation_confirm, DEFVAL(false));
ClassDB::bind_method(D_METHOD("_move_with_overwrite"), &FileSystemDock::_move_with_overwrite);
@@ -2442,7 +2464,6 @@ void FileSystemDock::_bind_methods() {
}
FileSystemDock::FileSystemDock(EditorNode *p_editor) {
-
set_name("FileSystem");
editor = p_editor;
path = "res://";
@@ -2523,7 +2544,6 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
tree->set_custom_minimum_size(Size2(0, 15 * EDSCALE));
split_box->add_child(tree);
- tree->connect("item_edited", this, "_favorite_toggled");
tree->connect("item_activated", this, "_tree_activate_file");
tree->connect("multi_selected", this, "_tree_multi_selected");
tree->connect("item_rmb_selected", this, "_tree_rmb_select");
@@ -2626,6 +2646,17 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
make_dir_dialog->register_text_enter(make_dir_dialog_text);
make_dir_dialog->connect("confirmed", this, "_make_dir_confirm");
+ make_scene_dialog = memnew(ConfirmationDialog);
+ make_scene_dialog->set_title(TTR("Create Scene"));
+ VBoxContainer *make_scene_dialog_vb = memnew(VBoxContainer);
+ make_scene_dialog->add_child(make_scene_dialog_vb);
+
+ make_scene_dialog_text = memnew(LineEdit);
+ make_scene_dialog_vb->add_margin_child(TTR("Name:"), make_scene_dialog_text);
+ add_child(make_scene_dialog);
+ make_scene_dialog->register_text_enter(make_scene_dialog_text);
+ make_scene_dialog->connect("confirmed", this, "_make_scene_confirm");
+
make_script_dialog_text = memnew(ScriptCreateDialog);
make_script_dialog_text->set_title(TTR("Create Script"));
add_child(make_script_dialog_text);
diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h
index 6de370ad29..49eb31e330 100644
--- a/editor/filesystem_dock.h
+++ b/editor/filesystem_dock.h
@@ -87,6 +87,7 @@ private:
FILE_INFO,
FILE_NEW_FOLDER,
FILE_NEW_SCRIPT,
+ FILE_NEW_SCENE,
FILE_SHOW_IN_EXPLORER,
FILE_COPY_PATH,
FILE_NEW_RESOURCE,
@@ -135,6 +136,8 @@ private:
LineEdit *duplicate_dialog_text;
ConfirmationDialog *make_dir_dialog;
LineEdit *make_dir_dialog_text;
+ ConfirmationDialog *make_scene_dialog;
+ LineEdit *make_scene_dialog_text;
ConfirmationDialog *overwrite_dialog;
ScriptCreateDialog *make_script_dialog_text;
CreateDialog *new_resource_dialog;
@@ -168,7 +171,7 @@ private:
bool updating_tree;
int tree_update_id;
- Tree *tree; //directories
+ Tree *tree;
ItemList *files;
bool import_dock_needs_update;
@@ -213,6 +216,7 @@ private:
void _resource_created() const;
void _make_dir_confirm();
+ void _make_scene_confirm();
void _rename_operation_confirm();
void _duplicate_operation_confirm();
void _move_with_overwrite();
@@ -246,7 +250,6 @@ private:
String name;
String path;
StringName type;
- int import_status; //0 not imported, 1 - ok, 2- must reimport, 3- broken
Vector<String> sources;
bool import_broken;
@@ -275,6 +278,7 @@ private:
bool _is_file_type_disabled_by_feature_profile(const StringName &p_class);
void _feature_profile_changed();
+ Vector<String> _remove_self_included_paths(Vector<String> selected_strings);
protected:
void _notification(int p_what);
diff --git a/editor/find_in_files.cpp b/editor/find_in_files.cpp
index cc2efb92ae..def22d07de 100644
--- a/editor/find_in_files.cpp
+++ b/editor/find_in_files.cpp
@@ -221,8 +221,8 @@ float FindInFiles::get_progress() const {
void FindInFiles::_scan_dir(String path, PoolStringArray &out_folders) {
- DirAccess *dir = DirAccess::open(path);
- if (dir == NULL) {
+ DirAccessRef dir = DirAccess::open(path);
+ if (!dir) {
print_verbose("Cannot open directory! " + path);
return;
}
@@ -253,8 +253,8 @@ void FindInFiles::_scan_dir(String path, PoolStringArray &out_folders) {
void FindInFiles::_scan_file(String fpath) {
- FileAccess *f = FileAccess::open(fpath, FileAccess::READ);
- if (f == NULL) {
+ FileAccessRef f = FileAccess::open(fpath, FileAccess::READ);
+ if (!f) {
print_verbose(String("Cannot open file ") + fpath);
return;
}
diff --git a/editor/groups_editor.cpp b/editor/groups_editor.cpp
index 5a8dc205c2..4cefb53617 100644
--- a/editor/groups_editor.cpp
+++ b/editor/groups_editor.cpp
@@ -35,12 +35,6 @@
#include "scene/gui/label.h"
#include "scene/resources/packed_scene.h"
-void GroupDialog::ok_pressed() {
-}
-
-void GroupDialog::_cancel_pressed() {
-}
-
void GroupDialog::_group_selected() {
nodes_to_add->clear();
add_node_root = nodes_to_add->create_item();
@@ -49,11 +43,14 @@ void GroupDialog::_group_selected() {
remove_node_root = nodes_to_remove->create_item();
if (!groups->is_anything_selected()) {
+ group_empty->hide();
return;
}
selected_group = groups->get_selected()->get_text(0);
_load_nodes(scene_tree->get_edited_scene_root());
+
+ group_empty->set_visible(!remove_node_root->get_children());
}
void GroupDialog::_load_nodes(Node *p_current) {
@@ -129,15 +126,26 @@ void GroupDialog::_add_pressed() {
return;
}
+ undo_redo->create_action(TTR("Add to Group"));
+
while (selected) {
Node *node = scene_tree->get_edited_scene_root()->get_node(selected->get_metadata(0));
- node->add_to_group(selected_group, true);
+ undo_redo->add_do_method(node, "add_to_group", selected_group, true);
+ undo_redo->add_undo_method(node, "remove_from_group", selected_group);
selected = nodes_to_add->get_next_selected(selected);
}
- _group_selected();
- EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor()->update_tree();
+ undo_redo->add_do_method(this, "_group_selected");
+ undo_redo->add_undo_method(this, "_group_selected");
+ undo_redo->add_do_method(this, "emit_signal", "group_edited");
+ undo_redo->add_undo_method(this, "emit_signal", "group_edited");
+
+ // To force redraw of scene tree.
+ undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree");
+ undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree");
+
+ undo_redo->commit_action();
}
void GroupDialog::_removed_pressed() {
@@ -147,15 +155,26 @@ void GroupDialog::_removed_pressed() {
return;
}
+ undo_redo->create_action(TTR("Remove from Group"));
+
while (selected) {
Node *node = scene_tree->get_edited_scene_root()->get_node(selected->get_metadata(0));
- node->remove_from_group(selected_group);
+ undo_redo->add_do_method(node, "remove_from_group", selected_group);
+ undo_redo->add_undo_method(node, "add_to_group", selected_group, true);
selected = nodes_to_add->get_next_selected(selected);
}
- _group_selected();
- EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor()->update_tree();
+ undo_redo->add_do_method(this, "_group_selected");
+ undo_redo->add_undo_method(this, "_group_selected");
+ undo_redo->add_do_method(this, "emit_signal", "group_edited");
+ undo_redo->add_undo_method(this, "emit_signal", "group_edited");
+
+ // To force redraw of scene tree.
+ undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree");
+ undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree");
+
+ undo_redo->commit_action();
}
void GroupDialog::_remove_filter_changed(const String &p_filter) {
@@ -166,11 +185,29 @@ void GroupDialog::_add_filter_changed(const String &p_filter) {
_group_selected();
}
-void GroupDialog::_add_group_pressed() {
+void GroupDialog::_add_group_pressed(const String &p_name) {
_add_group(add_group_text->get_text());
add_group_text->clear();
}
+void GroupDialog::_add_group(String p_name) {
+ if (!is_visible()) {
+ return; // No need to edit the dialog if it's not being used.
+ }
+
+ String name = p_name.strip_edges();
+ if (name == "" || groups->search_item_text(name)) {
+ return;
+ }
+
+ TreeItem *new_group = groups->create_item(groups_root);
+ new_group->set_text(0, name);
+ new_group->add_button(0, get_icon("Remove", "EditorIcons"), 0);
+ new_group->set_editable(0, true);
+ new_group->select(0);
+ groups->ensure_cursor_is_visible();
+}
+
void GroupDialog::_group_renamed() {
TreeItem *renamed_group = groups->get_edited();
if (!renamed_group) {
@@ -194,38 +231,51 @@ void GroupDialog::_group_renamed() {
return;
}
+ undo_redo->create_action(TTR("Rename Group"));
+
List<Node *> nodes;
scene_tree->get_nodes_in_group(selected_group, &nodes);
bool removed_all = true;
for (List<Node *>::Element *E = nodes.front(); E; E = E->next()) {
Node *node = E->get();
if (_can_edit(node, selected_group)) {
- node->remove_from_group(selected_group);
- node->add_to_group(name, true);
+ undo_redo->add_do_method(node, "remove_from_group", selected_group);
+ undo_redo->add_undo_method(node, "remove_from_group", name);
+ undo_redo->add_do_method(node, "add_to_group", name, true);
+ undo_redo->add_undo_method(node, "add_to_group", selected_group, true);
} else {
removed_all = false;
}
}
if (!removed_all) {
- _add_group(selected_group);
+ undo_redo->add_do_method(this, "_add_group", selected_group);
+ undo_redo->add_undo_method(this, "_delete_group_item", selected_group);
}
- selected_group = renamed_group->get_text(0);
- _group_selected();
-}
+ undo_redo->add_do_method(this, "_rename_group_item", selected_group, renamed_group->get_text(0));
+ undo_redo->add_undo_method(this, "_rename_group_item", renamed_group->get_text(0), selected_group);
+ undo_redo->add_do_method(this, "_group_selected");
+ undo_redo->add_undo_method(this, "_group_selected");
+ undo_redo->add_do_method(this, "emit_signal", "group_edited");
+ undo_redo->add_undo_method(this, "emit_signal", "group_edited");
-void GroupDialog::_add_group(String p_name) {
+ undo_redo->commit_action();
+}
- String name = p_name.strip_edges();
- if (name == "" || groups->search_item_text(name)) {
- return;
+void GroupDialog::_rename_group_item(const String &p_old_name, const String &p_new_name) {
+ if (!is_visible()) {
+ return; // No need to edit the dialog if it's not being used.
}
- TreeItem *new_group = groups->create_item(groups_root);
- new_group->set_text(0, name);
- new_group->add_button(0, get_icon("Remove", "EditorIcons"), 0);
- new_group->set_editable(0, true);
+ selected_group = p_new_name;
+
+ for (TreeItem *E = groups_root->get_children(); E; E = E->get_next()) {
+ if (E->get_text(0) == p_old_name) {
+ E->set_text(0, p_new_name);
+ return;
+ }
+ }
}
void GroupDialog::_load_groups(Node *p_current) {
@@ -251,29 +301,57 @@ void GroupDialog::_delete_group_pressed(Object *p_item, int p_column, int p_id)
String name = ti->get_text(0);
+ undo_redo->create_action(TTR("Delete Group"));
+
List<Node *> nodes;
scene_tree->get_nodes_in_group(name, &nodes);
bool removed_all = true;
for (List<Node *>::Element *E = nodes.front(); E; E = E->next()) {
if (_can_edit(E->get(), name)) {
- E->get()->remove_from_group(name);
+ undo_redo->add_do_method(E->get(), "remove_from_group", name);
+ undo_redo->add_undo_method(E->get(), "add_to_group", name, true);
} else {
removed_all = false;
}
}
if (removed_all) {
- if (selected_group == name) {
- add_filter->clear();
- remove_filter->clear();
- nodes_to_remove->clear();
- nodes_to_add->clear();
- groups->deselect_all();
- selected_group = "";
+ undo_redo->add_do_method(this, "_delete_group_item", name);
+ undo_redo->add_undo_method(this, "_add_group", name);
+ }
+
+ undo_redo->add_do_method(this, "_group_selected");
+ undo_redo->add_undo_method(this, "_group_selected");
+ undo_redo->add_do_method(this, "emit_signal", "group_edited");
+ undo_redo->add_undo_method(this, "emit_signal", "group_edited");
+
+ // To force redraw of scene tree.
+ undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree");
+ undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree");
+
+ undo_redo->commit_action();
+}
+
+void GroupDialog::_delete_group_item(const String &p_name) {
+ if (!is_visible()) {
+ return; // No need to edit the dialog if it's not being used.
+ }
+
+ if (selected_group == p_name) {
+ add_filter->clear();
+ remove_filter->clear();
+ nodes_to_remove->clear();
+ nodes_to_add->clear();
+ groups->deselect_all();
+ selected_group = "";
+ }
+
+ for (TreeItem *E = groups_root->get_children(); E; E = E->get_next()) {
+ if (E->get_text(0) == p_name) {
+ groups_root->remove_child(E);
+ return;
}
- groups_root->remove_child(ti);
}
- EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor()->update_tree();
}
void GroupDialog::_notification(int p_what) {
@@ -291,8 +369,7 @@ void GroupDialog::_notification(int p_what) {
}
void GroupDialog::edit() {
-
- popup_centered(Size2(600, 400));
+ popup_centered();
groups->clear();
groups_root = groups->create_item();
@@ -308,27 +385,32 @@ void GroupDialog::edit() {
}
void GroupDialog::_bind_methods() {
- ClassDB::bind_method("_cancel", &GroupDialog::_cancel_pressed);
-
ClassDB::bind_method("_add_pressed", &GroupDialog::_add_pressed);
ClassDB::bind_method("_removed_pressed", &GroupDialog::_removed_pressed);
ClassDB::bind_method("_delete_group_pressed", &GroupDialog::_delete_group_pressed);
+ ClassDB::bind_method("_delete_group_item", &GroupDialog::_delete_group_item);
ClassDB::bind_method("_group_selected", &GroupDialog::_group_selected);
ClassDB::bind_method("_add_group_pressed", &GroupDialog::_add_group_pressed);
+ ClassDB::bind_method("_add_group", &GroupDialog::_add_group);
ClassDB::bind_method("_add_filter_changed", &GroupDialog::_add_filter_changed);
ClassDB::bind_method("_remove_filter_changed", &GroupDialog::_remove_filter_changed);
ClassDB::bind_method("_group_renamed", &GroupDialog::_group_renamed);
+ ClassDB::bind_method("_rename_group_item", &GroupDialog::_rename_group_item);
+
+ ADD_SIGNAL(MethodInfo("group_edited"));
}
GroupDialog::GroupDialog() {
+ set_custom_minimum_size(Size2(600, 400));
scene_tree = SceneTree::get_singleton();
VBoxContainer *vbc = memnew(VBoxContainer);
add_child(vbc);
+ vbc->set_anchors_and_margins_preset(PRESET_WIDE, PRESET_MODE_KEEP_SIZE, 8 * EDSCALE);
HBoxContainer *hbc = memnew(HBoxContainer);
vbc->add_child(hbc);
@@ -345,10 +427,11 @@ GroupDialog::GroupDialog() {
groups = memnew(Tree);
vbc_left->add_child(groups);
groups->set_hide_root(true);
- groups->set_v_size_flags(SIZE_EXPAND_FILL);
groups->set_select_mode(Tree::SELECT_SINGLE);
groups->set_allow_reselect(true);
groups->set_allow_rmb_select(true);
+ groups->set_v_size_flags(SIZE_EXPAND_FILL);
+ groups->add_constant_override("draw_guides", 1);
groups->connect("item_selected", this, "_group_selected");
groups->connect("button_pressed", this, "_delete_group_pressed");
groups->connect("item_edited", this, "_group_renamed");
@@ -360,26 +443,28 @@ GroupDialog::GroupDialog() {
add_group_text = memnew(LineEdit);
chbc->add_child(add_group_text);
add_group_text->set_h_size_flags(SIZE_EXPAND_FILL);
+ add_group_text->connect("text_entered", this, "_add_group_pressed");
Button *add_group_button = memnew(Button);
add_group_button->set_text("Add");
chbc->add_child(add_group_button);
- add_group_button->connect("pressed", this, "_add_group_pressed");
+ add_group_button->connect("pressed", this, "_add_group_pressed", varray(String()));
VBoxContainer *vbc_add = memnew(VBoxContainer);
hbc->add_child(vbc_add);
vbc_add->set_h_size_flags(SIZE_EXPAND_FILL);
Label *out_of_group_title = memnew(Label);
- out_of_group_title->set_text(TTR("Nodes not in Group"));
+ out_of_group_title->set_text(TTR("Nodes Not in Group"));
vbc_add->add_child(out_of_group_title);
nodes_to_add = memnew(Tree);
vbc_add->add_child(nodes_to_add);
nodes_to_add->set_hide_root(true);
nodes_to_add->set_hide_folding(true);
- nodes_to_add->set_v_size_flags(SIZE_EXPAND_FILL);
nodes_to_add->set_select_mode(Tree::SELECT_MULTI);
+ nodes_to_add->set_v_size_flags(SIZE_EXPAND_FILL);
+ nodes_to_add->add_constant_override("draw_guides", 1);
nodes_to_add->connect("item_selected", this, "_nodes_to_add_selected");
HBoxContainer *add_filter_hbc = memnew(HBoxContainer);
@@ -426,6 +511,7 @@ GroupDialog::GroupDialog() {
nodes_to_remove->set_hide_root(true);
nodes_to_remove->set_hide_folding(true);
nodes_to_remove->set_select_mode(Tree::SELECT_MULTI);
+ nodes_to_remove->add_constant_override("draw_guides", 1);
nodes_to_remove->connect("item_selected", this, "_node_to_remove_selected");
HBoxContainer *remove_filter_hbc = memnew(HBoxContainer);
@@ -438,8 +524,15 @@ GroupDialog::GroupDialog() {
remove_filter_hbc->add_child(remove_filter);
remove_filter->connect("text_changed", this, "_remove_filter_changed");
- set_title("Group Editor");
- get_cancel()->hide();
+ group_empty = memnew(Label());
+ group_empty->set_text(TTR("Empty groups will be automatically removed."));
+ group_empty->set_valign(Label::VALIGN_CENTER);
+ group_empty->set_align(Label::ALIGN_CENTER);
+ group_empty->set_autowrap(true);
+ nodes_to_remove->add_child(group_empty);
+ group_empty->set_anchors_and_margins_preset(PRESET_WIDE, PRESET_MODE_KEEP_SIZE, 8 * EDSCALE);
+
+ set_title(TTR("Group Editor"));
set_as_toplevel(true);
set_resizable(true);
@@ -465,11 +558,13 @@ void GroupsEditor::_add_group(const String &p_group) {
undo_redo->create_action(TTR("Add to Group"));
undo_redo->add_do_method(node, "add_to_group", name, true);
- undo_redo->add_do_method(this, "update_tree");
undo_redo->add_undo_method(node, "remove_from_group", name);
+ undo_redo->add_do_method(this, "update_tree");
undo_redo->add_undo_method(this, "update_tree");
- undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); //to force redraw of scene tree
- undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); //to force redraw of scene tree
+
+ // To force redraw of scene tree.
+ undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree");
+ undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree");
undo_redo->commit_action();
@@ -490,11 +585,13 @@ void GroupsEditor::_remove_group(Object *p_item, int p_column, int p_id) {
undo_redo->create_action(TTR("Remove from Group"));
undo_redo->add_do_method(node, "remove_from_group", name);
- undo_redo->add_do_method(this, "update_tree");
undo_redo->add_undo_method(node, "add_to_group", name, true);
+ undo_redo->add_do_method(this, "update_tree");
undo_redo->add_undo_method(this, "update_tree");
- undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); //to force redraw of scene tree
- undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); //to force redraw of scene tree
+
+ // To force redraw of scene tree.
+ undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree");
+ undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree");
undo_redo->commit_action();
}
@@ -562,11 +659,9 @@ void GroupsEditor::set_current(Node *p_node) {
}
void GroupsEditor::_show_group_dialog() {
- group_dialog->edit();
-}
-void GroupsEditor::_group_dialog_closed() {
- update_tree();
+ group_dialog->edit();
+ group_dialog->set_undo_redo(undo_redo);
}
void GroupsEditor::_bind_methods() {
@@ -576,7 +671,6 @@ void GroupsEditor::_bind_methods() {
ClassDB::bind_method("update_tree", &GroupsEditor::update_tree);
ClassDB::bind_method("_show_group_dialog", &GroupsEditor::_show_group_dialog);
- ClassDB::bind_method("_group_dialog_closed", &GroupsEditor::_group_dialog_closed);
}
GroupsEditor::GroupsEditor() {
@@ -588,7 +682,7 @@ GroupsEditor::GroupsEditor() {
group_dialog = memnew(GroupDialog);
group_dialog->set_as_toplevel(true);
add_child(group_dialog);
- group_dialog->connect("popup_hide", this, "_group_dialog_closed");
+ group_dialog->connect("group_edited", this, "update_tree");
Button *group_dialog_button = memnew(Button);
group_dialog_button->set_text(TTR("Manage Groups"));
@@ -613,6 +707,7 @@ GroupsEditor::GroupsEditor() {
tree->set_v_size_flags(SIZE_EXPAND_FILL);
vbc->add_child(tree);
tree->connect("button_pressed", this, "_remove_group");
+ tree->add_constant_override("draw_guides", 1);
add_constant_override("separation", 3 * EDSCALE);
}
diff --git a/editor/groups_editor.h b/editor/groups_editor.h
index 4ffeea84e7..78ef99d5c8 100644
--- a/editor/groups_editor.h
+++ b/editor/groups_editor.h
@@ -41,13 +41,9 @@
#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
-/**
-@author Juan Linietsky <reduzio@gmail.com>
-*/
+class GroupDialog : public WindowDialog {
-class GroupDialog : public ConfirmationDialog {
-
- GDCLASS(GroupDialog, ConfirmationDialog);
+ GDCLASS(GroupDialog, WindowDialog);
ConfirmationDialog *error;
@@ -66,13 +62,15 @@ class GroupDialog : public ConfirmationDialog {
TreeItem *remove_node_root;
LineEdit *remove_filter;
+ Label *group_empty;
+
ToolButton *add_button;
ToolButton *remove_button;
String selected_group;
- void ok_pressed();
- void _cancel_pressed();
+ UndoRedo *undo_redo;
+
void _group_selected();
void _remove_filter_changed(const String &p_filter);
@@ -80,12 +78,14 @@ class GroupDialog : public ConfirmationDialog {
void _add_pressed();
void _removed_pressed();
- void _add_group_pressed();
+ void _add_group_pressed(const String &p_name);
void _group_renamed();
+ void _rename_group_item(const String &p_old_name, const String &p_new_name);
void _add_group(String p_name);
void _delete_group_pressed(Object *p_item, int p_column, int p_id);
+ void _delete_group_item(const String &p_name);
bool _can_edit(Node *p_node, String p_group);
@@ -98,6 +98,7 @@ protected:
public:
void edit();
+ void set_undo_redo(UndoRedo *p_undoredo) { undo_redo = p_undoredo; }
GroupDialog();
};
@@ -122,7 +123,6 @@ class GroupsEditor : public VBoxContainer {
void _close();
void _show_group_dialog();
- void _group_dialog_closed();
protected:
static void _bind_methods();
diff --git a/editor/icons/icon_auto_key.svg b/editor/icons/icon_auto_key.svg
index cbafe1ac38..3d5569397f 100644
--- a/editor/icons/icon_auto_key.svg
+++ b/editor/icons/icon_auto_key.svg
@@ -1,56 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="16"
- height="16"
- version="1.1"
- viewBox="0 0 16 16"
- id="svg6"
- sodipodi:docname="icon_auto_key.svg"
- inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
- <metadata
- id="metadata12">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <defs
- id="defs10" />
- <sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="1854"
- inkscape:window-height="1016"
- id="namedview8"
- showgrid="false"
- inkscape:zoom="10.429825"
- inkscape:cx="10.199345"
- inkscape:cy="-4.0344119"
- inkscape:window-x="66"
- inkscape:window-y="27"
- inkscape:window-maximized="1"
- inkscape:current-layer="svg6" />
- <path
- style="fill:#e0e0e0;fill-opacity:1;stroke-width:0.0333107"
- d="M 3.5469681,13.426786 C 2.7965829,13.263778 2.2774312,12.503915 2.4037297,11.753472 c 0.1081234,-0.642451 0.6006808,-1.135008 1.2431317,-1.243131 0.9667125,-0.162696 1.8555225,0.726112 1.6928259,1.692826 -0.103766,0.616558 -0.5592173,1.098057 -1.1588427,1.225117 -0.2719576,0.05763 -0.3626872,0.05741 -0.6338765,-0.0014 z m 8.0861339,-0.08275 c -0.746862,-0.13829 -1.23937,-0.720718 -1.23937,-1.465649 0,-0.527377 0.244831,-0.978806 0.679757,-1.253362 0.471386,-0.297574 1.114188,-0.297574 1.585574,0 0.682727,0.430986 0.892336,1.362194 0.460575,2.046149 -0.307786,0.487563 -0.940521,0.773963 -1.486536,0.672862 z M 0.60726032,9.8305658 V 7.7161233 L 1.1770842,7.7070075 1.7469079,7.6978939 3.1889882,5.1995916 4.6310686,2.7012893 h 3.1726318 3.1726316 l 1.442755,2.4983023 1.442755,2.4983023 0.651097,0.00903 0.651096,0.00903 v 2.1145264 2.1145257 h -0.566282 -0.566281 v -0.161225 c 0,-0.234927 -0.113135,-0.639704 -0.255664,-0.914727 -0.16895,-0.326004 -0.574198,-0.731251 -0.900202,-0.9002019 -0.656732,-0.3403483 -1.428549,-0.3403483 -2.085281,0 -0.326004,0.1689519 -0.731252,0.5741989 -0.9002019,0.9002029 -0.1425297,0.275023 -0.2556639,0.6798 -0.2556639,0.914727 v 0.161225 H 7.8570969 6.0797346 L 6.0617736,11.686851 C 6.006289,10.889347 5.447548,10.170679 4.6603773,9.884336 4.4466221,9.8065798 4.3737631,9.797427 3.9716406,9.7978134 3.5871254,9.7981885 3.4905638,9.809405 3.3054265,9.8752358 2.5067319,10.159236 1.9362359,10.884501 1.8813215,11.68568 l -0.017772,0.259329 H 1.2354063 0.60726287 Z M 12.399247,7.7466889 c 0,-0.037287 -0.02623,-0.1073444 -0.0583,-0.1556843 -0.03206,-0.04834 -0.561225,-0.958444 -1.17592,-2.0224529 L 10.047407,3.6339894 7.6977565,3.6254406 C 5.4917229,3.6174174 5.3450379,3.6204563 5.2979001,3.6754094 5.1898818,3.8013046 2.9723198,7.6840061 2.9723198,7.7472381 c 0,0.067139 0.00758,0.067247 4.7134636,0.067247 h 4.7134636 z"
- id="path6243"
- inkscape:connector-curvature="0" />
-</svg>
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m5 3-3 5h-1v4h1.0507812a2.5 2.5 0 0 1 2.4492188-2 2.5 2.5 0 0 1 2.4453125 2h2.1054687a2.5 2.5 0 0 1 2.4492188-2 2.5 2.5 0 0 1 2.445312 2h1.054688v-4h-1l-4-5zm1 1h3l3 4h-8z" stroke-width=".033311"/><circle cx="4.5" cy="12.5" r="1.5"/><circle cx="11.5" cy="12.5" r="1.5"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_curve_handle.svg b/editor/icons/icon_editor_curve_handle.svg
new file mode 100644
index 0000000000..c405ceab9d
--- /dev/null
+++ b/editor/icons/icon_editor_curve_handle.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" fill="#fefefe" r="2.75" stroke="#000" stroke-linecap="square"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_path_sharp_handle.svg b/editor/icons/icon_editor_path_sharp_handle.svg
new file mode 100644
index 0000000000..db160dfeae
--- /dev/null
+++ b/editor/icons/icon_editor_path_sharp_handle.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m-3.035534-10.106602h6.071068v6.071068h-6.071068z" fill="#fefefe" stroke="#000" stroke-linecap="square" transform="matrix(-.70710678 .70710678 -.70710678 -.70710678 0 0)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_path_smooth_handle.svg b/editor/icons/icon_editor_path_smooth_handle.svg
new file mode 100644
index 0000000000..34f3d290bd
--- /dev/null
+++ b/editor/icons/icon_editor_path_smooth_handle.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m1.5-8.5h7v7h-7z" fill="#fefefe" stroke="#000" stroke-linecap="square" transform="rotate(90)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_ruler.svg b/editor/icons/icon_ruler.svg
new file mode 100644
index 0000000000..a16eda000b
--- /dev/null
+++ b/editor/icons/icon_ruler.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 4.2333 4.2333" xmlns="http://www.w3.org/2000/svg">
+<g transform="translate(0 -292.77)">
+<path transform="matrix(.26458 0 0 .26458 0 292.77)" d="m1 1v7.5 6.5h14l-14-14zm3 7 4 4h-4v-4z" fill="#e0e0e0"/>
+</g>
+</svg>
diff --git a/editor/icons/icon_timeline_indicator.svg b/editor/icons/icon_timeline_indicator.svg
new file mode 100644
index 0000000000..fd18192705
--- /dev/null
+++ b/editor/icons/icon_timeline_indicator.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 0h10l-4 4h-2z" fill="#fefefe"/></svg> \ No newline at end of file
diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp
index 1c4a8c43a9..449124acec 100644
--- a/editor/import/editor_import_collada.cpp
+++ b/editor/import/editor_import_collada.cpp
@@ -692,16 +692,6 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
pre_weights[w_i] = weights;
- /*
- for(Set<int>::Element *E=vertex_map[w_i].front();E;E=E->next()) {
-
- int dst = E->get();
- ERR_EXPLAIN("invalid vertex index in array");
- ERR_FAIL_INDEX_V(dst,vertex_array.size(),ERR_INVALID_DATA);
- vertex_array[dst].weights=weights;
-
- }*/
-
index_ofs += wstride * amount;
}
@@ -711,7 +701,6 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
Set<Collada::Vertex> vertex_set; //vertex set will be the vertices
List<int> indices_list; //indices will be the indices
- //Map<int,Set<int> > vertex_map; //map vertices (for setting skinning/morph)
/**************************/
/* CREATE PRIMITIVE ARRAY */
@@ -834,9 +823,6 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
vertex_set.insert(vertex);
}
- /* if (!vertex_map.has(vertex_index))
- vertex_map[vertex_index]=Set<int>();
- vertex_map[vertex_index].insert(index); //should be outside..*/
//build triangles if needed
if (j == 0)
prev2[0] = index;
@@ -1204,10 +1190,7 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres
}
}
- if (ngsource != "") {
- ERR_EXPLAIN("Controller Instance Source '" + ngsource + "' is neither skin or morph!");
- ERR_FAIL_V(ERR_INVALID_DATA);
- }
+ ERR_FAIL_COND_V_MSG(ngsource != "", ERR_INVALID_DATA, "Controller instance source '" + ngsource + "' is neither skin or morph!");
} else {
meshid = ng2->source;
@@ -1608,7 +1591,7 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
}
if (xform_idx == -1) {
- WARN_PRINTS("Collada: Couldn't find matching node " + at.target + " xform for track " + at.param);
+ WARN_PRINTS("Collada: Couldn't find matching node " + at.target + " xform for track " + at.param + ".");
continue;
}
@@ -1630,8 +1613,7 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
} else if (data.size() == xf.data.size()) {
xf.data = data;
} else {
- ERR_EXPLAIN("Component " + at.component + " has datasize " + itos(data.size()) + ", xfdatasize " + itos(xf.data.size()));
- ERR_CONTINUE(data.size() != xf.data.size());
+ ERR_CONTINUE_MSG(data.size() != xf.data.size(), "Component " + at.component + " has datasize " + itos(data.size()) + ", xfdatasize " + itos(xf.data.size()) + ".");
}
}
diff --git a/editor/import/editor_scene_importer_gltf.cpp b/editor/import/editor_scene_importer_gltf.cpp
index c9c5b3818f..9ea7c86e0c 100644
--- a/editor/import/editor_scene_importer_gltf.cpp
+++ b/editor/import/editor_scene_importer_gltf.cpp
@@ -29,8 +29,8 @@
/*************************************************************************/
#include "editor_scene_importer_gltf.h"
+#include "core/crypto/crypto_core.h"
#include "core/io/json.h"
-#include "core/math/crypto_core.h"
#include "core/math/math_defs.h"
#include "core/os/file_access.h"
#include "core/os/os.h"
@@ -1544,8 +1544,7 @@ Error EditorSceneImporterGLTF::_parse_cameras(GLTFState &state) {
camera.fov_size = 10;
}
} else {
- ERR_EXPLAIN("Camera should be in 'orthographic' or 'perspective'");
- ERR_FAIL_V(ERR_PARSE_ERROR);
+ ERR_FAIL_V_MSG(ERR_PARSE_ERROR, "Camera should be in 'orthographic' or 'perspective'");
}
state.cameras.push_back(camera);
diff --git a/editor/import/resource_importer_csv_translation.cpp b/editor/import/resource_importer_csv_translation.cpp
index cfcdbc8de4..301422a25a 100644
--- a/editor/import/resource_importer_csv_translation.cpp
+++ b/editor/import/resource_importer_csv_translation.cpp
@@ -101,8 +101,7 @@ Error ResourceImporterCSVTranslation::import(const String &p_source_file, const
for (int i = 1; i < line.size(); i++) {
String locale = line[i];
- ERR_EXPLAIN("Error importing CSV translation: '" + locale + "' is not a valid locale");
- ERR_FAIL_COND_V(!TranslationServer::is_locale_valid(locale), ERR_PARSE_ERROR);
+ ERR_FAIL_COND_V_MSG(!TranslationServer::is_locale_valid(locale), ERR_PARSE_ERROR, "Error importing CSV translation: '" + locale + "' is not a valid locale.");
locales.push_back(locale);
Ref<Translation> translation;
diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp
index 868f67fd77..9061c92f6e 100644
--- a/editor/import/resource_importer_obj.cpp
+++ b/editor/import/resource_importer_obj.cpp
@@ -45,8 +45,7 @@ uint32_t EditorOBJImporter::get_import_flags() const {
static Error _parse_material_library(const String &p_path, Map<String, Ref<SpatialMaterial> > &material_map, List<String> *r_missing_deps) {
FileAccessRef f = FileAccess::open(p_path, FileAccess::READ);
- ERR_EXPLAIN(vformat("Couldn't open MTL file '%s', it may not exist or not be readable.", p_path));
- ERR_FAIL_COND_V(!f, ERR_CANT_OPEN);
+ ERR_FAIL_COND_V_MSG(!f, ERR_CANT_OPEN, vformat("Couldn't open MTL file '%s', it may not exist or not be readable.", p_path));
Ref<SpatialMaterial> current;
String current_name;
@@ -207,8 +206,7 @@ static Error _parse_material_library(const String &p_path, Map<String, Ref<Spati
static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p_single_mesh, bool p_generate_tangents, bool p_optimize, Vector3 p_scale_mesh, List<String> *r_missing_deps) {
FileAccessRef f = FileAccess::open(p_path, FileAccess::READ);
- ERR_EXPLAIN(vformat("Couldn't open OBJ file '%s', it may not exist or not be readable.", p_path));
- ERR_FAIL_COND_V(!f, ERR_CANT_OPEN);
+ ERR_FAIL_COND_V_MSG(!f, ERR_CANT_OPEN, vformat("Couldn't open OBJ file '%s', it may not exist or not be readable.", p_path));
Ref<ArrayMesh> mesh;
mesh.instance();
diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp
index 8e6a56a929..64994e21b0 100644
--- a/editor/import/resource_importer_scene.cpp
+++ b/editor/import/resource_importer_scene.cpp
@@ -960,7 +960,7 @@ void ResourceImporterScene::_find_meshes(Node *p_node, Map<Ref<ArrayMesh>, Trans
}
}
-void ResourceImporterScene::_make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_keep_animations, bool p_make_materials, bool p_keep_materials, bool p_make_meshes, Map<Ref<Animation>, Ref<Animation> > &p_animations, Map<Ref<Material>, Ref<Material> > &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh> > &p_meshes) {
+void ResourceImporterScene::_make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_animations_as_text, bool p_keep_animations, bool p_make_materials, bool p_materials_as_text, bool p_keep_materials, bool p_make_meshes, bool p_meshes_as_text, Map<Ref<Animation>, Ref<Animation> > &p_animations, Map<Ref<Material>, Ref<Material> > &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh> > &p_meshes) {
List<PropertyInfo> pi;
@@ -982,7 +982,14 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
anim->track_set_imported(i, true);
}
- String ext_name = p_base_path.plus_file(_make_extname(E->get()) + ".anim");
+ String ext_name;
+
+ if (p_animations_as_text) {
+ ext_name = p_base_path.plus_file(_make_extname(E->get()) + ".tres");
+ } else {
+ ext_name = p_base_path.plus_file(_make_extname(E->get()) + ".anim");
+ }
+
if (FileAccess::exists(ext_name) && p_keep_animations) {
//try to keep custom animation tracks
Ref<Animation> old_anim = ResourceLoader::load(ext_name, "Animation", true);
@@ -1017,7 +1024,14 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
if (!p_materials.has(mat)) {
- String ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".material");
+ String ext_name;
+
+ if (p_materials_as_text) {
+ ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".tres");
+ } else {
+ ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".material");
+ }
+
if (p_keep_materials && FileAccess::exists(ext_name)) {
//if exists, use it
p_materials[mat] = ResourceLoader::load(ext_name);
@@ -1045,7 +1059,13 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
if (!p_meshes.has(mesh)) {
//meshes are always overwritten, keeping them is not practical
- String ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".mesh");
+ String ext_name;
+
+ if (p_meshes_as_text) {
+ ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".tres");
+ } else {
+ ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".mesh");
+ }
ResourceSaver::save(ext_name, mesh, ResourceSaver::FLAG_CHANGE_PATH);
p_meshes[mesh] = ResourceLoader::load(ext_name);
@@ -1067,9 +1087,14 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
continue;
if (!p_materials.has(mat)) {
+ String ext_name;
+
+ if (p_materials_as_text) {
+ ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".tres");
+ } else {
+ ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".material");
+ }
- String ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".material");
- ;
if (p_keep_materials && FileAccess::exists(ext_name)) {
//if exists, use it
p_materials[mat] = ResourceLoader::load(ext_name);
@@ -1086,7 +1111,15 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
//re-save the mesh since a material is now assigned
if (p_make_meshes) {
- String ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".mesh");
+
+ String ext_name;
+
+ if (p_meshes_as_text) {
+ ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".tres");
+ } else {
+ ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".mesh");
+ }
+
ResourceSaver::save(ext_name, mesh, ResourceSaver::FLAG_CHANGE_PATH);
p_meshes[mesh] = ResourceLoader::load(ext_name);
}
@@ -1105,7 +1138,7 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
for (int i = 0; i < p_node->get_child_count(); i++) {
- _make_external_resources(p_node->get_child(i), p_base_path, p_make_animations, p_keep_animations, p_make_materials, p_keep_materials, p_make_meshes, p_animations, p_materials, p_meshes);
+ _make_external_resources(p_node->get_child(i), p_base_path, p_make_animations, p_animations_as_text, p_keep_animations, p_make_materials, p_materials_as_text, p_keep_materials, p_make_meshes, p_meshes_as_text, p_animations, p_materials, p_meshes);
}
}
@@ -1134,18 +1167,18 @@ void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, in
r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "nodes/custom_script", PROPERTY_HINT_FILE, script_ext_hint), ""));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "nodes/storage", PROPERTY_HINT_ENUM, "Single Scene,Instanced Sub-Scenes"), scenes_out ? 1 : 0));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "materials/location", PROPERTY_HINT_ENUM, "Node,Mesh"), (meshes_out || materials_out) ? 1 : 0));
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "materials/storage", PROPERTY_HINT_ENUM, "Built-In,Files", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), materials_out ? 1 : 0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "materials/storage", PROPERTY_HINT_ENUM, "Built-In,Files (.material),Files (.tres)", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), materials_out ? 1 : 0));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "materials/keep_on_reimport"), materials_out));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "meshes/compress"), true));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "meshes/ensure_tangents"), true));
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/storage", PROPERTY_HINT_ENUM, "Built-In,Files"), meshes_out ? 1 : 0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/storage", PROPERTY_HINT_ENUM, "Built-In,Files (.mesh),Files (.tres)"), meshes_out ? 1 : 0));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/light_baking", PROPERTY_HINT_ENUM, "Disabled,Enable,Gen Lightmaps", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 0));
r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "meshes/lightmap_texel_size", PROPERTY_HINT_RANGE, "0.001,100,0.001"), 0.1));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "external_files/store_in_subdir"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/import", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true));
r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "animation/fps", PROPERTY_HINT_RANGE, "1,120,1"), 15));
r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "animation/filter_script", PROPERTY_HINT_MULTILINE_TEXT), ""));
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/storage", PROPERTY_HINT_ENUM, "Built-In,Files", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), animations_out));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/storage", PROPERTY_HINT_ENUM, "Built-In,Files (.anim),Files (.tres)"), animations_out ? true : false));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/keep_custom_tracks"), animations_out));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/optimizer/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true));
r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "animation/optimizer/max_linear_error"), 0.05));
@@ -1367,10 +1400,13 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
_filter_tracks(scene, animation_filter);
}
- bool external_animations = int(p_options["animation/storage"]) == 1;
+ bool external_animations = int(p_options["animation/storage"]) == 1 || int(p_options["animation/storage"]) == 2;
+ bool external_animations_as_text = int(p_options["animation/storage"]) == 2;
bool keep_custom_tracks = p_options["animation/keep_custom_tracks"];
- bool external_materials = p_options["materials/storage"];
- bool external_meshes = p_options["meshes/storage"];
+ bool external_materials = int(p_options["materials/storage"]) == 1 || int(p_options["materials/storage"]) == 2;
+ bool external_materials_as_text = int(p_options["materials/storage"]) == 2;
+ bool external_meshes = int(p_options["meshes/storage"]) == 1 || int(p_options["meshes/storage"]) == 2;
+ bool external_meshes_as_text = int(p_options["meshes/storage"]) == 2;
bool external_scenes = int(p_options["nodes/storage"]) == 1;
String base_path = p_source_file.get_base_dir();
@@ -1425,7 +1461,7 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
bool keep_materials = bool(p_options["materials/keep_on_reimport"]);
- _make_external_resources(scene, base_path, external_animations, keep_custom_tracks, external_materials, keep_materials, external_meshes, anim_map, mat_map, mesh_map);
+ _make_external_resources(scene, base_path, external_animations, external_animations_as_text, keep_custom_tracks, external_materials, external_materials_as_text, keep_materials, external_meshes, external_meshes_as_text, anim_map, mat_map, mesh_map);
}
progress.step(TTR("Running Custom Script..."), 2);
diff --git a/editor/import/resource_importer_scene.h b/editor/import/resource_importer_scene.h
index 498e0f6fb8..ef9a77917f 100644
--- a/editor/import/resource_importer_scene.h
+++ b/editor/import/resource_importer_scene.h
@@ -144,7 +144,7 @@ public:
void _find_meshes(Node *p_node, Map<Ref<ArrayMesh>, Transform> &meshes);
- void _make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_keep_animations, bool p_make_materials, bool p_keep_materials, bool p_make_meshes, Map<Ref<Animation>, Ref<Animation> > &p_animations, Map<Ref<Material>, Ref<Material> > &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh> > &p_meshes);
+ void _make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_animations_as_text, bool p_keep_animations, bool p_make_materials, bool p_materials_as_text, bool p_keep_materials, bool p_make_meshes, bool p_meshes_as_text, Map<Ref<Animation>, Ref<Animation> > &p_animations, Map<Ref<Material>, Ref<Material> > &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh> > &p_meshes);
Node *_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>, List<Ref<Shape> > > &collision_map, LightBakeMode p_light_bake_mode);
diff --git a/editor/import/resource_importer_wav.cpp b/editor/import/resource_importer_wav.cpp
index d267b29224..f1de71e25e 100644
--- a/editor/import/resource_importer_wav.cpp
+++ b/editor/import/resource_importer_wav.cpp
@@ -83,8 +83,8 @@ void ResourceImporterWAV::get_import_options(List<ImportOption> *r_options, int
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "force/mono"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "force/max_rate", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "force/max_rate_hz", PROPERTY_HINT_EXP_RANGE, "11025,192000,1"), 44100));
- r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "edit/trim"), true));
- r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "edit/normalize"), true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "edit/trim"), false));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "edit/normalize"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "edit/loop"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/mode", PROPERTY_HINT_ENUM, "Disabled,RAM (Ima-ADPCM)"), 0));
}
@@ -123,8 +123,7 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
file->close();
memdelete(file);
- ERR_EXPLAIN("Not a WAV file (no WAVE RIFF Header)");
- ERR_FAIL_V(ERR_FILE_UNRECOGNIZED);
+ ERR_FAIL_V_MSG(ERR_FILE_UNRECOGNIZED, "Not a WAV file (no WAVE RIFF header).");
}
int format_bits = 0;
@@ -166,16 +165,14 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
if (compression_code != 1 && compression_code != 3) {
file->close();
memdelete(file);
- ERR_EXPLAIN("Format not supported for WAVE file (not PCM). Save WAVE files as uncompressed PCM instead.");
- ERR_FAIL_V(ERR_INVALID_DATA);
+ ERR_FAIL_V_MSG(ERR_INVALID_DATA, "Format not supported for WAVE file (not PCM). Save WAVE files as uncompressed PCM instead.");
}
format_channels = file->get_16();
if (format_channels != 1 && format_channels != 2) {
file->close();
memdelete(file);
- ERR_EXPLAIN("Format not supported for WAVE file (not stereo or mono).");
- ERR_FAIL_V(ERR_INVALID_DATA);
+ ERR_FAIL_V_MSG(ERR_INVALID_DATA, "Format not supported for WAVE file (not stereo or mono).");
}
format_freq = file->get_32(); //sampling rate
@@ -187,8 +184,7 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
if (format_bits % 8 || format_bits == 0) {
file->close();
memdelete(file);
- ERR_EXPLAIN("Invalid amount of bits in the sample (should be one of 8, 16, 24 or 32).");
- ERR_FAIL_V(ERR_INVALID_DATA);
+ ERR_FAIL_V_MSG(ERR_INVALID_DATA, "Invalid amount of bits in the sample (should be one of 8, 16, 24 or 32).");
}
/* Don't need anything else, continue */
@@ -258,8 +254,7 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
if (file->eof_reached()) {
file->close();
memdelete(file);
- ERR_EXPLAIN("Premature end of file.");
- ERR_FAIL_V(ERR_FILE_CORRUPT);
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Premature end of file.");
}
}
diff --git a/editor/node_dock.cpp b/editor/node_dock.cpp
index 1c0151ed0a..d6df3bd369 100644
--- a/editor/node_dock.cpp
+++ b/editor/node_dock.cpp
@@ -56,10 +56,7 @@ void NodeDock::_bind_methods() {
void NodeDock::_notification(int p_what) {
- if (p_what == NOTIFICATION_ENTER_TREE) {
- connections_button->set_icon(get_icon("Signals", "EditorIcons"));
- groups_button->set_icon(get_icon("Groups", "EditorIcons"));
- } else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
+ if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
connections_button->set_icon(get_icon("Signals", "EditorIcons"));
groups_button->set_icon(get_icon("Groups", "EditorIcons"));
}
@@ -131,7 +128,7 @@ NodeDock::NodeDock() {
groups->hide();
select_a_node = memnew(Label);
- select_a_node->set_text(TTR("Select a Node to edit Signals and Groups."));
+ select_a_node->set_text(TTR("Select a single node to edit its signals and groups."));
select_a_node->set_v_size_flags(SIZE_EXPAND_FILL);
select_a_node->set_valign(Label::VALIGN_CENTER);
select_a_node->set_align(Label::ALIGN_CENTER);
diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp
index 574b47d770..7f023af848 100644
--- a/editor/plugins/abstract_polygon_2d_editor.cpp
+++ b/editor/plugins/abstract_polygon_2d_editor.cpp
@@ -571,7 +571,8 @@ void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overl
return;
Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform();
- const Ref<Texture> handle = get_icon("EditorHandle", "EditorIcons");
+ // All polygon points are sharp, so use the sharp handle icon
+ const Ref<Texture> handle = get_icon("EditorPathSharpHandle", "EditorIcons");
const Vertex active_point = get_active_point();
const int n_polygons = _get_polygon_count();
diff --git a/editor/plugins/abstract_polygon_2d_editor.h b/editor/plugins/abstract_polygon_2d_editor.h
index 97244fa4e9..a00cdd0cf6 100644
--- a/editor/plugins/abstract_polygon_2d_editor.h
+++ b/editor/plugins/abstract_polygon_2d_editor.h
@@ -36,9 +36,6 @@
#include "scene/2d/polygon_2d.h"
#include "scene/gui/tool_button.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class CanvasItemEditor;
class AbstractPolygon2DEditor : public HBoxContainer {
diff --git a/editor/plugins/animation_blend_space_2d_editor.h b/editor/plugins/animation_blend_space_2d_editor.h
index 74186791e1..850a6201bb 100644
--- a/editor/plugins/animation_blend_space_2d_editor.h
+++ b/editor/plugins/animation_blend_space_2d_editor.h
@@ -40,9 +40,6 @@
#include "scene/gui/graph_edit.h"
#include "scene/gui/popup.h"
#include "scene/gui/tree.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class AnimationNodeBlendSpace2DEditor : public AnimationTreeNodeEditorPlugin {
diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp
index 574f906cfa..235c204265 100644
--- a/editor/plugins/animation_blend_tree_editor_plugin.cpp
+++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -249,6 +249,7 @@ void AnimationNodeBlendTreeEditor::_update_graph() {
node->add_color_override("title_color", c);
c.a = 0.7;
node->add_color_override("close_color", c);
+ node->add_color_override("resizer_color", c);
}
}
diff --git a/editor/plugins/animation_blend_tree_editor_plugin.h b/editor/plugins/animation_blend_tree_editor_plugin.h
index cb40159a40..77b57a50d0 100644
--- a/editor/plugins/animation_blend_tree_editor_plugin.h
+++ b/editor/plugins/animation_blend_tree_editor_plugin.h
@@ -40,9 +40,6 @@
#include "scene/gui/graph_edit.h"
#include "scene/gui/popup.h"
#include "scene/gui/tree.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class AnimationNodeBlendTreeEditor : public AnimationTreeNodeEditorPlugin {
diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp
index f42716c827..173079b6de 100644
--- a/editor/plugins/animation_player_editor_plugin.cpp
+++ b/editor/plugins/animation_player_editor_plugin.cpp
@@ -477,6 +477,19 @@ void AnimationPlayerEditor::_select_anim_by_name(const String &p_anim) {
_animation_selected(idx);
}
+double AnimationPlayerEditor::_get_editor_step() const {
+
+ // Returns the effective snapping value depending on snapping modifiers, or 0 if snapping is disabled.
+ if (track_editor->is_snap_enabled()) {
+ const String current = player->get_assigned_animation();
+ const Ref<Animation> anim = player->get_animation(current);
+ // Use more precise snapping when holding Shift
+ return Input::get_singleton()->is_key_pressed(KEY_SHIFT) ? anim->get_step() * 0.25 : anim->get_step();
+ }
+
+ return 0.0;
+}
+
void AnimationPlayerEditor::_animation_name_edited() {
player->stop();
@@ -1017,7 +1030,7 @@ void AnimationPlayerEditor::_seek_value_changed(float p_value, bool p_set) {
float pos = CLAMP(anim->get_length() * (p_value / frame->get_max()), 0, anim->get_length());
if (track_editor->is_snap_enabled()) {
- pos = Math::stepify(pos, anim->get_step());
+ pos = Math::stepify(pos, _get_editor_step());
}
if (player->is_valid() && !p_set) {
@@ -1068,7 +1081,7 @@ void AnimationPlayerEditor::_animation_key_editor_seek(float p_pos, bool p_drag)
Ref<Animation> anim = player->get_animation(player->get_assigned_animation());
updating = true;
- frame->set_value(Math::stepify(p_pos, track_editor->is_snap_enabled() ? anim->get_step() : 0));
+ frame->set_value(Math::stepify(p_pos, _get_editor_step()));
updating = false;
_seek_value_changed(p_pos, !p_drag);
diff --git a/editor/plugins/animation_player_editor_plugin.h b/editor/plugins/animation_player_editor_plugin.h
index 22152fa8f4..4ad30675ec 100644
--- a/editor/plugins/animation_player_editor_plugin.h
+++ b/editor/plugins/animation_player_editor_plugin.h
@@ -39,9 +39,6 @@
#include "scene/gui/spin_box.h"
#include "scene/gui/texture_button.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class AnimationTrackEditor;
class AnimationPlayerEditorPlugin;
@@ -164,6 +161,7 @@ class AnimationPlayerEditor : public VBoxContainer {
} onion;
void _select_anim_by_name(const String &p_anim);
+ double _get_editor_step() const;
void _play_pressed();
void _play_from_pressed();
void _play_bw_pressed();
diff --git a/editor/plugins/animation_tree_player_editor_plugin.h b/editor/plugins/animation_tree_player_editor_plugin.h
index f4bfe58909..03bc559b86 100644
--- a/editor/plugins/animation_tree_player_editor_plugin.h
+++ b/editor/plugins/animation_tree_player_editor_plugin.h
@@ -38,9 +38,6 @@
#include "scene/gui/button.h"
#include "scene/gui/popup.h"
#include "scene/gui/tree.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class AnimationTreePlayerEditor : public Control {
diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp
index 5679426eb5..60b5f017d2 100644
--- a/editor/plugins/asset_library_editor_plugin.cpp
+++ b/editor/plugins/asset_library_editor_plugin.cpp
@@ -101,7 +101,7 @@ EditorAssetLibraryItem::EditorAssetLibraryItem() {
add_style_override("panel", border);
HBoxContainer *hb = memnew(HBoxContainer);
- // Add some spacing to visually separate the icon from the asset details
+ // Add some spacing to visually separate the icon from the asset details.
hb->add_constant_override("separation", 15 * EDSCALE);
add_child(hb);
@@ -118,25 +118,21 @@ EditorAssetLibraryItem::EditorAssetLibraryItem() {
vb->set_h_size_flags(SIZE_EXPAND_FILL);
title = memnew(LinkButton);
- title->set_text("My Awesome Addon");
title->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
title->connect("pressed", this, "_asset_clicked");
vb->add_child(title);
category = memnew(LinkButton);
- category->set_text("Editor Tools");
category->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
category->connect("pressed", this, "_category_clicked");
vb->add_child(category);
author = memnew(LinkButton);
- author->set_text("Johny Tolengo");
author->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
author->connect("pressed", this, "_author_clicked");
vb->add_child(author);
price = memnew(Label);
- price->set_text(TTR("Free"));
vb->add_child(price);
set_custom_minimum_size(Size2(250, 100) * EDSCALE);
@@ -200,14 +196,15 @@ void EditorAssetLibraryItemDescription::set_image(int p_type, int p_index, const
} break;
}
}
+
void EditorAssetLibraryItemDescription::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
previews_bg->add_style_override("panel", get_stylebox("normal", "TextEdit"));
- desc_bg->add_style_override("panel", get_stylebox("normal", "TextEdit"));
} break;
}
}
+
void EditorAssetLibraryItemDescription::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_image"), &EditorAssetLibraryItemDescription::set_image);
ClassDB::bind_method(D_METHOD("_link_click"), &EditorAssetLibraryItemDescription::_link_click);
@@ -270,20 +267,16 @@ void EditorAssetLibraryItemDescription::add_preview(int p_id, bool p_video, cons
if (!p_video) {
preview.image = get_icon("ThumbnailWait", "EditorIcons");
}
- if (preview_images.size() == 0 && !p_video) {
+ preview_images.push_back(preview);
+ if (preview_images.size() == 1 && !p_video) {
_preview_click(p_id);
}
- preview_images.push_back(preview);
}
EditorAssetLibraryItemDescription::EditorAssetLibraryItemDescription() {
- VBoxContainer *vbox = memnew(VBoxContainer);
- add_child(vbox);
-
HBoxContainer *hbox = memnew(HBoxContainer);
- vbox->add_child(hbox);
- vbox->add_constant_override("separation", 15 * EDSCALE);
+ add_child(hbox);
VBoxContainer *desc_vbox = memnew(VBoxContainer);
hbox->add_child(desc_vbox);
hbox->add_constant_override("separation", 15 * EDSCALE);
@@ -291,24 +284,24 @@ EditorAssetLibraryItemDescription::EditorAssetLibraryItemDescription() {
item = memnew(EditorAssetLibraryItem);
desc_vbox->add_child(item);
- desc_vbox->set_custom_minimum_size(Size2(300 * EDSCALE, 0));
-
- desc_bg = memnew(PanelContainer);
- desc_vbox->add_child(desc_bg);
- desc_bg->set_v_size_flags(SIZE_EXPAND_FILL);
+ desc_vbox->set_custom_minimum_size(Size2(440 * EDSCALE, 0));
description = memnew(RichTextLabel);
+ desc_vbox->add_child(description);
+ description->set_v_size_flags(SIZE_EXPAND_FILL);
description->connect("meta_clicked", this, "_link_click");
- description->set_custom_minimum_size(Size2(440 * EDSCALE, 300 * EDSCALE));
- desc_bg->add_child(description);
+ description->add_constant_override("line_separation", Math::round(5 * EDSCALE));
VBoxContainer *previews_vbox = memnew(VBoxContainer);
hbox->add_child(previews_vbox);
previews_vbox->add_constant_override("separation", 15 * EDSCALE);
+ previews_vbox->set_v_size_flags(SIZE_EXPAND_FILL);
preview = memnew(TextureRect);
- preview->set_custom_minimum_size(Size2(640 * EDSCALE, 345 * EDSCALE));
previews_vbox->add_child(preview);
+ preview->set_expand(true);
+ preview->set_stretch_mode(TextureRect::STRETCH_KEEP_ASPECT_CENTERED);
+ preview->set_custom_minimum_size(Size2(640 * EDSCALE, 345 * EDSCALE));
previews_bg = memnew(PanelContainer);
previews_vbox->add_child(previews_bg);
@@ -392,7 +385,7 @@ void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int
install->set_disabled(false);
status->set_text(TTR("Success!"));
- // Make the progress bar invisible but don't reflow other Controls around it
+ // Make the progress bar invisible but don't reflow other Controls around it.
progress->set_modulate(Color(0, 0, 0, 0));
set_process(false);
@@ -404,7 +397,7 @@ void EditorAssetLibraryItemDownload::configure(const String &p_title, int p_asse
icon->set_texture(p_preview);
asset_id = p_asset_id;
if (!p_preview.is_valid())
- icon->set_texture(get_icon("DefaultProjectIcon", "EditorIcons"));
+ icon->set_texture(get_icon("FileBrokenBigThumb", "EditorIcons"));
host = p_download_url;
sha256 = p_sha256_hash;
_make_request();
@@ -593,40 +586,22 @@ void EditorAssetLibrary::_notification(int p_what) {
} break;
case NOTIFICATION_VISIBILITY_CHANGED: {
- if (is_visible()) {
+ if (is_visible() && initial_loading) {
_repository_changed(0); // Update when shown for the first time.
}
} break;
case NOTIFICATION_PROCESS: {
HTTPClient::Status s = request->get_http_client_status();
- bool visible = s != HTTPClient::STATUS_DISCONNECTED;
-
- if (visible != load_status->is_visible()) {
- load_status->set_visible(visible);
- }
-
- if (visible) {
- switch (s) {
+ const bool loading = s != HTTPClient::STATUS_DISCONNECTED;
- case HTTPClient::STATUS_RESOLVING: {
- load_status->set_value(0.1);
- } break;
- case HTTPClient::STATUS_CONNECTING: {
- load_status->set_value(0.2);
- } break;
- case HTTPClient::STATUS_REQUESTING: {
- load_status->set_value(0.3);
- } break;
- case HTTPClient::STATUS_BODY: {
- load_status->set_value(0.4);
- } break;
- default: {
- }
- }
+ if (loading) {
+ library_scroll->set_modulate(Color(1, 1, 1, 0.5));
+ } else {
+ library_scroll->set_modulate(Color(1, 1, 1, 1));
}
- bool no_downloads = downloads_hb->get_child_count() == 0;
+ const bool no_downloads = downloads_hb->get_child_count() == 0;
if (no_downloads == downloads_scroll->is_visible()) {
downloads_scroll->set_visible(!no_downloads);
}
@@ -679,7 +654,7 @@ const char *EditorAssetLibrary::sort_key[SORT_MAX] = {
const char *EditorAssetLibrary::sort_text[SORT_MAX] = {
"Downloads",
"Name",
- "License", // "cost" stores the SPDX license name in the Godot Asset Library
+ "License", // "cost" stores the SPDX license name in the Godot Asset Library.
"Updated"
};
@@ -691,7 +666,7 @@ const char *EditorAssetLibrary::support_key[SUPPORT_MAX] = {
void EditorAssetLibrary::_select_author(int p_id) {
- // Open author window
+ // Open author window.
}
void EditorAssetLibrary::_select_category(int p_id) {
@@ -758,7 +733,7 @@ void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PoolByt
switch (image_queue[p_queue_id].image_type) {
case IMAGE_QUEUE_ICON:
- image->resize(64 * EDSCALE, 64 * EDSCALE, Image::INTERPOLATE_CUBIC);
+ image->resize(64 * EDSCALE, 64 * EDSCALE, Image::INTERPOLATE_LANCZOS);
break;
case IMAGE_QUEUE_THUMBNAIL: {
@@ -788,7 +763,7 @@ void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PoolByt
}
if (!image_set && final) {
- obj->call("set_image", image_queue[p_queue_id].image_type, image_queue[p_queue_id].image_index, get_icon("DefaultProjectIcon", "EditorIcons"));
+ obj->call("set_image", image_queue[p_queue_id].image_type, image_queue[p_queue_id].image_index, get_icon("FileBrokenBigThumb", "EditorIcons"));
}
}
}
@@ -833,7 +808,7 @@ void EditorAssetLibrary::_image_request_completed(int p_status, int p_code, cons
WARN_PRINTS("Error getting image file from URL: " + image_queue[p_queue_id].image_url);
Object *obj = ObjectDB::get_instance(image_queue[p_queue_id].target);
if (obj) {
- obj->call("set_image", image_queue[p_queue_id].image_type, image_queue[p_queue_id].image_index, get_icon("DefaultProjectIcon", "EditorIcons"));
+ obj->call("set_image", image_queue[p_queue_id].image_type, image_queue[p_queue_id].image_index, get_icon("FileBrokenBigThumb", "EditorIcons"));
}
}
@@ -845,7 +820,7 @@ void EditorAssetLibrary::_image_request_completed(int p_status, int p_code, cons
void EditorAssetLibrary::_update_image_queue() {
- int max_images = 2;
+ const int max_images = 6;
int current_images = 0;
List<int> to_delete;
@@ -1157,6 +1132,12 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const
_search();
} break;
case REQUESTING_SEARCH: {
+
+ initial_loading = false;
+
+ // The loading text only needs to be displayed before the first page is loaded
+ library_loading->hide();
+
if (asset_items) {
memdelete(asset_items);
}
@@ -1349,6 +1330,7 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
requesting = REQUESTING_NONE;
templates_only = p_templates_only;
+ initial_loading = true;
VBoxContainer *library_main = memnew(VBoxContainer);
@@ -1359,7 +1341,6 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
library_main->add_child(search_hb);
library_main->add_constant_override("separation", 10 * EDSCALE);
- search_hb->add_child(memnew(Label(TTR("Search:") + " ")));
filter = memnew(LineEdit);
search_hb->add_child(filter);
filter->set_h_size_flags(SIZE_EXPAND_FILL);
@@ -1372,12 +1353,12 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
search_hb->add_child(memnew(VSeparator));
Button *open_asset = memnew(Button);
- open_asset->set_text(TTR("Import"));
+ open_asset->set_text(TTR("Import..."));
search_hb->add_child(open_asset);
open_asset->connect("pressed", this, "_asset_open");
Button *plugins = memnew(Button);
- plugins->set_text(TTR("Plugins"));
+ plugins->set_text(TTR("Plugins..."));
search_hb->add_child(plugins);
plugins->connect("pressed", this, "_manage_plugins");
@@ -1434,7 +1415,7 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
support = memnew(MenuButton);
search_hb2->add_child(support);
- support->set_text(TTR("Support..."));
+ support->set_text(TTR("Support"));
support->get_popup()->add_check_item(TTR("Official"), SUPPORT_OFFICIAL);
support->get_popup()->add_check_item(TTR("Community"), SUPPORT_COMMUNITY);
support->get_popup()->add_check_item(TTR("Testing"), SUPPORT_TESTING);
@@ -1472,6 +1453,10 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
library_vb_border->add_child(library_vb);
+ library_loading = memnew(Label(TTR("Loading...")));
+ library_loading->set_align(Label::ALIGN_CENTER);
+ library_vb->add_child(library_loading);
+
asset_top_page = memnew(HBoxContainer);
library_vb->add_child(asset_top_page);
@@ -1494,12 +1479,6 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
library_vb->add_constant_override("separation", 20 * EDSCALE);
- load_status = memnew(ProgressBar);
- load_status->set_min(0);
- load_status->set_max(1);
- load_status->set_step(0.001);
- library_main->add_child(load_status);
-
error_hb = memnew(HBoxContainer);
library_main->add_child(error_hb);
error_label = memnew(Label);
diff --git a/editor/plugins/asset_library_editor_plugin.h b/editor/plugins/asset_library_editor_plugin.h
index 81288ae831..6a3158889e 100644
--- a/editor/plugins/asset_library_editor_plugin.h
+++ b/editor/plugins/asset_library_editor_plugin.h
@@ -91,7 +91,6 @@ class EditorAssetLibraryItemDescription : public ConfirmationDialog {
ScrollContainer *previews;
HBoxContainer *preview_hb;
PanelContainer *previews_bg;
- PanelContainer *desc_bg;
struct Preview {
int id;
@@ -186,13 +185,13 @@ class EditorAssetLibrary : public PanelContainer {
PanelContainer *library_scroll_bg;
ScrollContainer *library_scroll;
VBoxContainer *library_vb;
+ Label *library_loading;
LineEdit *filter;
OptionButton *categories;
OptionButton *repository;
OptionButton *sort;
ToolButton *reverse;
Button *search;
- ProgressBar *load_status;
HBoxContainer *error_hb;
TextureRect *error_tr;
Label *error_label;
@@ -207,6 +206,7 @@ class EditorAssetLibrary : public PanelContainer {
HTTPRequest *request;
bool templates_only;
+ bool initial_loading;
enum Support {
SUPPORT_OFFICIAL,
diff --git a/editor/plugins/camera_editor_plugin.h b/editor/plugins/camera_editor_plugin.h
index eac9acab93..400aee132d 100644
--- a/editor/plugins/camera_editor_plugin.h
+++ b/editor/plugins/camera_editor_plugin.h
@@ -35,10 +35,6 @@
#include "editor/editor_plugin.h"
#include "scene/3d/camera.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class CameraEditor : public Control {
GDCLASS(CameraEditor, Control);
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
index ff134ff2d1..e4cd71fec0 100644
--- a/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -174,15 +174,6 @@ public:
}
};
-void CanvasItemEditor::_snap_if_closer_float(float p_value, float p_target_snap, float &r_current_snap, bool &r_snapped, float p_radius) {
- float radius = p_radius / zoom;
- float dist = Math::abs(p_value - p_target_snap);
- if ((p_radius < 0 || dist < radius) && (!r_snapped || dist < Math::abs(r_current_snap - p_value))) {
- r_current_snap = p_target_snap;
- r_snapped = true;
- }
-}
-
bool CanvasItemEditor::_is_node_locked(const Node *p_node) {
return p_node->has_meta("_edit_lock_") && p_node->get_meta("_edit_lock_");
}
@@ -200,108 +191,174 @@ bool CanvasItemEditor::_is_node_movable(const Node *p_node, bool p_popup_warning
return true;
}
-void CanvasItemEditor::_snap_if_closer_point(Point2 p_value, Point2 p_target_snap, Point2 &r_current_snap, bool (&r_snapped)[2], real_t rotation, float p_radius) {
+void CanvasItemEditor::_snap_if_closer_float(
+ float p_value,
+ float &r_current_snap, SnapTarget &r_current_snap_target,
+ float p_target_value, SnapTarget p_snap_target,
+ float p_radius) {
+
+ float radius = p_radius / zoom;
+ float dist = Math::abs(p_value - p_target_value);
+ if ((p_radius < 0 || dist < radius) && (r_current_snap_target == SNAP_TARGET_NONE || dist < Math::abs(r_current_snap - p_value))) {
+ r_current_snap = p_target_value;
+ r_current_snap_target = p_snap_target;
+ }
+}
+
+void CanvasItemEditor::_snap_if_closer_point(
+ Point2 p_value,
+ Point2 &r_current_snap, SnapTarget (&r_current_snap_target)[2],
+ Point2 p_target_value, SnapTarget p_snap_target,
+ real_t rotation,
+ float p_radius) {
+
Transform2D rot_trans = Transform2D(rotation, Point2());
p_value = rot_trans.inverse().xform(p_value);
- p_target_snap = rot_trans.inverse().xform(p_target_snap);
+ p_target_value = rot_trans.inverse().xform(p_target_value);
r_current_snap = rot_trans.inverse().xform(r_current_snap);
- _snap_if_closer_float(p_value.x, p_target_snap.x, r_current_snap.x, r_snapped[0], p_radius);
- _snap_if_closer_float(p_value.y, p_target_snap.y, r_current_snap.y, r_snapped[1], p_radius);
+ _snap_if_closer_float(
+ p_value.x,
+ r_current_snap.x,
+ r_current_snap_target[0],
+ p_target_value.x,
+ p_snap_target,
+ p_radius);
+
+ _snap_if_closer_float(
+ p_value.y,
+ r_current_snap.y,
+ r_current_snap_target[1],
+ p_target_value.y,
+ p_snap_target,
+ p_radius);
r_current_snap = rot_trans.xform(r_current_snap);
}
-void CanvasItemEditor::_snap_other_nodes(Point2 p_value, Point2 &r_current_snap, bool (&r_snapped)[2], const Node *p_current, const CanvasItem *p_to_snap) {
+void CanvasItemEditor::_snap_other_nodes(
+ const Point2 p_value,
+ const Transform2D p_transform_to_snap,
+ Point2 &r_current_snap, SnapTarget (&r_current_snap_target)[2],
+ const SnapTarget p_snap_target, List<const CanvasItem *> p_exceptions,
+ const Node *p_current) {
const CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_current);
- if (canvas_item && (!p_to_snap || p_current != p_to_snap)) {
+
+ // Check if the element is in the exception
+ bool exception = false;
+ for (List<const CanvasItem *>::Element *E = p_exceptions.front(); E; E = E->next()) {
+ if (E->get() == p_current) {
+ exception = true;
+ break;
+ }
+ };
+
+ if (canvas_item && !exception) {
Transform2D ci_transform = canvas_item->get_global_transform_with_canvas();
- Transform2D to_snap_transform = p_to_snap ? p_to_snap->get_global_transform_with_canvas() : Transform2D();
- if (fmod(ci_transform.get_rotation() - to_snap_transform.get_rotation(), (real_t)360.0) == 0.0) {
+ if (fmod(ci_transform.get_rotation() - p_transform_to_snap.get_rotation(), (real_t)360.0) == 0.0) {
if (canvas_item->_edit_use_rect()) {
Point2 begin = ci_transform.xform(canvas_item->_edit_get_rect().get_position());
Point2 end = ci_transform.xform(canvas_item->_edit_get_rect().get_position() + canvas_item->_edit_get_rect().get_size());
- _snap_if_closer_point(p_value, begin, r_current_snap, r_snapped, ci_transform.get_rotation());
- _snap_if_closer_point(p_value, end, r_current_snap, r_snapped, ci_transform.get_rotation());
+
+ _snap_if_closer_point(p_value, r_current_snap, r_current_snap_target, begin, p_snap_target, ci_transform.get_rotation());
+ _snap_if_closer_point(p_value, r_current_snap, r_current_snap_target, end, p_snap_target, ci_transform.get_rotation());
} else {
Point2 position = ci_transform.xform(Point2());
- _snap_if_closer_point(p_value, position, r_current_snap, r_snapped, ci_transform.get_rotation());
+ _snap_if_closer_point(p_value, r_current_snap, r_current_snap_target, position, p_snap_target, ci_transform.get_rotation());
}
}
}
for (int i = 0; i < p_current->get_child_count(); i++) {
- _snap_other_nodes(p_value, r_current_snap, r_snapped, p_current->get_child(i), p_to_snap);
+ _snap_other_nodes(p_value, p_transform_to_snap, r_current_snap, r_current_snap_target, p_snap_target, p_exceptions, p_current->get_child(i));
}
}
-Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, const CanvasItem *p_canvas_item, unsigned int p_forced_modes) {
- bool snapped[2] = { false, false };
+Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, unsigned int p_forced_modes, const CanvasItem *p_self_canvas_item, List<CanvasItem *> p_other_nodes_exceptions) {
+
+ snap_target[0] = SNAP_TARGET_NONE;
+ snap_target[1] = SNAP_TARGET_NONE;
+
bool is_snap_active = snap_active ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL);
// Smart snap using the canvas position
Vector2 output = p_target;
real_t rotation = 0.0;
- if (p_canvas_item) {
- rotation = p_canvas_item->get_global_transform_with_canvas().get_rotation();
+ if (p_self_canvas_item) {
+ rotation = p_self_canvas_item->get_global_transform_with_canvas().get_rotation();
// Parent sides and center
if ((is_snap_active && snap_node_parent && (p_modes & SNAP_NODE_PARENT)) || (p_forced_modes & SNAP_NODE_PARENT)) {
- if (const Control *c = Object::cast_to<Control>(p_canvas_item)) {
- Point2 begin = p_canvas_item->get_global_transform_with_canvas().xform(_anchor_to_position(c, Point2(0, 0)));
- Point2 end = p_canvas_item->get_global_transform_with_canvas().xform(_anchor_to_position(c, Point2(1, 1)));
- _snap_if_closer_point(p_target, begin, output, snapped, rotation);
- _snap_if_closer_point(p_target, (begin + end) / 2.0, output, snapped, rotation);
- _snap_if_closer_point(p_target, end, output, snapped, rotation);
- } else if (const CanvasItem *parent_ci = Object::cast_to<CanvasItem>(p_canvas_item->get_parent())) {
+ if (const Control *c = Object::cast_to<Control>(p_self_canvas_item)) {
+ Point2 begin = p_self_canvas_item->get_global_transform_with_canvas().xform(_anchor_to_position(c, Point2(0, 0)));
+ Point2 end = p_self_canvas_item->get_global_transform_with_canvas().xform(_anchor_to_position(c, Point2(1, 1)));
+ _snap_if_closer_point(p_target, output, snap_target, begin, SNAP_TARGET_PARENT, rotation);
+ _snap_if_closer_point(p_target, output, snap_target, (begin + end) / 2.0, SNAP_TARGET_PARENT, rotation);
+ _snap_if_closer_point(p_target, output, snap_target, end, SNAP_TARGET_PARENT, rotation);
+ } else if (const CanvasItem *parent_ci = Object::cast_to<CanvasItem>(p_self_canvas_item->get_parent())) {
if (parent_ci->_edit_use_rect()) {
- Point2 begin = p_canvas_item->get_transform().affine_inverse().xform(parent_ci->_edit_get_rect().get_position());
- Point2 end = p_canvas_item->get_transform().affine_inverse().xform(parent_ci->_edit_get_rect().get_position() + parent_ci->_edit_get_rect().get_size());
- _snap_if_closer_point(p_target, begin, output, snapped, rotation);
- _snap_if_closer_point(p_target, (begin + end) / 2.0, output, snapped, rotation);
- _snap_if_closer_point(p_target, end, output, snapped, rotation);
+ Point2 begin = p_self_canvas_item->get_transform().affine_inverse().xform(parent_ci->_edit_get_rect().get_position());
+ Point2 end = p_self_canvas_item->get_transform().affine_inverse().xform(parent_ci->_edit_get_rect().get_position() + parent_ci->_edit_get_rect().get_size());
+ _snap_if_closer_point(p_target, output, snap_target, begin, SNAP_TARGET_PARENT, rotation);
+ _snap_if_closer_point(p_target, output, snap_target, (begin + end) / 2.0, SNAP_TARGET_PARENT, rotation);
+ _snap_if_closer_point(p_target, output, snap_target, end, SNAP_TARGET_PARENT, rotation);
} else {
- Point2 position = p_canvas_item->get_transform().affine_inverse().xform(Point2());
- _snap_if_closer_point(p_target, position, output, snapped, rotation);
+ Point2 position = p_self_canvas_item->get_transform().affine_inverse().xform(Point2());
+ _snap_if_closer_point(p_target, output, snap_target, position, SNAP_TARGET_PARENT, rotation);
}
}
}
// Self anchors
if ((is_snap_active && snap_node_anchors && (p_modes & SNAP_NODE_ANCHORS)) || (p_forced_modes & SNAP_NODE_ANCHORS)) {
- if (const Control *c = Object::cast_to<Control>(p_canvas_item)) {
- Point2 begin = p_canvas_item->get_global_transform_with_canvas().xform(_anchor_to_position(c, Point2(c->get_anchor(MARGIN_LEFT), c->get_anchor(MARGIN_TOP))));
- Point2 end = p_canvas_item->get_global_transform_with_canvas().xform(_anchor_to_position(c, Point2(c->get_anchor(MARGIN_RIGHT), c->get_anchor(MARGIN_BOTTOM))));
- _snap_if_closer_point(p_target, begin, output, snapped, rotation);
- _snap_if_closer_point(p_target, end, output, snapped, rotation);
+ if (const Control *c = Object::cast_to<Control>(p_self_canvas_item)) {
+ Point2 begin = p_self_canvas_item->get_global_transform_with_canvas().xform(_anchor_to_position(c, Point2(c->get_anchor(MARGIN_LEFT), c->get_anchor(MARGIN_TOP))));
+ Point2 end = p_self_canvas_item->get_global_transform_with_canvas().xform(_anchor_to_position(c, Point2(c->get_anchor(MARGIN_RIGHT), c->get_anchor(MARGIN_BOTTOM))));
+ _snap_if_closer_point(p_target, output, snap_target, begin, SNAP_TARGET_SELF_ANCHORS, rotation);
+ _snap_if_closer_point(p_target, output, snap_target, end, SNAP_TARGET_SELF_ANCHORS, rotation);
}
}
// Self sides
if ((is_snap_active && snap_node_sides && (p_modes & SNAP_NODE_SIDES)) || (p_forced_modes & SNAP_NODE_SIDES)) {
- if (p_canvas_item->_edit_use_rect()) {
- Point2 begin = p_canvas_item->get_global_transform_with_canvas().xform(p_canvas_item->_edit_get_rect().get_position());
- Point2 end = p_canvas_item->get_global_transform_with_canvas().xform(p_canvas_item->_edit_get_rect().get_position() + p_canvas_item->_edit_get_rect().get_size());
- _snap_if_closer_point(p_target, begin, output, snapped, rotation);
- _snap_if_closer_point(p_target, end, output, snapped, rotation);
+ if (p_self_canvas_item->_edit_use_rect()) {
+ Point2 begin = p_self_canvas_item->get_global_transform_with_canvas().xform(p_self_canvas_item->_edit_get_rect().get_position());
+ Point2 end = p_self_canvas_item->get_global_transform_with_canvas().xform(p_self_canvas_item->_edit_get_rect().get_position() + p_self_canvas_item->_edit_get_rect().get_size());
+ _snap_if_closer_point(p_target, output, snap_target, begin, SNAP_TARGET_SELF, rotation);
+ _snap_if_closer_point(p_target, output, snap_target, end, SNAP_TARGET_SELF, rotation);
}
}
// Self center
if ((is_snap_active && snap_node_center && (p_modes & SNAP_NODE_CENTER)) || (p_forced_modes & SNAP_NODE_CENTER)) {
- if (p_canvas_item->_edit_use_rect()) {
- Point2 center = p_canvas_item->get_global_transform_with_canvas().xform(p_canvas_item->_edit_get_rect().get_position() + p_canvas_item->_edit_get_rect().get_size() / 2.0);
- _snap_if_closer_point(p_target, center, output, snapped, rotation);
+ if (p_self_canvas_item->_edit_use_rect()) {
+ Point2 center = p_self_canvas_item->get_global_transform_with_canvas().xform(p_self_canvas_item->_edit_get_rect().get_position() + p_self_canvas_item->_edit_get_rect().get_size() / 2.0);
+ _snap_if_closer_point(p_target, output, snap_target, center, SNAP_TARGET_SELF, rotation);
} else {
- Point2 position = p_canvas_item->get_global_transform_with_canvas().xform(Point2());
- _snap_if_closer_point(p_target, position, output, snapped, rotation);
+ Point2 position = p_self_canvas_item->get_global_transform_with_canvas().xform(Point2());
+ _snap_if_closer_point(p_target, output, snap_target, position, SNAP_TARGET_SELF, rotation);
}
}
}
// Other nodes sides
if ((is_snap_active && snap_other_nodes && (p_modes & SNAP_OTHER_NODES)) || (p_forced_modes & SNAP_OTHER_NODES)) {
- _snap_other_nodes(p_target, output, snapped, get_tree()->get_edited_scene_root(), p_canvas_item);
+ Transform2D to_snap_transform = Transform2D();
+ List<const CanvasItem *> exceptions = List<const CanvasItem *>();
+ for (List<CanvasItem *>::Element *E = p_other_nodes_exceptions.front(); E; E = E->next()) {
+ exceptions.push_back(E->get());
+ }
+ if (p_self_canvas_item) {
+ exceptions.push_back(p_self_canvas_item);
+ to_snap_transform = p_self_canvas_item->get_global_transform_with_canvas();
+ }
+
+ _snap_other_nodes(
+ p_target, to_snap_transform,
+ output, snap_target,
+ SNAP_TARGET_OTHER_NODE,
+ exceptions,
+ get_tree()->get_edited_scene_root());
}
if (((is_snap_active && snap_guides && (p_modes & SNAP_GUIDES)) || (p_forced_modes & SNAP_GUIDES)) && fmod(rotation, (real_t)360.0) == 0.0) {
@@ -309,14 +366,14 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, const
if (EditorNode::get_singleton()->get_edited_scene() && EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_vertical_guides_")) {
Array vguides = EditorNode::get_singleton()->get_edited_scene()->get_meta("_edit_vertical_guides_");
for (int i = 0; i < vguides.size(); i++) {
- _snap_if_closer_float(p_target.x, vguides[i], output.x, snapped[0]);
+ _snap_if_closer_float(p_target.x, output.x, snap_target[0], vguides[i], SNAP_TARGET_GUIDE);
}
}
if (EditorNode::get_singleton()->get_edited_scene() && EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_horizontal_guides_")) {
Array hguides = EditorNode::get_singleton()->get_edited_scene()->get_meta("_edit_horizontal_guides_");
for (int i = 0; i < hguides.size(); i++) {
- _snap_if_closer_float(p_target.y, hguides[i], output.y, snapped[1]);
+ _snap_if_closer_float(p_target.y, output.y, snap_target[1], hguides[i], SNAP_TARGET_GUIDE);
}
}
}
@@ -335,7 +392,7 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, const
Point2 grid_output;
grid_output.x = Math::stepify(p_target.x - offset.x, grid_step.x * Math::pow(2.0, grid_step_multiplier)) + offset.x;
grid_output.y = Math::stepify(p_target.y - offset.y, grid_step.y * Math::pow(2.0, grid_step_multiplier)) + offset.y;
- _snap_if_closer_point(p_target, grid_output, output, snapped, 0.0, -1.0);
+ _snap_if_closer_point(p_target, output, snap_target, grid_output, SNAP_TARGET_GRID, 0.0, -1.0);
}
if (((snap_pixel && (p_modes & SNAP_PIXEL)) || (p_forced_modes & SNAP_PIXEL)) && rotation == 0.0) {
@@ -343,6 +400,8 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, const
output = output.snapped(Size2(1, 1));
}
+ snap_transform = Transform2D(rotation, output);
+
return output;
}
@@ -1205,10 +1264,11 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) {
if (drag_selection.size() > 0) {
drag_from = transform.affine_inverse().xform((b.is_valid()) ? b->get_position() : viewport->get_local_mouse_position());
Vector2 new_pos;
- if (drag_selection.size() == 1)
- new_pos = snap_point(drag_from, SNAP_NODE_SIDES | SNAP_NODE_CENTER | SNAP_NODE_ANCHORS | SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL, drag_selection[0]);
- else
- new_pos = snap_point(drag_from, SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL);
+ if (drag_selection.size() == 1) {
+ new_pos = snap_point(drag_from, SNAP_NODE_SIDES | SNAP_NODE_CENTER | SNAP_NODE_ANCHORS | SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL, 0, drag_selection[0]);
+ } else {
+ new_pos = snap_point(drag_from, SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL, 0, NULL, drag_selection);
+ }
for (List<CanvasItem *>::Element *E = drag_selection.front(); E; E = E->next()) {
CanvasItem *canvas_item = E->get();
canvas_item->_edit_set_pivot(canvas_item->get_global_transform_with_canvas().affine_inverse().xform(new_pos));
@@ -1228,7 +1288,7 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) {
_restore_canvas_item_state(drag_selection);
Vector2 new_pos;
if (drag_selection.size() == 1)
- new_pos = snap_point(drag_to, SNAP_NODE_SIDES | SNAP_NODE_CENTER | SNAP_NODE_ANCHORS | SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL, drag_selection[0]);
+ new_pos = snap_point(drag_to, SNAP_NODE_SIDES | SNAP_NODE_CENTER | SNAP_NODE_ANCHORS | SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL, 0, drag_selection[0]);
else
new_pos = snap_point(drag_to, SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL);
for (List<CanvasItem *>::Element *E = drag_selection.front(); E; E = E->next()) {
@@ -1478,7 +1538,7 @@ bool CanvasItemEditor::_gui_input_anchors(const Ref<InputEvent> &p_event) {
previous_anchor.y = (drag_type == DRAG_ANCHOR_TOP_LEFT || drag_type == DRAG_ANCHOR_TOP_RIGHT) ? control->get_anchor(MARGIN_TOP) : control->get_anchor(MARGIN_BOTTOM);
previous_anchor = xform.affine_inverse().xform(_anchor_to_position(control, previous_anchor));
- Vector2 new_anchor = xform.xform(snap_point(previous_anchor + (drag_to - drag_from), SNAP_GRID | SNAP_OTHER_NODES, control, SNAP_NODE_PARENT | SNAP_NODE_SIDES | SNAP_NODE_CENTER));
+ Vector2 new_anchor = xform.xform(snap_point(previous_anchor + (drag_to - drag_from), SNAP_GRID | SNAP_OTHER_NODES, SNAP_NODE_PARENT | SNAP_NODE_SIDES | SNAP_NODE_CENTER, control));
new_anchor = _position_to_anchor(control, new_anchor).snapped(Vector2(0.001, 0.001));
bool use_single_axis = m->get_shift();
@@ -1624,8 +1684,8 @@ bool CanvasItemEditor::_gui_input_resize(const Ref<InputEvent> &p_event) {
Transform2D xform = canvas_item->get_global_transform_with_canvas().affine_inverse();
- Point2 drag_to_snapped_begin = snap_point(xform.affine_inverse().xform(current_begin) + (drag_to - drag_from), SNAP_NODE_ANCHORS | SNAP_NODE_PARENT | SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL, canvas_item);
- Point2 drag_to_snapped_end = snap_point(xform.affine_inverse().xform(current_end) + (drag_to - drag_from), SNAP_NODE_ANCHORS | SNAP_NODE_PARENT | SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL, canvas_item);
+ Point2 drag_to_snapped_begin = snap_point(xform.affine_inverse().xform(current_begin) + (drag_to - drag_from), SNAP_NODE_ANCHORS | SNAP_NODE_PARENT | SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL, 0, canvas_item);
+ Point2 drag_to_snapped_end = snap_point(xform.affine_inverse().xform(current_end) + (drag_to - drag_from), SNAP_NODE_ANCHORS | SNAP_NODE_PARENT | SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL, 0, canvas_item);
Point2 drag_begin = xform.xform(drag_to_snapped_begin);
Point2 drag_end = xform.xform(drag_to_snapped_end);
@@ -1866,7 +1926,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) {
} else {
previous_pos = _get_encompassing_rect_from_list(drag_selection).position;
}
- Point2 new_pos = snap_point(previous_pos + (drag_to - drag_from), SNAP_GRID | SNAP_GUIDES | SNAP_PIXEL | SNAP_NODE_PARENT | SNAP_NODE_ANCHORS | SNAP_OTHER_NODES);
+ Point2 new_pos = snap_point(previous_pos + (drag_to - drag_from), SNAP_GRID | SNAP_GUIDES | SNAP_PIXEL | SNAP_NODE_PARENT | SNAP_NODE_ANCHORS | SNAP_OTHER_NODES, 0, NULL, drag_selection);
bool single_axis = m->get_shift();
if (single_axis) {
if (ABS(new_pos.x - previous_pos.x) > ABS(new_pos.y - previous_pos.y)) {
@@ -2186,6 +2246,40 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
return false;
}
+bool CanvasItemEditor::_gui_input_ruler_tool(const Ref<InputEvent> &p_event) {
+
+ if (tool != TOOL_RULER)
+ return false;
+
+ Ref<InputEventMouseButton> b = p_event;
+ Ref<InputEventMouseMotion> m = p_event;
+
+ Point2 previous_origin = ruler_tool_origin;
+ if (!ruler_tool_active)
+ ruler_tool_origin = snap_point(viewport->get_local_mouse_position() / zoom + view_offset) * zoom;
+
+ if (b.is_valid() && b->get_button_index() == BUTTON_LEFT) {
+ if (b->is_pressed()) {
+ ruler_tool_active = true;
+ } else {
+ ruler_tool_active = false;
+ }
+
+ viewport->update();
+ return true;
+ }
+
+ bool is_snap_active = snap_active ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL);
+
+ if (m.is_valid() && (ruler_tool_active || (is_snap_active && previous_origin != ruler_tool_origin))) {
+
+ viewport->update();
+ return true;
+ }
+
+ return false;
+}
+
bool CanvasItemEditor::_gui_input_hover(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseMotion> m = p_event;
@@ -2263,6 +2357,8 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) {
//printf("Anchors\n");
} else if ((accepted = _gui_input_select(p_event))) {
//printf("Selection\n");
+ } else if ((accepted = _gui_input_ruler_tool(p_event))) {
+ //printf("Measure\n");
} else {
//printf("Not accepted\n");
}
@@ -2290,6 +2386,9 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) {
case TOOL_PAN:
c = CURSOR_DRAG;
break;
+ case TOOL_RULER:
+ c = CURSOR_CROSS;
+ break;
default:
break;
}
@@ -2421,6 +2520,20 @@ void CanvasItemEditor::_draw_guides() {
}
}
+void CanvasItemEditor::_draw_smart_snapping() {
+ Color line_color = EditorSettings::get_singleton()->get("editors/2d/smart_snapping_line_color");
+ if (snap_target[0] != SNAP_TARGET_NONE && snap_target[0] != SNAP_TARGET_GRID) {
+ viewport->draw_set_transform_matrix(viewport->get_transform() * transform * snap_transform);
+ viewport->draw_line(Point2(0, -1.0e+10F), Point2(0, 1.0e+10F), line_color);
+ viewport->draw_set_transform_matrix(viewport->get_transform());
+ }
+ if (snap_target[1] != SNAP_TARGET_NONE && snap_target[1] != SNAP_TARGET_GRID) {
+ viewport->draw_set_transform_matrix(viewport->get_transform() * transform * snap_transform);
+ viewport->draw_line(Point2(-1.0e+10F, 0), Point2(1.0e+10F, 0), line_color);
+ viewport->draw_set_transform_matrix(viewport->get_transform());
+ }
+}
+
void CanvasItemEditor::_draw_rulers() {
Color bg_color = get_color("dark_color_2", "Editor");
Color graduation_color = get_color("font_color", "Editor").linear_interpolate(bg_color, 0.5);
@@ -2505,6 +2618,8 @@ void CanvasItemEditor::_draw_rulers() {
}
}
}
+
+ // Draw the top left corner
viewport->draw_rect(Rect2(Point2(), Size2(RULER_WIDTH, RULER_WIDTH)), graduation_color);
}
@@ -2550,6 +2665,83 @@ void CanvasItemEditor::_draw_grid() {
}
}
+void CanvasItemEditor::_draw_ruler_tool() {
+
+ if (tool != TOOL_RULER)
+ return;
+
+ bool is_snap_active = snap_active ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL);
+
+ if (ruler_tool_active) {
+ Color ruler_primary_color = get_color("accent_color", "Editor");
+ Color ruler_secondary_color = ruler_primary_color;
+ ruler_secondary_color.a = 0.5;
+
+ Point2 begin = ruler_tool_origin - view_offset * zoom;
+ Point2 end = snap_point(viewport->get_local_mouse_position() / zoom + view_offset) * zoom - view_offset * zoom;
+ Point2 corner = Point2(begin.x, end.y);
+ Vector2 length_vector = (begin - end).abs() / zoom;
+
+ bool draw_secondary_lines = (begin.y != corner.y && end.x != corner.x);
+
+ viewport->draw_line(begin, end, ruler_primary_color, Math::round(EDSCALE * 3), true);
+ if (draw_secondary_lines) {
+ viewport->draw_line(begin, corner, ruler_secondary_color, Math::round(EDSCALE));
+ viewport->draw_line(corner, end, ruler_secondary_color, Math::round(EDSCALE));
+ }
+
+ Ref<Font> font = get_font("bold", "EditorFonts");
+ Color font_color = get_color("font_color", "Editor");
+ Color font_secondary_color = font_color;
+ font_secondary_color.a = 0.5;
+ float text_height = font->get_height();
+ const float text_width = 76;
+
+ Point2 text_pos = (begin + end) / 2 - Vector2(text_width / 2, text_height / 2);
+ text_pos.x = CLAMP(text_pos.x, text_width / 2, viewport->get_rect().size.x - text_width * 1.5);
+ text_pos.y = CLAMP(text_pos.y, text_height * 1.5, viewport->get_rect().size.y - text_height * 1.5);
+ viewport->draw_string(font, text_pos, vformat("%.2f px", length_vector.length()), font_color);
+
+ if (draw_secondary_lines) {
+
+ Point2 text_pos2 = text_pos;
+ text_pos2.x = begin.x < text_pos.x ? MIN(text_pos.x - text_width, begin.x - text_width / 2) : MAX(text_pos.x + text_width, begin.x - text_width / 2);
+ viewport->draw_string(font, text_pos2, vformat("%.2f px", length_vector.y), font_secondary_color);
+
+ text_pos2 = text_pos;
+ text_pos2.y = end.y < text_pos.y ? MIN(text_pos.y - text_height * 2, end.y - text_height / 2) : MAX(text_pos.y + text_height * 2, end.y - text_height / 2);
+ viewport->draw_string(font, text_pos2, vformat("%.2f px", length_vector.x), font_secondary_color);
+ }
+
+ if (is_snap_active) {
+
+ text_pos = (begin + end) / 2 + Vector2(-text_width / 2, text_height / 2);
+ text_pos.x = CLAMP(text_pos.x, text_width / 2, viewport->get_rect().size.x - text_width * 1.5);
+ text_pos.y = CLAMP(text_pos.y, text_height * 2.5, viewport->get_rect().size.y - text_height / 2);
+
+ if (draw_secondary_lines) {
+ viewport->draw_string(font, text_pos, vformat("%.2f units", (length_vector / grid_step).length()), font_color);
+
+ Point2 text_pos2 = text_pos;
+ text_pos2.x = begin.x < text_pos.x ? MIN(text_pos.x - text_width, begin.x - text_width / 2) : MAX(text_pos.x + text_width, begin.x - text_width / 2);
+ viewport->draw_string(font, text_pos2, vformat("%d units", (int)(length_vector.y / grid_step.y)), font_secondary_color);
+
+ text_pos2 = text_pos;
+ text_pos2.y = end.y < text_pos.y ? MIN(text_pos.y - text_height * 2, end.y + text_height / 2) : MAX(text_pos.y + text_height * 2, end.y + text_height / 2);
+ viewport->draw_string(font, text_pos2, vformat("%d units", (int)(length_vector.x / grid_step.x)), font_secondary_color);
+ } else {
+ viewport->draw_string(font, text_pos, vformat("%d units", roundf((length_vector / grid_step).length())), font_color);
+ }
+ }
+ } else {
+
+ if (is_snap_active) {
+ Ref<Texture> position_icon = get_icon("EditorPosition", "EditorIcons");
+ viewport->draw_texture(get_icon("EditorPosition", "EditorIcons"), ruler_tool_origin - view_offset * zoom - position_icon->get_size() / 2);
+ }
+ }
+}
+
void CanvasItemEditor::_draw_control_anchors(Control *control) {
Transform2D xform = transform * control->get_global_transform_with_canvas();
RID ci = viewport->get_canvas_item();
@@ -2623,7 +2815,7 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) {
if (dragged_anchor >= 0) {
// Draw the 4 lines when dragged
- bool snapped;
+ bool anchor_snapped;
Color color_snapped = Color(0.64, 0.93, 0.67, 0.5);
Vector2 corners_pos[4];
@@ -2637,14 +2829,8 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) {
float anchor_val = (i >= 2) ? ANCHOR_END - anchors_values[i] : anchors_values[i];
line_starts[i] = Vector2::linear_interpolate(corners_pos[i], corners_pos[(i + 1) % 4], anchor_val);
line_ends[i] = Vector2::linear_interpolate(corners_pos[(i + 3) % 4], corners_pos[(i + 2) % 4], anchor_val);
- snapped = anchors_values[i] == 0.0 || anchors_values[i] == 0.5 || anchors_values[i] == 1.0;
- int line_width;
- if (i == dragged_anchor || (i + 3) % 4 == dragged_anchor) {
- line_width = 2;
- } else {
- line_width = 1;
- }
- viewport->draw_line(line_starts[i], line_ends[i], snapped ? color_snapped : color_base, Math::round(line_width * EDSCALE));
+ anchor_snapped = anchors_values[i] == 0.0 || anchors_values[i] == 0.5 || anchors_values[i] == 1.0;
+ viewport->draw_line(line_starts[i], line_ends[i], anchor_snapped ? color_snapped : color_base, (i == dragged_anchor || (i + 3) % 4 == dragged_anchor) ? 2 : 1);
}
// Display the percentages next to the lines
@@ -2918,10 +3104,15 @@ void CanvasItemEditor::_draw_selection() {
Point2 bsfrom = transform.xform(drag_from);
Point2 bsto = transform.xform(box_selecting_to);
- VisualServer::get_singleton()->canvas_item_add_rect(
- ci,
+ viewport->draw_rect(
+ Rect2(bsfrom, bsto - bsfrom),
+ get_color("box_selection_fill_color", "Editor"));
+
+ viewport->draw_rect(
Rect2(bsfrom, bsto - bsfrom),
- get_color("accent_color", "Editor") * Color(1, 1, 1, 0.375));
+ get_color("box_selection_stroke_color", "Editor"),
+ false,
+ Math::round(EDSCALE));
}
if (drag_type == DRAG_ROTATE) {
@@ -3283,6 +3474,7 @@ void CanvasItemEditor::_draw_viewport() {
info_overlay->set_margin(MARGIN_LEFT, (show_rulers ? RULER_WIDTH : 0) + 10);
_draw_grid();
+ _draw_ruler_tool();
_draw_selection();
_draw_axis();
if (editor->get_edited_scene()) {
@@ -3307,6 +3499,7 @@ void CanvasItemEditor::_draw_viewport() {
_draw_rulers();
if (show_guides)
_draw_guides();
+ _draw_smart_snapping();
_draw_focus();
_draw_hover();
}
@@ -3316,6 +3509,10 @@ void CanvasItemEditor::update_viewport() {
viewport->update();
}
+void CanvasItemEditor::set_current_tool(Tool p_tool) {
+ _button_tool_select(p_tool);
+}
+
void CanvasItemEditor::_notification(int p_what) {
if (p_what == NOTIFICATION_PHYSICS_PROCESS) {
@@ -3466,6 +3663,7 @@ void CanvasItemEditor::_notification(int p_what) {
snap_config_menu->set_icon(get_icon("GuiMiniTabMenu", "EditorIcons"));
skeleton_menu->set_icon(get_icon("Bone", "EditorIcons"));
pan_button->set_icon(get_icon("ToolPan", "EditorIcons"));
+ ruler_button->set_icon(get_icon("Ruler", "EditorIcons"));
pivot_button->set_icon(get_icon("EditPivot", "EditorIcons"));
select_handle = get_icon("EditorHandle", "EditorIcons");
anchor_handle = get_icon("EditorControlAnchor", "EditorIcons");
@@ -3860,13 +4058,13 @@ void CanvasItemEditor::_button_toggle_snap(bool p_status) {
void CanvasItemEditor::_button_tool_select(int p_index) {
- ToolButton *tb[TOOL_MAX] = { select_button, list_select_button, move_button, scale_button, rotate_button, pivot_button, pan_button };
+ ToolButton *tb[TOOL_MAX] = { select_button, list_select_button, move_button, scale_button, rotate_button, pivot_button, pan_button, ruler_button };
for (int i = 0; i < TOOL_MAX; i++) {
tb[i]->set_pressed(i == p_index);
}
- viewport->update();
tool = (Tool)p_index;
+ viewport->update();
}
void CanvasItemEditor::_insert_animation_keys(bool p_location, bool p_rotation, bool p_scale, bool p_on_existing) {
@@ -4349,6 +4547,27 @@ void CanvasItemEditor::_popup_callback(int p_op) {
}
} break;
+ case CLEAR_GUIDES: {
+
+ if (EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_horizontal_guides_") || EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_vertical_guides_")) {
+ undo_redo->create_action(TTR("Clear Guides"));
+ if (EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_horizontal_guides_")) {
+ Array hguides = EditorNode::get_singleton()->get_edited_scene()->get_meta("_edit_horizontal_guides_");
+
+ undo_redo->add_do_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_horizontal_guides_", Array());
+ undo_redo->add_undo_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_horizontal_guides_", hguides);
+ }
+ if (EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_vertical_guides_")) {
+ Array vguides = EditorNode::get_singleton()->get_edited_scene()->get_meta("_edit_vertical_guides_");
+
+ undo_redo->add_do_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_vertical_guides_", Array());
+ undo_redo->add_undo_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_vertical_guides_", vguides);
+ }
+ undo_redo->add_undo_method(viewport, "update");
+ undo_redo->commit_action();
+ }
+
+ } break;
case VIEW_CENTER_TO_SELECTION:
case VIEW_FRAME_TO_SELECTION: {
@@ -4825,6 +5044,9 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
panning = false;
pan_pressed = false;
+ ruler_tool_active = false;
+ ruler_tool_origin = Point2();
+
bone_last_frame = 0;
bone_list_dirty = false;
@@ -4978,6 +5200,13 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
pan_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_PAN));
pan_button->set_tooltip(TTR("Pan Mode"));
+ ruler_button = memnew(ToolButton);
+ hb->add_child(ruler_button);
+ ruler_button->set_toggle_mode(true);
+ ruler_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_RULER));
+ ruler_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/ruler_mode", TTR("Ruler Mode"), KEY_R));
+ ruler_button->set_tooltip(TTR("Ruler Mode"));
+
hb->add_child(memnew(VSeparator));
snap_button = memnew(ToolButton);
@@ -4998,11 +5227,13 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
p->set_hide_on_checkable_item_selection(false);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/snap_grid", TTR("Snap to Grid")), SNAP_USE_GRID);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/use_rotation_snap", TTR("Use Rotation Snap")), SNAP_USE_ROTATION);
- p->add_shortcut(ED_SHORTCUT("canvas_item_editor/configure_snap", TTR("Configure Snap...")), SNAP_CONFIGURE);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/snap_relative", TTR("Snap Relative")), SNAP_RELATIVE);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/use_pixel_snap", TTR("Use Pixel Snap")), SNAP_USE_PIXEL);
p->add_submenu_item(TTR("Smart Snapping"), "SmartSnapping");
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/configure_snap", TTR("Configure Snap...")), SNAP_CONFIGURE);
+
smartsnap_config_popup = memnew(PopupMenu);
p->add_child(smartsnap_config_popup);
smartsnap_config_popup->set_name("SmartSnapping");
@@ -5068,7 +5299,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
p->set_hide_on_checkable_item_selection(false);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_grid", TTR("Show Grid"), KEY_G), SHOW_GRID);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_helpers", TTR("Show Helpers"), KEY_H), SHOW_HELPERS);
- p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_rulers", TTR("Show Rulers"), KEY_R), SHOW_RULERS);
+ p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_rulers", TTR("Show Rulers"), KEY_MASK_CMD | KEY_R), SHOW_RULERS);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_guides", TTR("Show Guides"), KEY_Y), SHOW_GUIDES);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_origin", TTR("Show Origin")), SHOW_ORIGIN);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_viewport", TTR("Show Viewport")), SHOW_VIEWPORT);
@@ -5077,6 +5308,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
p->add_separator();
p->add_shortcut(ED_SHORTCUT("canvas_item_editor/center_selection", TTR("Center Selection"), KEY_F), VIEW_CENTER_TO_SELECTION);
p->add_shortcut(ED_SHORTCUT("canvas_item_editor/frame_selection", TTR("Frame Selection"), KEY_MASK_SHIFT | KEY_F), VIEW_FRAME_TO_SELECTION);
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/clear_guides", TTR("Clear Guides")), CLEAR_GUIDES);
p->add_separator();
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/preview_canvas_scale", TTR("Preview Canvas Scale"), KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_P), PREVIEW_CANVAS_SCALE);
diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h
index 553ded6b14..4e030c63da 100644
--- a/editor/plugins/canvas_item_editor_plugin.h
+++ b/editor/plugins/canvas_item_editor_plugin.h
@@ -39,9 +39,6 @@
#include "scene/gui/label.h"
#include "scene/gui/panel_container.h"
#include "scene/gui/spin_box.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class CanvasItemEditorViewport;
@@ -83,12 +80,24 @@ public:
TOOL_ROTATE,
TOOL_EDIT_PIVOT,
TOOL_PAN,
+ TOOL_RULER,
TOOL_MAX
};
private:
EditorNode *editor;
+ enum SnapTarget {
+ SNAP_TARGET_NONE = 0,
+ SNAP_TARGET_PARENT,
+ SNAP_TARGET_SELF_ANCHORS,
+ SNAP_TARGET_SELF,
+ SNAP_TARGET_OTHER_NODE,
+ SNAP_TARGET_GUIDE,
+ SNAP_TARGET_GRID,
+ SNAP_TARGET_PIXEL
+ };
+
enum MenuOption {
SNAP_USE,
SNAP_USE_NODE_PARENT,
@@ -170,6 +179,7 @@ private:
ANIM_COPY_POSE,
ANIM_PASTE_POSE,
ANIM_CLEAR_POSE,
+ CLEAR_GUIDES,
VIEW_CENTER_TO_SELECTION,
VIEW_FRAME_TO_SELECTION,
PREVIEW_CANVAS_SCALE,
@@ -267,6 +277,9 @@ private:
bool panning;
bool pan_pressed;
+ bool ruler_tool_active;
+ Point2 ruler_tool_origin;
+
MenuOption last_option;
struct _SelectResult {
@@ -332,6 +345,8 @@ private:
ToolButton *pivot_button;
ToolButton *pan_button;
+ ToolButton *ruler_button;
+
ToolButton *snap_button;
MenuButton *snap_config_menu;
PopupMenu *smartsnap_config_popup;
@@ -443,10 +458,12 @@ private:
void _draw_percentage_at_position(float p_value, Point2 p_position, Margin p_side);
void _draw_straight_line(Point2 p_from, Point2 p_to, Color p_color);
+ void _draw_smart_snapping();
void _draw_rulers();
void _draw_guides();
void _draw_focus();
void _draw_grid();
+ void _draw_ruler_tool();
void _draw_control_anchors(Control *control);
void _draw_control_helpers(Control *control);
void _draw_selection();
@@ -466,6 +483,7 @@ private:
bool _gui_input_resize(const Ref<InputEvent> &p_event);
bool _gui_input_rotate(const Ref<InputEvent> &p_event);
bool _gui_input_select(const Ref<InputEvent> &p_event);
+ bool _gui_input_ruler_tool(const Ref<InputEvent> &p_event);
bool _gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bool p_already_accepted);
bool _gui_input_rulers_and_guides(const Ref<InputEvent> &p_event);
bool _gui_input_hover(const Ref<InputEvent> &p_event);
@@ -478,9 +496,25 @@ private:
void _solve_IK(Node2D *leaf_node, Point2 target_position);
- void _snap_if_closer_float(float p_value, float p_target_snap, float &r_current_snap, bool &r_snapped, float p_radius = 10.0);
- void _snap_if_closer_point(Point2 p_value, Point2 p_target_snap, Point2 &r_current_snap, bool (&r_snapped)[2], real_t rotation = 0.0, float p_radius = 10.0);
- void _snap_other_nodes(Point2 p_value, Point2 &r_current_snap, bool (&r_snapped)[2], const Node *p_current, const CanvasItem *p_to_snap = NULL);
+ SnapTarget snap_target[2];
+ Transform2D snap_transform;
+ void _snap_if_closer_float(
+ float p_value,
+ float &r_current_snap, SnapTarget &r_current_snap_target,
+ float p_target_value, SnapTarget p_snap_target,
+ float p_radius = 10.0);
+ void _snap_if_closer_point(
+ Point2 p_value,
+ Point2 &r_current_snap, SnapTarget (&r_current_snap_target)[2],
+ Point2 p_target_value, SnapTarget p_snap_target,
+ real_t rotation = 0.0,
+ float p_radius = 10.0);
+ void _snap_other_nodes(
+ const Point2 p_value,
+ const Transform2D p_transform_to_snap,
+ Point2 &r_current_snap, SnapTarget (&r_current_snap_target)[2],
+ const SnapTarget p_snap_target, List<const CanvasItem *> p_exceptions,
+ const Node *p_current);
void _set_anchors_preset(Control::LayoutPreset p_preset);
void _set_margins_preset(Control::LayoutPreset p_preset);
@@ -561,7 +595,7 @@ public:
SNAP_DEFAULT = SNAP_GRID | SNAP_GUIDES | SNAP_PIXEL,
};
- Point2 snap_point(Point2 p_target, unsigned int p_modes = SNAP_DEFAULT, const CanvasItem *p_canvas_item = NULL, unsigned int p_forced_modes = 0);
+ Point2 snap_point(Point2 p_target, unsigned int p_modes = SNAP_DEFAULT, unsigned int p_forced_modes = 0, const CanvasItem *p_self_canvas_item = NULL, List<CanvasItem *> p_other_nodes_exceptions = List<CanvasItem *>());
float snap_angle(float p_target, float p_start = 0) const;
Transform2D get_canvas_transform() const { return transform; }
@@ -584,6 +618,7 @@ public:
void update_viewport();
Tool get_current_tool() { return tool; }
+ void set_current_tool(Tool p_tool);
void set_undo_redo(UndoRedo *p_undo_redo) { undo_redo = p_undo_redo; }
void edit(CanvasItem *p_canvas_item);
diff --git a/editor/plugins/collision_polygon_2d_editor_plugin.h b/editor/plugins/collision_polygon_2d_editor_plugin.h
index e15360d4e5..3f0734fb19 100644
--- a/editor/plugins/collision_polygon_2d_editor_plugin.h
+++ b/editor/plugins/collision_polygon_2d_editor_plugin.h
@@ -34,9 +34,6 @@
#include "editor/plugins/abstract_polygon_2d_editor.h"
#include "scene/2d/collision_polygon_2d.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class CollisionPolygon2DEditor : public AbstractPolygon2DEditor {
GDCLASS(CollisionPolygon2DEditor, AbstractPolygon2DEditor);
diff --git a/editor/plugins/collision_polygon_editor_plugin.h b/editor/plugins/collision_polygon_editor_plugin.h
index a699641aba..2a904a53ba 100644
--- a/editor/plugins/collision_polygon_editor_plugin.h
+++ b/editor/plugins/collision_polygon_editor_plugin.h
@@ -38,10 +38,6 @@
#include "scene/3d/mesh_instance.h"
#include "scene/gui/tool_button.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class CanvasItemEditor;
class Polygon3DEditor : public HBoxContainer {
diff --git a/editor/plugins/cpu_particles_2d_editor_plugin.cpp b/editor/plugins/cpu_particles_2d_editor_plugin.cpp
index 7c2116f06b..9d625af959 100644
--- a/editor/plugins/cpu_particles_2d_editor_plugin.cpp
+++ b/editor/plugins/cpu_particles_2d_editor_plugin.cpp
@@ -87,8 +87,7 @@ void CPUParticles2DEditorPlugin::_generate_emission_mask() {
Ref<Image> img;
img.instance();
Error err = ImageLoader::load_image(source_emission_file, img);
- ERR_EXPLAIN(TTR("Error loading image:") + " " + source_emission_file);
- ERR_FAIL_COND(err != OK);
+ ERR_FAIL_COND_MSG(err != OK, "Error loading image: " + source_emission_file + ".");
if (img->is_compressed()) {
img->decompress();
@@ -196,8 +195,7 @@ void CPUParticles2DEditorPlugin::_generate_emission_mask() {
valid_normals.resize(vpc);
}
- ERR_EXPLAIN(TTR("No pixels with transparency > 128 in image..."));
- ERR_FAIL_COND(valid_positions.size() == 0);
+ ERR_FAIL_COND_MSG(valid_positions.size() == 0, "No pixels with transparency > 128 in image...");
if (capture_colors) {
PoolColorArray pca;
diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp
index 5d3cef4c34..c2b6031e60 100644
--- a/editor/plugins/curve_editor_plugin.cpp
+++ b/editor/plugins/curve_editor_plugin.cpp
@@ -167,10 +167,20 @@ void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) {
_has_undo_data = true;
}
+ const float curve_amplitude = curve.get_max_value() - curve.get_min_value();
+ // Snap to "round" coordinates when holding Ctrl.
+ // Be more precise when holding Shift as well.
+ float snap_threshold;
+ if (mm.get_control()) {
+ snap_threshold = mm.get_shift() ? 0.025 : 0.1;
+ } else {
+ snap_threshold = 0.0;
+ }
+
if (_selected_tangent == TANGENT_NONE) {
// Drag point
- Vector2 point_pos = get_world_pos(mpos);
+ Vector2 point_pos = get_world_pos(mpos).snapped(Vector2(snap_threshold, snap_threshold * curve_amplitude));
int i = curve.set_point_offset(_selected_point, point_pos.x);
// The index may change if the point is dragged across another one
@@ -188,8 +198,8 @@ void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) {
} else {
// Drag tangent
- Vector2 point_pos = curve.get_point_position(_selected_point);
- Vector2 control_pos = get_world_pos(mpos);
+ const Vector2 point_pos = curve.get_point_position(_selected_point);
+ const Vector2 control_pos = get_world_pos(mpos).snapped(Vector2(snap_threshold, snap_threshold * curve_amplitude));
Vector2 dir = (control_pos - point_pos).normalized();
diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp
index c8ffc2744a..8acc41a2c7 100644
--- a/editor/plugins/editor_preview_plugins.cpp
+++ b/editor/plugins/editor_preview_plugins.cpp
@@ -624,6 +624,7 @@ Ref<Texture> EditorAudioStreamPreviewPlugin::generate(const RES &p_from, const S
uint8_t *imgw = imgdata.ptr();
Ref<AudioStreamPlayback> playback = stream->instance_playback();
+ ERR_FAIL_COND_V(playback.is_null(), Ref<Texture>());
float len_s = stream->get_length();
if (len_s == 0) {
diff --git a/editor/plugins/item_list_editor_plugin.h b/editor/plugins/item_list_editor_plugin.h
index 701632e576..78b176620e 100644
--- a/editor/plugins/item_list_editor_plugin.h
+++ b/editor/plugins/item_list_editor_plugin.h
@@ -39,10 +39,6 @@
#include "scene/gui/option_button.h"
#include "scene/gui/popup_menu.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class ItemListPlugin : public Object {
GDCLASS(ItemListPlugin, Object);
diff --git a/editor/plugins/light_occluder_2d_editor_plugin.h b/editor/plugins/light_occluder_2d_editor_plugin.h
index 633fda7091..95fa0df2c1 100644
--- a/editor/plugins/light_occluder_2d_editor_plugin.h
+++ b/editor/plugins/light_occluder_2d_editor_plugin.h
@@ -34,9 +34,6 @@
#include "editor/plugins/abstract_polygon_2d_editor.h"
#include "scene/2d/light_occluder_2d.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class LightOccluder2DEditor : public AbstractPolygon2DEditor {
GDCLASS(LightOccluder2DEditor, AbstractPolygon2DEditor);
diff --git a/editor/plugins/multimesh_editor_plugin.cpp b/editor/plugins/multimesh_editor_plugin.cpp
index d59efe49e7..3ea014a38d 100644
--- a/editor/plugins/multimesh_editor_plugin.cpp
+++ b/editor/plugins/multimesh_editor_plugin.cpp
@@ -147,9 +147,8 @@ void MultiMeshEditor::_populate() {
w.release();
PoolVector<Face3> faces = geometry;
- ERR_EXPLAIN(TTR("Parent has no solid faces to populate."));
int facecount = faces.size();
- ERR_FAIL_COND(!facecount);
+ ERR_FAIL_COND_MSG(!facecount, "Parent has no solid faces to populate.");
PoolVector<Face3>::Read r = faces.read();
@@ -164,10 +163,8 @@ void MultiMeshEditor::_populate() {
area_accum += area;
}
- ERR_EXPLAIN(TTR("Couldn't map area."));
- ERR_FAIL_COND(triangle_area_map.size() == 0);
- ERR_EXPLAIN(TTR("Couldn't map area."));
- ERR_FAIL_COND(area_accum == 0);
+ ERR_FAIL_COND_MSG(triangle_area_map.size() == 0, "Couldn't map area.");
+ ERR_FAIL_COND_MSG(area_accum == 0, "Couldn't map area.");
Ref<MultiMesh> multimesh = memnew(MultiMesh);
multimesh->set_mesh(mesh);
diff --git a/editor/plugins/multimesh_editor_plugin.h b/editor/plugins/multimesh_editor_plugin.h
index fe87a2b9cb..5323441bd8 100644
--- a/editor/plugins/multimesh_editor_plugin.h
+++ b/editor/plugins/multimesh_editor_plugin.h
@@ -36,10 +36,6 @@
#include "scene/3d/multimesh_instance.h"
#include "scene/gui/spin_box.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class MultiMeshEditor : public Control {
GDCLASS(MultiMeshEditor, Control);
diff --git a/editor/plugins/navigation_polygon_editor_plugin.h b/editor/plugins/navigation_polygon_editor_plugin.h
index 336c28d642..2a387a8b1e 100644
--- a/editor/plugins/navigation_polygon_editor_plugin.h
+++ b/editor/plugins/navigation_polygon_editor_plugin.h
@@ -34,9 +34,6 @@
#include "editor/plugins/abstract_polygon_2d_editor.h"
#include "scene/2d/navigation_polygon.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class NavigationPolygonEditor : public AbstractPolygon2DEditor {
GDCLASS(NavigationPolygonEditor, AbstractPolygon2DEditor);
diff --git a/editor/plugins/particles_2d_editor_plugin.cpp b/editor/plugins/particles_2d_editor_plugin.cpp
index e68bca55cb..8025e12885 100644
--- a/editor/plugins/particles_2d_editor_plugin.cpp
+++ b/editor/plugins/particles_2d_editor_plugin.cpp
@@ -160,8 +160,7 @@ void Particles2DEditorPlugin::_generate_emission_mask() {
Ref<Image> img;
img.instance();
Error err = ImageLoader::load_image(source_emission_file, img);
- ERR_EXPLAIN(TTR("Error loading image:") + " " + source_emission_file);
- ERR_FAIL_COND(err != OK);
+ ERR_FAIL_COND_MSG(err != OK, "Error loading image: " + source_emission_file + ".");
if (img->is_compressed()) {
img->decompress();
@@ -269,8 +268,7 @@ void Particles2DEditorPlugin::_generate_emission_mask() {
valid_normals.resize(vpc);
}
- ERR_EXPLAIN(TTR("No pixels with transparency > 128 in image..."));
- ERR_FAIL_COND(valid_positions.size() == 0);
+ ERR_FAIL_COND_MSG(valid_positions.size() == 0, "No pixels with transparency > 128 in image...");
PoolVector<uint8_t> texdata;
diff --git a/editor/plugins/particles_editor_plugin.cpp b/editor/plugins/particles_editor_plugin.cpp
index 75d31459e8..31b0539bfe 100644
--- a/editor/plugins/particles_editor_plugin.cpp
+++ b/editor/plugins/particles_editor_plugin.cpp
@@ -55,8 +55,7 @@ bool ParticlesEditorBase::_generate(PoolVector<Vector3> &points, PoolVector<Vect
if (!triangle_area_map.size() || area_accum == 0) {
- err_dialog->set_text(TTR("Faces contain no area!"));
- err_dialog->popup_centered_minsize();
+ EditorNode::get_singleton()->show_warning(TTR("The geometry's faces don't contain any area."));
return false;
}
@@ -90,8 +89,7 @@ bool ParticlesEditorBase::_generate(PoolVector<Vector3> &points, PoolVector<Vect
if (gcount == 0) {
- err_dialog->set_text(TTR("No faces!"));
- err_dialog->popup_centered_minsize();
+ EditorNode::get_singleton()->show_warning(TTR("The geometry doesn't contain any faces."));
return false;
}
@@ -169,11 +167,16 @@ void ParticlesEditorBase::_node_selected(const NodePath &p_path) {
if (!sel)
return;
+ if (!sel->is_class("Spatial")) {
+
+ EditorNode::get_singleton()->show_warning(vformat(TTR("\"%s\" doesn't inherit from Spatial."), sel->get_name()));
+ return;
+ }
+
VisualInstance *vi = Object::cast_to<VisualInstance>(sel);
if (!vi) {
- err_dialog->set_text(TTR("Node does not contain geometry."));
- err_dialog->popup_centered_minsize();
+ EditorNode::get_singleton()->show_warning(vformat(TTR("\"%s\" doesn't contain geometry."), sel->get_name()));
return;
}
@@ -181,8 +184,7 @@ void ParticlesEditorBase::_node_selected(const NodePath &p_path) {
if (geometry.size() == 0) {
- err_dialog->set_text(TTR("Node does not contain geometry (faces)."));
- err_dialog->popup_centered_minsize();
+ EditorNode::get_singleton()->show_warning(vformat(TTR("\"%s\" doesn't contain face geometry."), sel->get_name()));
return;
}
@@ -231,9 +233,6 @@ ParticlesEditorBase::ParticlesEditorBase() {
emission_dialog->get_ok()->set_text(TTR("Create"));
emission_dialog->connect("confirmed", this, "_generate_emission_points");
- err_dialog = memnew(ConfirmationDialog);
- add_child(err_dialog);
-
emission_file_dialog = memnew(EditorFileDialog);
add_child(emission_file_dialog);
emission_file_dialog->connect("file_selected", this, "_resource_seleted");
diff --git a/editor/plugins/particles_editor_plugin.h b/editor/plugins/particles_editor_plugin.h
index 5d05fbd4ac..1b3a1877a4 100644
--- a/editor/plugins/particles_editor_plugin.h
+++ b/editor/plugins/particles_editor_plugin.h
@@ -36,10 +36,6 @@
#include "scene/3d/particles.h"
#include "scene/gui/spin_box.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class ParticlesEditorBase : public Control {
GDCLASS(ParticlesEditorBase, Control);
@@ -53,8 +49,6 @@ protected:
EditorFileDialog *emission_file_dialog;
SceneTreeDialog *emission_tree_dialog;
- ConfirmationDialog *err_dialog;
-
ConfirmationDialog *emission_dialog;
SpinBox *emission_amount;
OptionButton *emission_fill;
diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp
index b87bd29cbd..f02dc0bd6d 100644
--- a/editor/plugins/path_2d_editor_plugin.cpp
+++ b/editor/plugins/path_2d_editor_plugin.cpp
@@ -367,18 +367,18 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
void Path2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
- if (!node)
+ if (!node || !node->is_visible_in_tree() || !node->get_curve().is_valid())
return;
- if (!node->is_visible_in_tree())
- return;
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
- if (!node->get_curve().is_valid())
- return;
+ const Ref<Texture> path_sharp_handle = get_icon("EditorPathSharpHandle", "EditorIcons");
+ const Ref<Texture> path_smooth_handle = get_icon("EditorPathSmoothHandle", "EditorIcons");
+ // Both handle icons must be of the same size
+ const Size2 handle_size = path_sharp_handle->get_size();
- Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
- Ref<Texture> handle = get_icon("EditorHandle", "EditorIcons");
- Size2 handle_size = handle->get_size();
+ const Ref<Texture> curve_handle = get_icon("EditorCurveHandle", "EditorIcons");
+ const Size2 curve_handle_size = curve_handle->get_size();
Ref<Curve2D> curve = node->get_curve();
@@ -387,19 +387,35 @@ void Path2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
for (int i = 0; i < len; i++) {
Vector2 point = xform.xform(curve->get_point_position(i));
- vpc->draw_texture_rect(handle, Rect2(point - handle_size * 0.5, handle_size), false, Color(1, 1, 1, 1));
+ // Determines the point icon to be used
+ bool smooth = false;
if (i < len - 1) {
Vector2 pointout = xform.xform(curve->get_point_position(i) + curve->get_point_out(i));
- vpc->draw_line(point, pointout, Color(0.5, 0.5, 1.0, 0.8), 1.0);
- vpc->draw_texture_rect(handle, Rect2(pointout - handle_size * 0.5, handle_size), false, Color(1, 0.5, 1, 0.3));
+ if (point != pointout) {
+ smooth = true;
+ // Draw the line with a dark and light color to be visible on all backgrounds
+ vpc->draw_line(point, pointout, Color(0, 0, 0, 0.5), Math::round(EDSCALE), true);
+ vpc->draw_line(point, pointout, Color(1, 1, 1, 0.5), Math::round(EDSCALE), true);
+ vpc->draw_texture_rect(curve_handle, Rect2(pointout - curve_handle_size * 0.5, curve_handle_size), false, Color(1, 1, 1, 0.75));
+ }
}
if (i > 0) {
Vector2 pointin = xform.xform(curve->get_point_position(i) + curve->get_point_in(i));
- vpc->draw_line(point, pointin, Color(0.5, 0.5, 1.0, 0.8), 1.0);
- vpc->draw_texture_rect(handle, Rect2(pointin - handle_size * 0.5, handle_size), false, Color(1, 0.5, 1, 0.3));
+ if (point != pointin) {
+ smooth = true;
+ // Draw the line with a dark and light color to be visible on all backgrounds
+ vpc->draw_line(point, pointin, Color(0, 0, 0, 0.5), Math::round(EDSCALE), true);
+ vpc->draw_line(point, pointin, Color(1, 1, 1, 0.5), Math::round(EDSCALE), true);
+ vpc->draw_texture_rect(curve_handle, Rect2(pointin - curve_handle_size * 0.5, curve_handle_size), false, Color(1, 1, 1, 0.75));
+ }
}
+
+ vpc->draw_texture_rect(
+ smooth ? path_smooth_handle : path_sharp_handle,
+ Rect2(point - handle_size * 0.5, handle_size),
+ false);
}
if (on_edge) {
diff --git a/editor/plugins/path_2d_editor_plugin.h b/editor/plugins/path_2d_editor_plugin.h
index 44472f7a81..ecec5f5253 100644
--- a/editor/plugins/path_2d_editor_plugin.h
+++ b/editor/plugins/path_2d_editor_plugin.h
@@ -36,9 +36,6 @@
#include "scene/2d/path_2d.h"
#include "scene/gui/tool_button.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class CanvasItemEditor;
class Path2DEditor : public HBoxContainer {
diff --git a/editor/plugins/path_editor_plugin.cpp b/editor/plugins/path_editor_plugin.cpp
index 1ae5acc5ff..2493380585 100644
--- a/editor/plugins/path_editor_plugin.cpp
+++ b/editor/plugins/path_editor_plugin.cpp
@@ -652,7 +652,6 @@ PathSpatialGizmoPlugin::PathSpatialGizmoPlugin() {
Color path_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/path", Color(0.5, 0.5, 1.0, 0.8));
create_material("path_material", path_color);
- path_color.a = 0.4;
- create_material("path_thin_material", path_color);
+ create_material("path_thin_material", Color(0.5, 0.5, 0.5));
create_handle_material("handles");
}
diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp
index 59004a08c0..bd532a6418 100644
--- a/editor/plugins/polygon_2d_editor_plugin.cpp
+++ b/editor/plugins/polygon_2d_editor_plugin.cpp
@@ -1045,8 +1045,8 @@ void Polygon2DEditor::_uv_draw() {
}
}
- Ref<Texture> handle = get_icon("EditorHandle", "EditorIcons");
- Ref<Texture> internal_handle = get_icon("EditorInternalHandle", "EditorIcons");
+ // All UV points are sharp, so use the sharp handle icon
+ Ref<Texture> handle = get_icon("EditorPathSharpHandle", "EditorIcons");
Color poly_line_color = Color(0.9, 0.5, 0.5);
if (polygons.size() || polygon_create.size()) {
@@ -1120,7 +1120,8 @@ void Polygon2DEditor::_uv_draw() {
if (i < uv_draw_max) {
uv_edit_draw->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5);
} else {
- uv_edit_draw->draw_texture(internal_handle, mtx.xform(uvs[i]) - internal_handle->get_size() * 0.5);
+ // Internal vertex
+ uv_edit_draw->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5, Color(0.6, 0.8, 1));
}
}
}
diff --git a/editor/plugins/polygon_2d_editor_plugin.h b/editor/plugins/polygon_2d_editor_plugin.h
index 24ca2ea3f4..009501a70c 100644
--- a/editor/plugins/polygon_2d_editor_plugin.h
+++ b/editor/plugins/polygon_2d_editor_plugin.h
@@ -33,9 +33,7 @@
#include "editor/plugins/abstract_polygon_2d_editor.h"
#include "scene/gui/scroll_container.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class Polygon2DEditor : public AbstractPolygon2DEditor {
GDCLASS(Polygon2DEditor, AbstractPolygon2DEditor);
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index 1072c3cad1..413843d536 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -490,9 +490,6 @@ void ScriptEditor::_update_recent_scripts() {
Array rc = EditorSettings::get_singleton()->get_project_metadata("recent_files", "scripts", Array());
recent_scripts->clear();
- recent_scripts->add_shortcut(ED_SHORTCUT("script_editor/open_recent", TTR("Open Recent")));
- recent_scripts->add_separator();
-
String path;
for (int i = 0; i < rc.size(); i++) {
@@ -515,11 +512,6 @@ void ScriptEditor::_open_recent_script(int p_idx) {
return;
}
- // take two for the open recent button
- if (p_idx > 0) {
- p_idx -= 2;
- }
-
Array rc = EditorSettings::get_singleton()->get_project_metadata("recent_files", "scripts", Array());
ERR_FAIL_INDEX(p_idx, rc.size());
@@ -1000,7 +992,7 @@ void ScriptEditor::_menu_option(int p_option) {
file_dialog->clear_filters();
file_dialog->popup_centered_ratio();
- file_dialog->set_title(TTR("New TextFile..."));
+ file_dialog->set_title(TTR("New Text File..."));
} break;
case FILE_OPEN: {
file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
@@ -1749,10 +1741,10 @@ void ScriptEditor::_update_help_overview() {
void ScriptEditor::_update_script_colors() {
- bool script_temperature_enabled = EditorSettings::get_singleton()->get("text_editor/open_scripts/script_temperature_enabled");
- bool highlight_current = EditorSettings::get_singleton()->get("text_editor/open_scripts/highlight_current_script");
+ bool script_temperature_enabled = EditorSettings::get_singleton()->get("text_editor/script_list/script_temperature_enabled");
+ bool highlight_current = EditorSettings::get_singleton()->get("text_editor/script_list/highlight_current_script");
- int hist_size = EditorSettings::get_singleton()->get("text_editor/open_scripts/script_temperature_history_size");
+ int hist_size = EditorSettings::get_singleton()->get("text_editor/script_list/script_temperature_history_size");
Color hot_color = get_color("accent_color", "Editor");
Color cold_color = get_color("font_color", "Editor");
@@ -1767,7 +1759,7 @@ void ScriptEditor::_update_script_colors() {
bool current = tab_container->get_current_tab() == c;
if (current && highlight_current) {
- script_list->set_item_custom_bg_color(i, EditorSettings::get_singleton()->get("text_editor/open_scripts/current_script_background_color"));
+ script_list->set_item_custom_bg_color(i, EditorSettings::get_singleton()->get("text_editor/script_list/current_script_background_color"));
} else if (script_temperature_enabled) {
@@ -1800,9 +1792,9 @@ void ScriptEditor::_update_script_names() {
}
script_list->clear();
- bool split_script_help = EditorSettings::get_singleton()->get("text_editor/open_scripts/group_help_pages");
- ScriptSortBy sort_by = (ScriptSortBy)(int)EditorSettings::get_singleton()->get("text_editor/open_scripts/sort_scripts_by");
- ScriptListName display_as = (ScriptListName)(int)EditorSettings::get_singleton()->get("text_editor/open_scripts/list_script_names_as");
+ bool split_script_help = EditorSettings::get_singleton()->get("text_editor/script_list/group_help_pages");
+ ScriptSortBy sort_by = (ScriptSortBy)(int)EditorSettings::get_singleton()->get("text_editor/script_list/sort_scripts_by");
+ ScriptListName display_as = (ScriptListName)(int)EditorSettings::get_singleton()->get("text_editor/script_list/list_script_names_as");
Vector<_ScriptEditorItemData> sedata;
@@ -2326,7 +2318,7 @@ void ScriptEditor::_editor_settings_changed() {
convert_indent_on_save = EditorSettings::get_singleton()->get("text_editor/indent/convert_indent_on_save");
use_space_indentation = EditorSettings::get_singleton()->get("text_editor/indent/type");
- members_overview_enabled = EditorSettings::get_singleton()->get("text_editor/open_scripts/show_members_overview");
+ members_overview_enabled = EditorSettings::get_singleton()->get("text_editor/script_list/show_members_overview");
help_overview_enabled = EditorSettings::get_singleton()->get("text_editor/help/show_help_index");
_update_members_overview_visibility();
_update_help_overview_visibility();
@@ -3137,7 +3129,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
waiting_update_names = false;
pending_auto_reload = false;
auto_reload_running_scripts = true;
- members_overview_enabled = EditorSettings::get_singleton()->get("text_editor/open_scripts/show_members_overview");
+ members_overview_enabled = EditorSettings::get_singleton()->get("text_editor/script_list/show_members_overview");
help_overview_enabled = EditorSettings::get_singleton()->get("text_editor/help/show_help_index");
editor = p_editor;
@@ -3241,7 +3233,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
file_menu->set_switch_on_hover(true);
file_menu->get_popup()->set_hide_on_window_lose_focus(true);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new", TTR("New Script...")), FILE_NEW);
- file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new_textfile", TTR("New TextFile...")), FILE_NEW_TEXTFILE);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new_textfile", TTR("New Text File...")), FILE_NEW_TEXTFILE);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/open", TTR("Open...")), FILE_OPEN);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reopen_closed_script", TTR("Reopen Closed Script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_T), FILE_REOPEN_CLOSED);
file_menu->get_popup()->add_submenu_item(TTR("Open Recent"), "RecentScripts", FILE_OPEN_RECENT);
@@ -3274,17 +3266,20 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
theme_submenu->connect("id_pressed", this, "_theme_option");
theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/import_theme", TTR("Import Theme...")), THEME_IMPORT);
theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/reload_theme", TTR("Reload Theme")), THEME_RELOAD);
+
theme_submenu->add_separator();
theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/save_theme", TTR("Save Theme")), THEME_SAVE);
theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/save_theme_as", TTR("Save Theme As...")), THEME_SAVE_AS);
file_menu->get_popup()->add_separator();
- file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_docs", TTR("Close Docs")), CLOSE_DOCS);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_file", TTR("Close"), KEY_MASK_CMD | KEY_W), FILE_CLOSE);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_all", TTR("Close All")), CLOSE_ALL);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_other_tabs", TTR("Close Other Tabs")), CLOSE_OTHER_TABS);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_docs", TTR("Close Docs")), CLOSE_DOCS);
+
file_menu->get_popup()->add_separator();
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/run_file", TTR("Run"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_X), FILE_RUN);
+
file_menu->get_popup()->add_separator();
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/toggle_scripts_panel", TTR("Toggle Scripts Panel"), KEY_MASK_CMD | KEY_BACKSLASH), TOGGLE_SCRIPTS_PANEL);
file_menu->get_popup()->connect("id_pressed", this, "_menu_option");
@@ -3559,22 +3554,21 @@ ScriptEditorPlugin::ScriptEditorPlugin(EditorNode *p_node) {
EDITOR_DEF("text_editor/files/open_dominant_script_on_scene_change", true);
EDITOR_DEF("text_editor/external/use_external_editor", false);
EDITOR_DEF("text_editor/external/exec_path", "");
- EDITOR_DEF("text_editor/open_scripts/script_temperature_enabled", true);
- EDITOR_DEF("text_editor/open_scripts/highlight_current_script", true);
- EDITOR_DEF("text_editor/open_scripts/script_temperature_history_size", 15);
- EDITOR_DEF("text_editor/open_scripts/current_script_background_color", Color(1, 1, 1, 0.3));
- EDITOR_DEF("text_editor/open_scripts/group_help_pages", true);
- EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "text_editor/open_scripts/sort_scripts_by", PROPERTY_HINT_ENUM, "Name,Path,None"));
- EDITOR_DEF("text_editor/open_scripts/sort_scripts_by", 0);
- EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "text_editor/open_scripts/list_script_names_as", PROPERTY_HINT_ENUM, "Name,Parent Directory And Name,Full Path"));
- EDITOR_DEF("text_editor/open_scripts/list_script_names_as", 0);
+ EDITOR_DEF("text_editor/script_list/script_temperature_enabled", true);
+ EDITOR_DEF("text_editor/script_list/highlight_current_script", true);
+ EDITOR_DEF("text_editor/script_list/script_temperature_history_size", 15);
+ EDITOR_DEF("text_editor/script_list/current_script_background_color", Color(1, 1, 1, 0.3));
+ EDITOR_DEF("text_editor/script_list/group_help_pages", true);
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "text_editor/script_list/sort_scripts_by", PROPERTY_HINT_ENUM, "Name,Path,None"));
+ EDITOR_DEF("text_editor/script_list/sort_scripts_by", 0);
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "text_editor/script_list/list_script_names_as", PROPERTY_HINT_ENUM, "Name,Parent Directory And Name,Full Path"));
+ EDITOR_DEF("text_editor/script_list/list_script_names_as", 0);
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "text_editor/external/exec_path", PROPERTY_HINT_GLOBAL_FILE));
EDITOR_DEF("text_editor/external/exec_flags", "{file}");
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "text_editor/external/exec_flags", PROPERTY_HINT_PLACEHOLDER_TEXT, "Call flags with placeholders: {project}, {file}, {col}, {line}."));
ED_SHORTCUT("script_editor/reopen_closed_script", TTR("Reopen Closed Script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_T);
- ED_SHORTCUT("script_editor/open_recent", TTR("Open Recent"));
- ED_SHORTCUT("script_editor/clear_recent", TTR("Clear Recent Files"));
+ ED_SHORTCUT("script_editor/clear_recent", TTR("Clear Recent Scripts"));
}
ScriptEditorPlugin::~ScriptEditorPlugin() {
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp
index 87248c53b1..3b300a7ad5 100644
--- a/editor/plugins/script_text_editor.cpp
+++ b/editor/plugins/script_text_editor.cpp
@@ -1436,8 +1436,6 @@ bool ScriptTextEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_
return false;
}
-#ifdef TOOLS_ENABLED
-
static Node *_find_script_node(Node *p_edited_scene, Node *p_current_node, const Ref<Script> &script) {
if (p_edited_scene != p_current_node && p_current_node->get_owner() != p_edited_scene)
@@ -1457,14 +1455,6 @@ static Node *_find_script_node(Node *p_edited_scene, Node *p_current_node, const
return NULL;
}
-#else
-
-static Node *_find_script_node(Node *p_edited_scene, Node *p_current_node, const Ref<Script> &script) {
-
- return NULL;
-}
-#endif
-
void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
Dictionary d = p_data;
@@ -1656,16 +1646,17 @@ void ScriptTextEditor::_color_changed(const Color &p_color) {
void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p_foldable, bool p_open_docs, bool p_goto_definition) {
context_menu->clear();
- if (p_selection) {
- context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT);
- context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY);
- }
+ context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
+ context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
+ context_menu->add_separator();
+ context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT);
+ context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY);
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE);
+
context_menu->add_separator();
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL);
- context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
- context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
+
context_menu->add_separator();
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT);
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT);
@@ -1750,6 +1741,13 @@ ScriptTextEditor::ScriptTextEditor() {
color_panel->add_child(color_picker);
color_picker->connect("color_changed", this, "_color_changed");
+ // get default color picker mode from editor settings
+ int default_color_mode = EDITOR_GET("interface/inspector/default_color_picker_mode");
+ if (default_color_mode == 1)
+ color_picker->set_hsv_mode(true);
+ else if (default_color_mode == 2)
+ color_picker->set_raw_mode(true);
+
edit_hb = memnew(HBoxContainer);
edit_menu = memnew(MenuButton);
diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp
index 04820b8a8f..e81c97d5dd 100644
--- a/editor/plugins/shader_editor_plugin.cpp
+++ b/editor/plugins/shader_editor_plugin.cpp
@@ -55,6 +55,7 @@ void ShaderTextEditor::set_edited_shader(const Ref<Shader> &p_shader) {
_load_theme_settings();
get_text_edit()->set_text(p_shader->get_code());
+ get_text_edit()->clear_undo_history();
_validate_script();
_line_col_changed();
@@ -371,7 +372,7 @@ void ShaderEditor::_editor_settings_changed() {
shader_editor->get_text_edit()->set_indent_using_spaces(EditorSettings::get_singleton()->get("text_editor/indent/type"));
shader_editor->get_text_edit()->set_auto_indent(EditorSettings::get_singleton()->get("text_editor/indent/auto_indent"));
shader_editor->get_text_edit()->set_draw_tabs(EditorSettings::get_singleton()->get("text_editor/indent/draw_tabs"));
- shader_editor->get_text_edit()->set_show_line_numbers(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_line_numbers"));
+ shader_editor->get_text_edit()->set_show_line_numbers(EditorSettings::get_singleton()->get("text_editor/appearance/show_line_numbers"));
shader_editor->get_text_edit()->set_syntax_coloring(EditorSettings::get_singleton()->get("text_editor/highlighting/syntax_highlighting"));
shader_editor->get_text_edit()->set_highlight_all_occurrences(EditorSettings::get_singleton()->get("text_editor/highlighting/highlight_all_occurrences"));
shader_editor->get_text_edit()->set_highlight_current_line(EditorSettings::get_singleton()->get("text_editor/highlighting/highlight_current_line"));
@@ -379,8 +380,8 @@ void ShaderEditor::_editor_settings_changed() {
shader_editor->get_text_edit()->cursor_set_blink_speed(EditorSettings::get_singleton()->get("text_editor/cursor/caret_blink_speed"));
shader_editor->get_text_edit()->add_constant_override("line_spacing", EditorSettings::get_singleton()->get("text_editor/theme/line_spacing"));
shader_editor->get_text_edit()->cursor_set_block_mode(EditorSettings::get_singleton()->get("text_editor/cursor/block_caret"));
- shader_editor->get_text_edit()->set_smooth_scroll_enabled(EditorSettings::get_singleton()->get("text_editor/open_scripts/smooth_scrolling"));
- shader_editor->get_text_edit()->set_v_scroll_speed(EditorSettings::get_singleton()->get("text_editor/open_scripts/v_scroll_speed"));
+ shader_editor->get_text_edit()->set_smooth_scroll_enabled(EditorSettings::get_singleton()->get("text_editor/navigation/smooth_scrolling"));
+ shader_editor->get_text_edit()->set_v_scroll_speed(EditorSettings::get_singleton()->get("text_editor/navigation/v_scroll_speed"));
}
void ShaderEditor::_bind_methods() {
diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp
index 58234ba954..ecc631d045 100644
--- a/editor/plugins/spatial_editor_plugin.cpp
+++ b/editor/plugins/spatial_editor_plugin.cpp
@@ -74,14 +74,6 @@
#define MIN_FOV 0.01
#define MAX_FOV 179
-#ifdef TOOLS_ENABLED
-#define get_global_gizmo_transform get_global_gizmo_transform
-#define get_local_gizmo_transform get_local_gizmo_transform
-#else
-#define get_global_gizmo_transform get_global_transform
-#define get_local_gizmo_transform get_transform
-#endif
-
void SpatialEditorViewport::_update_camera(float p_interp_delta) {
bool is_orthogonal = camera->get_projection() == Camera::PROJECTION_ORTHOGONAL;
@@ -2373,16 +2365,22 @@ void SpatialEditorViewport::_draw() {
get_stylebox("Focus", "EditorStyles")->draw(surface->get_canvas_item(), r);
}
- RID ci = surface->get_canvas_item();
-
if (cursor.region_select) {
+ const Rect2 selection_rect = Rect2(cursor.region_begin, cursor.region_end - cursor.region_begin);
- VisualServer::get_singleton()->canvas_item_add_rect(
- ci,
- Rect2(cursor.region_begin, cursor.region_end - cursor.region_begin),
- get_color("accent_color", "Editor") * Color(1, 1, 1, 0.375));
+ surface->draw_rect(
+ selection_rect,
+ get_color("box_selection_fill_color", "Editor"));
+
+ surface->draw_rect(
+ selection_rect,
+ get_color("box_selection_stroke_color", "Editor"),
+ false,
+ Math::round(EDSCALE));
}
+ RID ci = surface->get_canvas_item();
+
if (message_time > 0) {
Ref<Font> font = get_font("font", "Label");
Point2 msgpos = Point2(5, get_size().y - 20);
@@ -3551,7 +3549,7 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed
view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_half_resolution", TTR("Half Resolution")), VIEW_HALF_RESOLUTION);
view_menu->get_popup()->add_separator();
view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_audio_listener", TTR("Audio Listener")), VIEW_AUDIO_LISTENER);
- view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_audio_doppler", TTR("Doppler Enable")), VIEW_AUDIO_DOPPLER);
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_audio_doppler", TTR("Enable Doppler")), VIEW_AUDIO_DOPPLER);
view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_GIZMOS), true);
view_menu->get_popup()->add_separator();
@@ -5170,7 +5168,7 @@ void SpatialEditor::snap_selected_nodes_to_floor() {
// We add a bit of margin to the from position to avoid it from snapping
// when the spatial is already on a floor and there's another floor under
// it
- from = from + Vector3(0.0, 0.1, 0.0);
+ from = from + Vector3(0.0, 0.2, 0.0);
Dictionary d;
@@ -5185,31 +5183,56 @@ void SpatialEditor::snap_selected_nodes_to_floor() {
Array keys = snap_data.keys();
- if (keys.size()) {
- undo_redo->create_action(TTR("Snap Nodes To Floor"));
+ // The maximum height an object can travel to be snapped
+ const float max_snap_height = 20.0;
+
+ // Will be set to `true` if at least one node from the selection was sucessfully snapped
+ bool snapped_to_floor = false;
+ if (keys.size()) {
+ // For snapping to be performed, there must be solid geometry under at least one of the selected nodes.
+ // We need to check this before snapping to register the undo/redo action only if needed.
for (int i = 0; i < keys.size(); i++) {
Node *node = keys[i];
Spatial *sp = Object::cast_to<Spatial>(node);
-
Dictionary d = snap_data[node];
Vector3 from = d["from"];
- Vector3 position_offset = d["position_offset"];
-
- Vector3 to = from - Vector3(0.0, 10.0, 0.0);
+ Vector3 to = from - Vector3(0.0, max_snap_height, 0.0);
Set<RID> excluded = _get_physics_bodies_rid(sp);
if (ss->intersect_ray(from, to, result, excluded)) {
- Transform new_transform = sp->get_global_transform();
- new_transform.origin.y = result.position.y;
- new_transform.origin = new_transform.origin - position_offset;
-
- undo_redo->add_do_method(sp, "set_global_transform", new_transform);
- undo_redo->add_undo_method(sp, "set_global_transform", sp->get_global_transform());
+ snapped_to_floor = true;
}
}
- undo_redo->commit_action();
+ if (snapped_to_floor) {
+ undo_redo->create_action(TTR("Snap Nodes To Floor"));
+
+ // Perform snapping if at least one node can be snapped
+ for (int i = 0; i < keys.size(); i++) {
+ Node *node = keys[i];
+ Spatial *sp = Object::cast_to<Spatial>(node);
+ Dictionary d = snap_data[node];
+ Vector3 from = d["from"];
+ Vector3 to = from - Vector3(0.0, max_snap_height, 0.0);
+ Set<RID> excluded = _get_physics_bodies_rid(sp);
+
+ if (ss->intersect_ray(from, to, result, excluded)) {
+ Vector3 position_offset = d["position_offset"];
+ Transform new_transform = sp->get_global_transform();
+
+ new_transform.origin.y = result.position.y;
+ new_transform.origin = new_transform.origin - position_offset;
+
+ undo_redo->add_do_method(sp, "set_global_transform", new_transform);
+ undo_redo->add_undo_method(sp, "set_global_transform", sp->get_global_transform());
+ }
+ }
+
+ undo_redo->commit_action();
+ } else {
+ EditorNode::get_singleton()->show_warning(TTR("Couldn't find a solid floor to snap the selection to."));
+ }
}
}
@@ -5219,42 +5242,6 @@ void SpatialEditor::_unhandled_key_input(Ref<InputEvent> p_event) {
return;
snap_key_enabled = Input::get_singleton()->is_key_pressed(KEY_CONTROL);
-
- Ref<InputEventKey> k = p_event;
-
- if (k.is_valid()) {
-
- // Note: need to check is_echo because first person movement keys might still be held
- if (!is_any_freelook_active() && !p_event->is_echo()) {
-
- if (!k->is_pressed())
- return;
-
- if (ED_IS_SHORTCUT("spatial_editor/tool_select", p_event)) {
- _menu_item_pressed(MENU_TOOL_SELECT);
- } else if (ED_IS_SHORTCUT("spatial_editor/tool_move", p_event)) {
- _menu_item_pressed(MENU_TOOL_MOVE);
- } else if (ED_IS_SHORTCUT("spatial_editor/tool_rotate", p_event)) {
- _menu_item_pressed(MENU_TOOL_ROTATE);
- } else if (ED_IS_SHORTCUT("spatial_editor/tool_scale", p_event)) {
- _menu_item_pressed(MENU_TOOL_SCALE);
- } else if (ED_IS_SHORTCUT("spatial_editor/snap_to_floor", p_event)) {
- snap_selected_nodes_to_floor();
- } else if (ED_IS_SHORTCUT("spatial_editor/local_coords", p_event)) {
- if (are_local_coords_enabled()) {
- _menu_item_toggled(false, MENU_TOOL_LOCAL_COORDS);
- } else {
- _menu_item_toggled(true, MENU_TOOL_LOCAL_COORDS);
- }
- } else if (ED_IS_SHORTCUT("spatial_editor/snap", p_event)) {
- if (is_snap_enabled()) {
- _menu_item_toggled(false, MENU_TOOL_USE_SNAP);
- } else {
- _menu_item_toggled(true, MENU_TOOL_USE_SNAP);
- }
- }
- }
- }
}
void SpatialEditor::_notification(int p_what) {
@@ -5303,6 +5290,10 @@ void SpatialEditor::_notification(int p_what) {
tool_button[SpatialEditor::TOOL_MODE_ROTATE]->set_icon(get_icon("ToolRotate", "EditorIcons"));
tool_button[SpatialEditor::TOOL_MODE_SCALE]->set_icon(get_icon("ToolScale", "EditorIcons"));
tool_button[SpatialEditor::TOOL_MODE_LIST_SELECT]->set_icon(get_icon("ListSelect", "EditorIcons"));
+ tool_button[SpatialEditor::TOOL_LOCK_SELECTED]->set_icon(get_icon("Lock", "EditorIcons"));
+ tool_button[SpatialEditor::TOOL_UNLOCK_SELECTED]->set_icon(get_icon("Unlock", "EditorIcons"));
+ tool_button[SpatialEditor::TOOL_GROUP_SELECTED]->set_icon(get_icon("Group", "EditorIcons"));
+ tool_button[SpatialEditor::TOOL_UNGROUP_SELECTED]->set_icon(get_icon("Ungroup", "EditorIcons"));
tool_option_button[SpatialEditor::TOOL_OPT_LOCAL_COORDS]->set_icon(get_icon("Object", "EditorIcons"));
tool_option_button[SpatialEditor::TOOL_OPT_USE_SNAP]->set_icon(get_icon("Snap", "EditorIcons"));
@@ -5528,7 +5519,8 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
tool_button[TOOL_MODE_SELECT]->set_pressed(true);
button_binds.write[0] = MENU_TOOL_SELECT;
tool_button[TOOL_MODE_SELECT]->connect("pressed", this, "_menu_item_pressed", button_binds);
- tool_button[TOOL_MODE_SELECT]->set_tooltip(TTR("Select Mode (Q)") + "\n" + keycode_get_string(KEY_MASK_CMD) + TTR("Drag: Rotate\nAlt+Drag: Move\nAlt+RMB: Depth list selection"));
+ tool_button[TOOL_MODE_SELECT]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_select", TTR("Select Mode"), KEY_Q));
+ tool_button[TOOL_MODE_SELECT]->set_tooltip(keycode_get_string(KEY_MASK_CMD) + TTR("Drag: Rotate\nAlt+Drag: Move\nAlt+RMB: Depth list selection"));
hbc_menu->add_child(memnew(VSeparator));
@@ -5538,7 +5530,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
tool_button[TOOL_MODE_MOVE]->set_flat(true);
button_binds.write[0] = MENU_TOOL_MOVE;
tool_button[TOOL_MODE_MOVE]->connect("pressed", this, "_menu_item_pressed", button_binds);
- tool_button[TOOL_MODE_MOVE]->set_tooltip(TTR("Move Mode (W)"));
+ tool_button[TOOL_MODE_MOVE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_move", TTR("Move Mode"), KEY_W));
tool_button[TOOL_MODE_ROTATE] = memnew(ToolButton);
hbc_menu->add_child(tool_button[TOOL_MODE_ROTATE]);
@@ -5546,7 +5538,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
tool_button[TOOL_MODE_ROTATE]->set_flat(true);
button_binds.write[0] = MENU_TOOL_ROTATE;
tool_button[TOOL_MODE_ROTATE]->connect("pressed", this, "_menu_item_pressed", button_binds);
- tool_button[TOOL_MODE_ROTATE]->set_tooltip(TTR("Rotate Mode (E)"));
+ tool_button[TOOL_MODE_ROTATE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_rotate", TTR("Rotate Mode"), KEY_E));
tool_button[TOOL_MODE_SCALE] = memnew(ToolButton);
hbc_menu->add_child(tool_button[TOOL_MODE_SCALE]);
@@ -5554,7 +5546,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
tool_button[TOOL_MODE_SCALE]->set_flat(true);
button_binds.write[0] = MENU_TOOL_SCALE;
tool_button[TOOL_MODE_SCALE]->connect("pressed", this, "_menu_item_pressed", button_binds);
- tool_button[TOOL_MODE_SCALE]->set_tooltip(TTR("Scale Mode (R)"));
+ tool_button[TOOL_MODE_SCALE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_scale", TTR("Scale Mode"), KEY_R));
hbc_menu->add_child(memnew(VSeparator));
@@ -5598,9 +5590,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_flat(true);
button_binds.write[0] = MENU_TOOL_LOCAL_COORDS;
tool_option_button[TOOL_OPT_LOCAL_COORDS]->connect("toggled", this, "_menu_item_toggled", button_binds);
- ED_SHORTCUT("spatial_editor/local_coords", TTR("Local Coords"), KEY_T);
- sct = ED_GET_SHORTCUT("spatial_editor/local_coords").ptr()->get_as_text();
- tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_tooltip(vformat(TTR("Local Space Mode (%s)"), sct));
+ tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_shortcut(ED_SHORTCUT("spatial_editor/local_coords", TTR("Use Local Space"), KEY_T));
tool_option_button[TOOL_OPT_USE_SNAP] = memnew(ToolButton);
hbc_menu->add_child(tool_option_button[TOOL_OPT_USE_SNAP]);
@@ -5608,9 +5598,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
tool_option_button[TOOL_OPT_USE_SNAP]->set_flat(true);
button_binds.write[0] = MENU_TOOL_USE_SNAP;
tool_option_button[TOOL_OPT_USE_SNAP]->connect("toggled", this, "_menu_item_toggled", button_binds);
- ED_SHORTCUT("spatial_editor/snap", TTR("Snap"), KEY_Y);
- sct = ED_GET_SHORTCUT("spatial_editor/snap").ptr()->get_as_text();
- tool_option_button[TOOL_OPT_USE_SNAP]->set_tooltip(vformat(TTR("Snap Mode (%s)"), sct));
+ tool_option_button[TOOL_OPT_USE_SNAP]->set_shortcut(ED_SHORTCUT("spatial_editor/snap", TTR("Use Snap"), KEY_Y));
hbc_menu->add_child(memnew(VSeparator));
@@ -5630,12 +5618,6 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
ED_SHORTCUT("spatial_editor/focus_selection", TTR("Focus Selection"), KEY_F);
ED_SHORTCUT("spatial_editor/align_transform_with_view", TTR("Align Transform with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_M);
ED_SHORTCUT("spatial_editor/align_rotation_with_view", TTR("Align Rotation with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_F);
-
- ED_SHORTCUT("spatial_editor/tool_select", TTR("Tool Select"), KEY_Q);
- ED_SHORTCUT("spatial_editor/tool_move", TTR("Tool Move"), KEY_W);
- ED_SHORTCUT("spatial_editor/tool_rotate", TTR("Tool Rotate"), KEY_E);
- ED_SHORTCUT("spatial_editor/tool_scale", TTR("Tool Scale"), KEY_R);
-
ED_SHORTCUT("spatial_editor/freelook_toggle", TTR("Toggle Freelook"), KEY_MASK_SHIFT + KEY_F);
PopupMenu *p;
@@ -5647,10 +5629,11 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
p = transform_menu->get_popup();
p->add_shortcut(ED_SHORTCUT("spatial_editor/snap_to_floor", TTR("Snap Object to Floor"), KEY_PAGEDOWN), MENU_SNAP_TO_FLOOR);
- p->add_shortcut(ED_SHORTCUT("spatial_editor/configure_snap", TTR("Configure Snap...")), MENU_TRANSFORM_CONFIGURE_SNAP);
- p->add_separator();
p->add_shortcut(ED_SHORTCUT("spatial_editor/transform_dialog", TTR("Transform Dialog...")), MENU_TRANSFORM_DIALOG);
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("spatial_editor/configure_snap", TTR("Configure Snap...")), MENU_TRANSFORM_CONFIGURE_SNAP);
+
p->connect("id_pressed", this, "_menu_item_pressed");
view_menu = memnew(MenuButton);
@@ -5674,11 +5657,11 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
p->add_submenu_item(TTR("Gizmos"), "GizmosMenu");
p->add_separator();
-
p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_origin", TTR("View Origin")), MENU_VIEW_ORIGIN);
p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_grid", TTR("View Grid")), MENU_VIEW_GRID);
+
p->add_separator();
- p->add_shortcut(ED_SHORTCUT("spatial_editor/settings", TTR("Settings")), MENU_VIEW_CAMERA_SETTINGS);
+ p->add_shortcut(ED_SHORTCUT("spatial_editor/settings", TTR("Settings...")), MENU_VIEW_CAMERA_SETTINGS);
p->set_item_checked(p->get_item_index(MENU_VIEW_ORIGIN), true);
p->set_item_checked(p->get_item_index(MENU_VIEW_GRID), true);
diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h
index 523573333b..728b67f6fa 100644
--- a/editor/plugins/spatial_editor_plugin.h
+++ b/editor/plugins/spatial_editor_plugin.h
@@ -37,9 +37,6 @@
#include "scene/3d/light.h"
#include "scene/3d/visual_instance.h"
#include "scene/gui/panel_container.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class Camera;
class SpatialEditor;
diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp
index 873b125200..3055a9382c 100644
--- a/editor/plugins/theme_editor_plugin.cpp
+++ b/editor/plugins/theme_editor_plugin.cpp
@@ -36,6 +36,7 @@
void ThemeEditor::edit(const Ref<Theme> &p_theme) {
theme = p_theme;
+ main_panel->set_theme(p_theme);
main_container->set_theme(p_theme);
}
@@ -53,6 +54,7 @@ void ThemeEditor::_propagate_redraw(Control *p_at) {
void ThemeEditor::_refresh_interval() {
+ _propagate_redraw(main_panel);
_propagate_redraw(main_container);
}
@@ -130,14 +132,14 @@ void ThemeEditor::_save_template_cbk(String fname) {
Map<String, _TECategory> categories;
- //fill types
+ // Fill types.
List<StringName> type_list;
Theme::get_default()->get_type_list(&type_list);
for (List<StringName>::Element *E = type_list.front(); E; E = E->next()) {
categories.insert(E->get(), _TECategory());
}
- //fill default theme
+ // Fill default theme.
for (Map<String, _TECategory>::Element *E = categories.front(); E; E = E->next()) {
_TECategory &tc = E->get();
@@ -189,11 +191,9 @@ void ThemeEditor::_save_template_cbk(String fname) {
}
FileAccess *file = FileAccess::open(filename, FileAccess::WRITE);
- if (!file) {
- ERR_EXPLAIN(TTR("Can't save theme to file:") + " " + filename);
- return;
- }
+ ERR_FAIL_COND_MSG(!file, "Can't save theme to file: " + filename + ".");
+
file->store_line("; ******************* ");
file->store_line("; Template Theme File ");
file->store_line("; ******************* ");
@@ -256,7 +256,7 @@ void ThemeEditor::_save_template_cbk(String fname) {
file->store_line("");
file->store_line("");
- //write default theme
+ // Write default theme.
for (Map<String, _TECategory>::Element *E = categories.front(); E; E = E->next()) {
_TECategory &tc = E->get();
@@ -501,7 +501,7 @@ void ThemeEditor::_theme_menu_cbk(int p_option) {
type_select_label->show();
type_select->show();
- if (p_option == POPUP_ADD) { //add
+ if (p_option == POPUP_ADD) { // Add.
add_del_dialog->set_title(TTR("Add Item"));
add_del_dialog->get_ok()->set_text(TTR("Add"));
@@ -509,7 +509,7 @@ void ThemeEditor::_theme_menu_cbk(int p_option) {
base_theme = Theme::get_default();
- } else if (p_option == POPUP_CLASS_ADD) { //add
+ } else if (p_option == POPUP_CLASS_ADD) { // Add.
add_del_dialog->set_title(TTR("Add All Items"));
add_del_dialog->get_ok()->set_text(TTR("Add All"));
@@ -552,12 +552,10 @@ void ThemeEditor::_theme_menu_cbk(int p_option) {
type_menu->get_popup()->clear();
- if (p_option == 0 || p_option == 1) { //add
+ if (p_option == 0 || p_option == 1) { // Add.
List<StringName> new_types;
theme->get_type_list(&new_types);
-
- //uh kind of sucks
for (List<StringName>::Element *F = new_types.front(); F; F = F->next()) {
bool found = false;
@@ -583,15 +581,17 @@ void ThemeEditor::_theme_menu_cbk(int p_option) {
void ThemeEditor::_notification(int p_what) {
- if (p_what == NOTIFICATION_PROCESS) {
-
- time_left -= get_process_delta_time();
- if (time_left < 0) {
- time_left = 1.5;
- _refresh_interval();
- }
- } else if (p_what == NOTIFICATION_THEME_CHANGED) {
- theme_menu->set_icon(get_icon("Theme", "EditorIcons"));
+ switch (p_what) {
+ case NOTIFICATION_PROCESS: {
+ time_left -= get_process_delta_time();
+ if (time_left < 0) {
+ time_left = 1.5;
+ _refresh_interval();
+ }
+ } break;
+ case NOTIFICATION_THEME_CHANGED: {
+ theme_menu->set_icon(get_icon("Theme", "EditorIcons"));
+ } break;
}
}
@@ -629,35 +629,34 @@ ThemeEditor::ThemeEditor() {
top_menu->add_child(theme_menu);
theme_menu->get_popup()->connect("id_pressed", this, "_theme_menu_cbk");
- scroll = memnew(ScrollContainer);
+ ScrollContainer *scroll = memnew(ScrollContainer);
add_child(scroll);
scroll->set_enable_v_scroll(true);
scroll->set_enable_h_scroll(false);
scroll->set_v_size_flags(SIZE_EXPAND_FILL);
- main_container = memnew(MarginContainer);
- scroll->add_child(main_container);
- main_container->set_clip_contents(true);
- main_container->set_custom_minimum_size(Size2(700, 0) * EDSCALE);
- main_container->set_v_size_flags(SIZE_EXPAND_FILL);
- main_container->set_h_size_flags(SIZE_EXPAND_FILL);
+ MarginContainer *root_container = memnew(MarginContainer);
+ scroll->add_child(root_container);
+ root_container->set_theme(Theme::get_default());
+ root_container->set_clip_contents(true);
+ root_container->set_custom_minimum_size(Size2(700, 0) * EDSCALE);
+ root_container->set_v_size_flags(SIZE_EXPAND_FILL);
+ root_container->set_h_size_flags(SIZE_EXPAND_FILL);
//// Preview Controls ////
- Panel *panel = memnew(Panel);
- main_container->add_child(panel);
- panel->set_theme(Theme::get_default());
+ main_panel = memnew(Panel);
+ root_container->add_child(main_panel);
- MarginContainer *mc = memnew(MarginContainer);
- main_container->add_child(mc);
- mc->set_theme(Theme::get_default());
- mc->add_constant_override("margin_right", 4 * EDSCALE);
- mc->add_constant_override("margin_top", 4 * EDSCALE);
- mc->add_constant_override("margin_left", 4 * EDSCALE);
- mc->add_constant_override("margin_bottom", 4 * EDSCALE);
+ main_container = memnew(MarginContainer);
+ root_container->add_child(main_container);
+ main_container->add_constant_override("margin_right", 4 * EDSCALE);
+ main_container->add_constant_override("margin_top", 4 * EDSCALE);
+ main_container->add_constant_override("margin_left", 4 * EDSCALE);
+ main_container->add_constant_override("margin_bottom", 4 * EDSCALE);
HBoxContainer *main_hb = memnew(HBoxContainer);
- mc->add_child(main_hb);
+ main_container->add_child(main_hb);
VBoxContainer *first_vb = memnew(VBoxContainer);
main_hb->add_child(first_vb);
diff --git a/editor/plugins/theme_editor_plugin.h b/editor/plugins/theme_editor_plugin.h
index cc236907a9..6ffee46569 100644
--- a/editor/plugins/theme_editor_plugin.h
+++ b/editor/plugins/theme_editor_plugin.h
@@ -45,7 +45,7 @@ class ThemeEditor : public VBoxContainer {
GDCLASS(ThemeEditor, VBoxContainer);
- ScrollContainer *scroll;
+ Panel *main_panel;
MarginContainer *main_container;
Ref<Theme> theme;
diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp
index b2f06ca41f..26fae96025 100644
--- a/editor/plugins/tile_map_editor_plugin.cpp
+++ b/editor/plugins/tile_map_editor_plugin.cpp
@@ -972,7 +972,7 @@ static inline Vector<Point2i> line(int x0, int x1, int y0, int y1) {
bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
- if (!node || !node->get_tileset().is_valid() || !node->is_visible_in_tree())
+ if (!node || !node->get_tileset().is_valid() || !node->is_visible_in_tree() || CanvasItemEditor::get_singleton()->get_current_tool() != CanvasItemEditor::TOOL_SELECT)
return false;
Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * node->get_global_transform();
@@ -1533,7 +1533,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
- if (!node)
+ if (!node || CanvasItemEditor::get_singleton()->get_current_tool() != CanvasItemEditor::TOOL_SELECT)
return;
Transform2D cell_xf = node->get_cell_transform();
@@ -2006,7 +2006,7 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
// Tools
paint_button = memnew(ToolButton);
paint_button->set_shortcut(ED_SHORTCUT("tile_map_editor/paint_tile", TTR("Paint Tile"), KEY_P));
- paint_button->set_tooltip(TTR("Shift+RMB: Line Draw\nShift+Ctrl+RMB: Rectangle Paint"));
+ paint_button->set_tooltip(TTR("Shift+LMB: Line Draw\nShift+Ctrl+LMB: Rectangle Paint"));
paint_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_NONE));
paint_button->set_toggle_mode(true);
toolbar->add_child(paint_button);
@@ -2136,6 +2136,7 @@ void TileMapEditorPlugin::make_visible(bool p_visible) {
tile_map_editor->show();
tile_map_editor->get_toolbar()->show();
tile_map_editor->get_toolbar_right()->show();
+ CanvasItemEditor::get_singleton()->set_current_tool(CanvasItemEditor::TOOL_SELECT); //Change to TOOL_SELECT when TileMap node is selected, to prevent accidental movement.
} else {
tile_map_editor->hide();
diff --git a/editor/plugins/tile_map_editor_plugin.h b/editor/plugins/tile_map_editor_plugin.h
index 3331fb971f..c841eb1f98 100644
--- a/editor/plugins/tile_map_editor_plugin.h
+++ b/editor/plugins/tile_map_editor_plugin.h
@@ -41,10 +41,6 @@
#include "scene/gui/menu_button.h"
#include "scene/gui/tool_button.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class TileMapEditor : public VBoxContainer {
GDCLASS(TileMapEditor, VBoxContainer);
diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp
index 1a27e749e2..9096a0e0be 100644
--- a/editor/plugins/tile_set_editor_plugin.cpp
+++ b/editor/plugins/tile_set_editor_plugin.cpp
@@ -176,6 +176,86 @@ Error TileSetEditor::update_library_file(Node *p_base_scene, Ref<TileSet> ml, bo
return OK;
}
+Variant TileSetEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
+
+ return false;
+}
+
+bool TileSetEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
+
+ Dictionary d = p_data;
+
+ if (!d.has("type"))
+ return false;
+
+ if (d.has("from") && (Object *)(d["from"]) == texture_list)
+ return false;
+
+ if (String(d["type"]) == "resource" && d.has("resource")) {
+ RES r = d["resource"];
+
+ Ref<Texture> texture = r;
+
+ if (texture.is_valid()) {
+
+ return true;
+ }
+ }
+
+ if (String(d["type"]) == "files") {
+
+ Vector<String> files = d["files"];
+
+ if (files.size() == 0)
+ return false;
+
+ for (int i = 0; i < files.size(); i++) {
+ String file = files[i];
+ String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
+
+ if (!ClassDB::is_parent_class(ftype, "Texture")) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ return false;
+}
+
+void TileSetEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
+
+ if (!can_drop_data_fw(p_point, p_data, p_from))
+ return;
+
+ Dictionary d = p_data;
+
+ if (!d.has("type"))
+ return;
+
+ if (String(d["type"]) == "resource" && d.has("resource")) {
+ RES r = d["resource"];
+
+ Ref<Texture> texture = r;
+
+ if (texture.is_valid())
+ add_texture(texture);
+
+ if (texture_list->get_item_count() > 0) {
+ update_texture_list_icon();
+ texture_list->select(texture_list->get_item_count() - 1);
+ _on_texture_list_selected(texture_list->get_item_count() - 1);
+ }
+ }
+
+ if (String(d["type"]) == "files") {
+
+ PoolVector<String> files = d["files"];
+
+ _on_textures_added(files);
+ }
+}
+
void TileSetEditor::_bind_methods() {
ClassDB::bind_method("_undo_redo_import_scene", &TileSetEditor::_undo_redo_import_scene);
@@ -203,6 +283,10 @@ void TileSetEditor::_bind_methods() {
ClassDB::bind_method("_select_edited_shape_coord", &TileSetEditor::_select_edited_shape_coord);
ClassDB::bind_method("_sort_tiles", &TileSetEditor::_sort_tiles);
+ ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &TileSetEditor::get_drag_data_fw);
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &TileSetEditor::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw"), &TileSetEditor::drop_data_fw);
+
ClassDB::bind_method("edit", &TileSetEditor::edit);
ClassDB::bind_method("add_texture", &TileSetEditor::add_texture);
ClassDB::bind_method("remove_texture", &TileSetEditor::remove_texture);
@@ -274,6 +358,7 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
texture_list->set_v_size_flags(SIZE_EXPAND_FILL);
texture_list->set_custom_minimum_size(Size2(200, 0));
texture_list->connect("item_selected", this, "_on_texture_list_selected");
+ texture_list->set_drag_forwarding(this);
HBoxContainer *tileset_toolbar_container = memnew(HBoxContainer);
left_container->add_child(tileset_toolbar_container);
@@ -646,8 +731,7 @@ void TileSetEditor::_on_textures_added(const PoolStringArray &p_paths) {
for (int i = 0; i < p_paths.size(); i++) {
Ref<Texture> t = Ref<Texture>(ResourceLoader::load(p_paths[i]));
- ERR_EXPLAIN("'" + p_paths[i] + "' is not a valid texture.");
- ERR_CONTINUE(!t.is_valid());
+ ERR_CONTINUE_MSG(!t.is_valid(), "'" + p_paths[i] + "' is not a valid texture.");
if (texture_map.has(t->get_rid())) {
invalid_count++;
diff --git a/editor/plugins/tile_set_editor_plugin.h b/editor/plugins/tile_set_editor_plugin.h
index 69ad8205a4..fff9ef7731 100644
--- a/editor/plugins/tile_set_editor_plugin.h
+++ b/editor/plugins/tile_set_editor_plugin.h
@@ -173,6 +173,12 @@ class TileSetEditor : public HSplitContainer {
static void _import_scene(Node *p_scene, Ref<TileSet> p_library, bool p_merge);
void _undo_redo_import_scene(Node *p_scene, bool p_merge);
+ bool _is_drop_valid(const Dictionary &p_drag_data, const Dictionary &p_item_data) const;
+ Variant get_drag_data_fw(const Point2 &p_point, Control *p_from);
+ bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
+ void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
+ void _file_load_request(const PoolVector<String> &p_path, int p_at_pos = -1);
+
protected:
static void _bind_methods();
void _notification(int p_what);
diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp
index 863cf75a93..6b338ca02b 100644
--- a/editor/plugins/visual_shader_editor_plugin.cpp
+++ b/editor/plugins/visual_shader_editor_plugin.cpp
@@ -41,6 +41,7 @@
#include "scene/gui/panel.h"
#include "scene/main/viewport.h"
#include "scene/resources/visual_shader_nodes.h"
+#include "servers/visual/shader_types.h"
Control *VisualShaderNodePlugin::create_editor(const Ref<Resource> &p_parent_resource, const Ref<VisualShaderNode> &p_node) {
@@ -69,8 +70,16 @@ void VisualShaderEditor::edit(VisualShader *p_visual_shader) {
}
}
visual_shader = Ref<VisualShader>(p_visual_shader);
+ if (!visual_shader->is_connected("changed", this, "_update_preview")) {
+ visual_shader->connect("changed", this, "_update_preview");
+ }
visual_shader->set_graph_offset(graph->get_scroll_ofs() / EDSCALE);
} else {
+ if (visual_shader.is_valid()) {
+ if (visual_shader->is_connected("changed", this, "")) {
+ visual_shader->disconnect("changed", this, "_update_preview");
+ }
+ }
visual_shader.unref();
}
@@ -79,7 +88,9 @@ void VisualShaderEditor::edit(VisualShader *p_visual_shader) {
} else {
if (changed) { // to avoid tree collapse
_clear_buffer();
+ _update_custom_nodes();
_update_options_menu();
+ _update_preview();
}
_update_graph();
}
@@ -95,31 +106,36 @@ void VisualShaderEditor::remove_plugin(const Ref<VisualShaderNodePlugin> &p_plug
plugins.erase(p_plugin);
}
-void VisualShaderEditor::add_custom_type(const String &p_name, const String &p_category, const Ref<Script> &p_script) {
-
+void VisualShaderEditor::clear_custom_types() {
for (int i = 0; i < add_options.size(); i++) {
- ERR_FAIL_COND(add_options[i].script == p_script);
+ if (add_options[i].is_custom) {
+ add_options.remove(i);
+ }
}
-
- AddOption ao;
- ao.name = p_name;
- ao.script = p_script;
- ao.category = p_category;
- add_options.push_back(ao);
-
- _update_options_menu();
}
-void VisualShaderEditor::remove_custom_type(const Ref<Script> &p_script) {
+void VisualShaderEditor::add_custom_type(const String &p_name, const Ref<Script> &p_script, const String &p_description, int p_return_icon_type, const String &p_category, const String &p_sub_category) {
+
+ ERR_FAIL_COND(!p_name.is_valid_identifier());
+ ERR_FAIL_COND(!p_script.is_valid());
for (int i = 0; i < add_options.size(); i++) {
- if (add_options[i].script == p_script) {
- add_options.remove(i);
- return;
+ if (add_options[i].is_custom) {
+ if (add_options[i].script == p_script)
+ return;
}
}
- _update_options_menu();
+ AddOption ao;
+ ao.name = p_name;
+ ao.script = p_script;
+ ao.return_type = p_return_icon_type;
+ ao.description = p_description;
+ ao.category = p_category;
+ ao.sub_category = p_sub_category;
+ ao.is_custom = true;
+
+ add_options.push_back(ao);
}
bool VisualShaderEditor::_is_available(int p_mode) {
@@ -162,6 +178,66 @@ bool VisualShaderEditor::_is_available(int p_mode) {
return (p_mode == -1 || (p_mode & current_mode) != 0);
}
+void VisualShaderEditor::_update_custom_nodes() {
+ clear_custom_types();
+ List<StringName> class_list;
+ ScriptServer::get_global_class_list(&class_list);
+ for (int i = 0; i < class_list.size(); i++) {
+ if (ScriptServer::get_global_class_native_base(class_list[i]) == "VisualShaderNodeCustom") {
+
+ String script_path = ScriptServer::get_global_class_path(class_list[i]);
+ Ref<Resource> res = ResourceLoader::load(script_path);
+ ERR_FAIL_COND(res.is_null());
+ ERR_FAIL_COND(!res->is_class("Script"));
+ Ref<Script> script = Ref<Script>(res);
+
+ Ref<VisualShaderNodeCustom> ref;
+ ref.instance();
+ ref->set_script(script.get_ref_ptr());
+
+ String name;
+ if (ref->has_method("_get_name")) {
+ name = (String)ref->call("_get_name");
+ } else {
+ name = "Unnamed";
+ }
+
+ String description = "";
+ if (ref->has_method("_get_description")) {
+ description = (String)ref->call("_get_description");
+ }
+
+ int return_icon_type = -1;
+ if (ref->has_method("_get_return_icon_type")) {
+ return_icon_type = (int)ref->call("_get_return_icon_type");
+ }
+
+ String category = "";
+ if (ref->has_method("_get_category")) {
+ category = (String)ref->call("_get_category");
+ }
+ if (category == "") {
+ category = "Custom";
+ }
+
+ String sub_category = "";
+ if (ref->has_method("_get_subcategory")) {
+ sub_category = (String)ref->call("_get_subcategory");
+ }
+
+ add_custom_type(name, script, description, return_icon_type, category, sub_category);
+ }
+ }
+}
+
+String VisualShaderEditor::_get_description(int p_idx) {
+ if (add_options[p_idx].highend) {
+ return TTR("(GLES3 only)") + " " + add_options[p_idx].description; // TODO: change it to (Vulkan Only) when its ready
+ } else {
+ return add_options[p_idx].description;
+ }
+}
+
void VisualShaderEditor::_update_options_menu() {
node_desc->set_text("");
@@ -265,11 +341,10 @@ void VisualShaderEditor::_update_options_menu() {
else if (add_options[i].highend)
item->set_custom_color(0, supported_color);
item->set_text(0, add_options[i].name);
- if (p_category == sub_category) {
- if (is_first_item) {
- item->select(0);
- is_first_item = false;
- }
+ if (is_first_item && use_filter) {
+ item->select(0);
+ node_desc->set_text(_get_description(i));
+ is_first_item = false;
}
switch (add_options[i].return_type) {
case VisualShaderNode::PORT_TYPE_SCALAR:
@@ -284,7 +359,7 @@ void VisualShaderEditor::_update_options_menu() {
case VisualShaderNode::PORT_TYPE_TRANSFORM:
item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_icon("Transform", "EditorIcons"));
break;
- case VisualShaderNode::PORT_TYPE_COLOR:
+ case VisualShaderNode::PORT_TYPE_ICON_COLOR:
item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_icon("Color", "EditorIcons"));
break;
default:
@@ -335,6 +410,7 @@ void VisualShaderEditor::_update_created_node(GraphNode *node) {
node->add_color_override("title_color", c);
c.a = 0.7;
node->add_color_override("close_color", c);
+ node->add_color_override("resizer_color", c);
}
}
@@ -466,21 +542,23 @@ void VisualShaderEditor::_update_graph() {
offset->set_custom_minimum_size(Size2(0, 6 * EDSCALE));
node->add_child(offset);
- HBoxContainer *hb2 = memnew(HBoxContainer);
+ if (group_node->is_editable()) {
+ HBoxContainer *hb2 = memnew(HBoxContainer);
- Button *add_input_btn = memnew(Button);
- add_input_btn->set_text(TTR("Add input +"));
- add_input_btn->connect("pressed", this, "_add_input_port", varray(nodes[n_i], group_node->get_free_input_port_id(), VisualShaderNode::PORT_TYPE_VECTOR, "input" + itos(group_node->get_free_input_port_id())), CONNECT_DEFERRED);
- hb2->add_child(add_input_btn);
+ Button *add_input_btn = memnew(Button);
+ add_input_btn->set_text(TTR("Add input +"));
+ add_input_btn->connect("pressed", this, "_add_input_port", varray(nodes[n_i], group_node->get_free_input_port_id(), VisualShaderNode::PORT_TYPE_VECTOR, "input" + itos(group_node->get_free_input_port_id())), CONNECT_DEFERRED);
+ hb2->add_child(add_input_btn);
- hb2->add_spacer();
+ hb2->add_spacer();
- Button *add_output_btn = memnew(Button);
- add_output_btn->set_text(TTR("Add output +"));
- add_output_btn->connect("pressed", this, "_add_output_port", varray(nodes[n_i], group_node->get_free_output_port_id(), VisualShaderNode::PORT_TYPE_VECTOR, "output" + itos(group_node->get_free_output_port_id())), CONNECT_DEFERRED);
- hb2->add_child(add_output_btn);
+ Button *add_output_btn = memnew(Button);
+ add_output_btn->set_text(TTR("Add output +"));
+ add_output_btn->connect("pressed", this, "_add_output_port", varray(nodes[n_i], group_node->get_free_output_port_id(), VisualShaderNode::PORT_TYPE_VECTOR, "output" + itos(group_node->get_free_output_port_id())), CONNECT_DEFERRED);
+ hb2->add_child(add_output_btn);
- node->add_child(hb2);
+ node->add_child(hb2);
+ }
}
for (int i = 0; i < MAX(vsnode->get_input_port_count(), vsnode->get_output_port_count()); i++) {
@@ -942,8 +1020,10 @@ void VisualShaderEditor::_expression_focus_out(Object *text_edit, int p_node) {
}
void VisualShaderEditor::_rebuild() {
- EditorNode::get_singleton()->get_log()->clear();
- visual_shader->rebuild();
+ if (visual_shader != NULL) {
+ EditorNode::get_singleton()->get_log()->clear();
+ visual_shader->rebuild();
+ }
}
void VisualShaderEditor::_set_node_size(int p_type, int p_node, const Vector2 &p_size) {
@@ -1139,7 +1219,9 @@ void VisualShaderEditor::_add_node(int p_idx, int p_op_idx) {
Ref<VisualShaderNode> vsnode;
- if (add_options[p_idx].type != String()) {
+ bool is_custom = add_options[p_idx].is_custom;
+
+ if (!is_custom && add_options[p_idx].type != String()) {
VisualShaderNode *vsn = Object::cast_to<VisualShaderNode>(ClassDB::instance(add_options[p_idx].type));
ERR_FAIL_COND(!vsn);
@@ -1504,6 +1586,32 @@ void VisualShaderEditor::_notification(int p_what) {
node_filter->set_right_icon(Control::get_icon("Search", "EditorIcons"));
+ preview_shader->set_icon(Control::get_icon("Shader", "EditorIcons"));
+
+ {
+ Color background_color = EDITOR_GET("text_editor/highlighting/background_color");
+ Color text_color = EDITOR_GET("text_editor/highlighting/text_color");
+ Color keyword_color = EDITOR_GET("text_editor/highlighting/keyword_color");
+ Color comment_color = EDITOR_GET("text_editor/highlighting/comment_color");
+ Color symbol_color = EDITOR_GET("text_editor/highlighting/symbol_color");
+
+ preview_text->add_color_override("background_color", background_color);
+
+ for (List<String>::Element *E = keyword_list.front(); E; E = E->next()) {
+
+ preview_text->add_keyword_color(E->get(), keyword_color);
+ }
+
+ preview_text->add_font_override("font", get_font("expression", "EditorFonts"));
+ preview_text->add_color_override("font_color", text_color);
+ preview_text->add_color_override("symbol_color", symbol_color);
+ preview_text->add_color_region("/*", "*/", comment_color, false);
+ preview_text->add_color_region("//", "", comment_color, false);
+
+ error_text->add_font_override("font", get_font("status_source", "EditorFonts"));
+ error_text->add_color_override("font_color", get_color("error_color", "Editor"));
+ }
+
tools->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("Tools", "EditorIcons"));
if (p_what == NOTIFICATION_THEME_CHANGED && is_visible_in_tree())
@@ -1830,11 +1938,7 @@ void VisualShaderEditor::_member_selected() {
if (item != NULL && item->has_meta("id")) {
members_dialog->get_ok()->set_disabled(false);
- if (add_options[item->get_meta("id")].highend) {
- node_desc->set_text(TTR("(GLES3 only)") + " " + add_options[item->get_meta("id")].description); // TODO: change it to (Vulkan Only) when its ready
- } else {
- node_desc->set_text(add_options[item->get_meta("id")].description);
- }
+ node_desc->set_text(_get_description(item->get_meta("id")));
} else {
members_dialog->get_ok()->set_disabled(true);
node_desc->set_text("");
@@ -1954,6 +2058,48 @@ void VisualShaderEditor::drop_data_fw(const Point2 &p_point, const Variant &p_da
}
}
+void VisualShaderEditor::_show_preview_text() {
+ preview_showed = !preview_showed;
+ preview_vbox->set_visible(preview_showed);
+ if (preview_showed) {
+ if (pending_update_preview) {
+ _update_preview();
+ pending_update_preview = false;
+ }
+ }
+}
+
+void VisualShaderEditor::_update_preview() {
+
+ if (!preview_showed) {
+ pending_update_preview = true;
+ return;
+ }
+
+ String code = visual_shader->get_code();
+
+ preview_text->set_text(code);
+
+ ShaderLanguage sl;
+
+ Error err = sl.compile(code, ShaderTypes::get_singleton()->get_functions(VisualServer::ShaderMode(visual_shader->get_mode())), ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(visual_shader->get_mode())), ShaderTypes::get_singleton()->get_types());
+
+ for (int i = 0; i < preview_text->get_line_count(); i++) {
+ preview_text->set_line_as_marked(i, false);
+ }
+ if (err != OK) {
+ preview_text->set_line_as_marked(sl.get_error_line() - 1, true);
+ error_text->set_visible(true);
+
+ String text = "error(" + itos(sl.get_error_line()) + "): " + sl.get_error_text();
+ error_text->set_text(text);
+ shader_error = true;
+ } else {
+ error_text->set_visible(false);
+ shader_error = false;
+ }
+}
+
void VisualShaderEditor::_bind_methods() {
ClassDB::bind_method("_rebuild", &VisualShaderEditor::_rebuild);
ClassDB::bind_method("_update_graph", &VisualShaderEditor::_update_graph);
@@ -1993,6 +2139,8 @@ void VisualShaderEditor::_bind_methods() {
ClassDB::bind_method("_node_resized", &VisualShaderEditor::_node_resized);
ClassDB::bind_method("_set_node_size", &VisualShaderEditor::_set_node_size);
ClassDB::bind_method("_clear_buffer", &VisualShaderEditor::_clear_buffer);
+ ClassDB::bind_method("_show_preview_text", &VisualShaderEditor::_show_preview_text);
+ ClassDB::bind_method("_update_preview", &VisualShaderEditor::_update_preview);
ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &VisualShaderEditor::get_drag_data_fw);
ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &VisualShaderEditor::can_drop_data_fw);
@@ -2019,13 +2167,25 @@ VisualShaderEditor::VisualShaderEditor() {
saved_node_pos = Point2(0, 0);
ShaderLanguage::get_keyword_list(&keyword_list);
+ preview_showed = false;
+ pending_update_preview = false;
+ shader_error = false;
+
to_node = -1;
to_slot = -1;
from_node = -1;
from_slot = -1;
+ main_box = memnew(HSplitContainer);
+ main_box->set_v_size_flags(SIZE_EXPAND_FILL);
+ main_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ add_child(main_box);
+
graph = memnew(GraphEdit);
- add_child(graph);
+ graph->get_zoom_hbox()->set_h_size_flags(SIZE_EXPAND_FILL);
+ graph->set_v_size_flags(SIZE_EXPAND_FILL);
+ graph->set_h_size_flags(SIZE_EXPAND_FILL);
+ main_box->add_child(graph);
graph->set_drag_forwarding(this);
graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_SCALAR);
graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_BOOLEAN);
@@ -2074,6 +2234,32 @@ VisualShaderEditor::VisualShaderEditor() {
graph->get_zoom_hbox()->move_child(add_node, 0);
add_node->connect("pressed", this, "_show_members_dialog", varray(false));
+ preview_shader = memnew(ToolButton);
+ preview_shader->set_toggle_mode(true);
+ preview_shader->set_tooltip(TTR("Show resulted shader code."));
+ graph->get_zoom_hbox()->add_child(preview_shader);
+ preview_shader->connect("pressed", this, "_show_preview_text");
+
+ ///////////////////////////////////////
+ // PREVIEW PANEL
+ ///////////////////////////////////////
+
+ preview_vbox = memnew(VBoxContainer);
+ preview_vbox->set_visible(preview_showed);
+ main_box->add_child(preview_vbox);
+ preview_text = memnew(TextEdit);
+ preview_vbox->add_child(preview_text);
+ preview_text->set_h_size_flags(SIZE_EXPAND_FILL);
+ preview_text->set_v_size_flags(SIZE_EXPAND_FILL);
+ preview_text->set_custom_minimum_size(Size2(400 * EDSCALE, 0));
+ preview_text->set_syntax_coloring(true);
+ preview_text->set_show_line_numbers(true);
+ preview_text->set_readonly(true);
+
+ error_text = memnew(Label);
+ preview_vbox->add_child(error_text);
+ error_text->set_visible(false);
+
///////////////////////////////////////
// SHADER NODES TREE
///////////////////////////////////////
@@ -2164,8 +2350,8 @@ VisualShaderEditor::VisualShaderEditor() {
add_options.push_back(AddOption("Screen", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Screen operator."), VisualShaderNodeColorOp::OP_SCREEN, VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("SoftLight", "Color", "Operators", "VisualShaderNodeColorOp", TTR("SoftLight operator."), VisualShaderNodeColorOp::OP_SOFT_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR));
- add_options.push_back(AddOption("ColorConstant", "Color", "Variables", "VisualShaderNodeColorConstant", TTR("Color constant."), -1, VisualShaderNode::PORT_TYPE_COLOR));
- add_options.push_back(AddOption("ColorUniform", "Color", "Variables", "VisualShaderNodeColorUniform", TTR("Color uniform."), -1, VisualShaderNode::PORT_TYPE_COLOR));
+ add_options.push_back(AddOption("ColorConstant", "Color", "Variables", "VisualShaderNodeColorConstant", TTR("Color constant."), -1, VisualShaderNode::PORT_TYPE_ICON_COLOR));
+ add_options.push_back(AddOption("ColorUniform", "Color", "Variables", "VisualShaderNodeColorUniform", TTR("Color uniform."), -1, VisualShaderNode::PORT_TYPE_ICON_COLOR));
// CONDITIONAL
@@ -2351,8 +2537,8 @@ VisualShaderEditor::VisualShaderEditor() {
add_options.push_back(AddOption("Sin", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the sine of the parameter."), VisualShaderNodeScalarFunc::FUNC_SIN, VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("SinH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the hyperbolic sine of the parameter."), VisualShaderNodeScalarFunc::FUNC_SINH, VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Sqrt", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the square root of the parameter."), VisualShaderNodeScalarFunc::FUNC_SQRT, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("SmoothStep", "Scalar", "Functions", "VisualShaderNodeScalarSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Step", "Scalar", "Functions", "VisualShaderNodeScalarOp", TTR("Step function( scalar(edge), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."), VisualShaderNodeScalarOp::OP_STEP, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("SmoothStep", "Scalar", "Functions", "VisualShaderNodeScalarSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Step", "Scalar", "Functions", "VisualShaderNodeScalarOp", TTR("Step function( scalar(edge), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), VisualShaderNodeScalarOp::OP_STEP, VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Tan", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the tangent of the parameter."), VisualShaderNodeScalarFunc::FUNC_TAN, VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("TanH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the hyperbolic tangent of the parameter."), VisualShaderNodeScalarFunc::FUNC_TANH, VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Trunc", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Finds the truncated value of the parameter."), VisualShaderNodeScalarFunc::FUNC_TRUNC, VisualShaderNode::PORT_TYPE_SCALAR));
@@ -2368,12 +2554,12 @@ VisualShaderEditor::VisualShaderEditor() {
// TEXTURES
- add_options.push_back(AddOption("CubeMap", "Textures", "Functions", "VisualShaderNodeCubeMap", TTR("Perform the cubic texture lookup."), -1, VisualShaderNode::PORT_TYPE_COLOR));
- add_options.push_back(AddOption("Texture", "Textures", "Functions", "VisualShaderNodeTexture", TTR("Perform the texture lookup."), -1, VisualShaderNode::PORT_TYPE_COLOR));
+ add_options.push_back(AddOption("CubeMap", "Textures", "Functions", "VisualShaderNodeCubeMap", TTR("Perform the cubic texture lookup."), -1, VisualShaderNode::PORT_TYPE_ICON_COLOR));
+ add_options.push_back(AddOption("Texture", "Textures", "Functions", "VisualShaderNodeTexture", TTR("Perform the texture lookup."), -1, VisualShaderNode::PORT_TYPE_ICON_COLOR));
- add_options.push_back(AddOption("CubeMapUniform", "Textures", "Variables", "VisualShaderNodeCubeMapUniform", TTR("Cubic texture uniform lookup."), -1, VisualShaderNode::PORT_TYPE_COLOR));
- add_options.push_back(AddOption("TextureUniform", "Textures", "Variables", "VisualShaderNodeTextureUniform", TTR("2D texture uniform lookup."), -1, VisualShaderNode::PORT_TYPE_COLOR));
- add_options.push_back(AddOption("TextureUniformTriplanar", "Textures", "Variables", "VisualShaderNodeTextureUniformTriplanar", TTR("2D texture uniform lookup with triplanar."), -1, VisualShaderNode::PORT_TYPE_COLOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("CubeMapUniform", "Textures", "Variables", "VisualShaderNodeCubeMapUniform", TTR("Cubic texture uniform lookup."), -1, VisualShaderNode::PORT_TYPE_ICON_COLOR));
+ add_options.push_back(AddOption("TextureUniform", "Textures", "Variables", "VisualShaderNodeTextureUniform", TTR("2D texture uniform lookup."), -1, VisualShaderNode::PORT_TYPE_ICON_COLOR));
+ add_options.push_back(AddOption("TextureUniformTriplanar", "Textures", "Variables", "VisualShaderNodeTextureUniformTriplanar", TTR("2D texture uniform lookup with triplanar."), -1, VisualShaderNode::PORT_TYPE_ICON_COLOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
// TRANSFORM
@@ -2384,7 +2570,7 @@ VisualShaderEditor::VisualShaderEditor() {
add_options.push_back(AddOption("TransformDecompose", "Transform", "Composition", "VisualShaderNodeTransformDecompose", TTR("Decomposes transform to four vectors.")));
add_options.push_back(AddOption("Determinant", "Transform", "Functions", "VisualShaderNodeDeterminant", TTR("Calculates the determinant of a transform."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Inverse", "Transform", "Functions", "VisualShaderNodeTransformFunc", TTR("Calculates the inverse of a transform."), VisualShaderNodeTransformFunc::FUNC_INVERSE, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, -1, -1, true));
+ add_options.push_back(AddOption("Inverse", "Transform", "Functions", "VisualShaderNodeTransformFunc", TTR("Calculates the inverse of a transform."), VisualShaderNodeTransformFunc::FUNC_INVERSE, VisualShaderNode::PORT_TYPE_TRANSFORM));
add_options.push_back(AddOption("Transpose", "Transform", "Functions", "VisualShaderNodeTransformFunc", TTR("Calculates the transpose of a transform."), VisualShaderNodeTransformFunc::FUNC_TRANSPOSE, VisualShaderNode::PORT_TYPE_TRANSFORM));
add_options.push_back(AddOption("TransformMult", "Transform", "Operators", "VisualShaderNodeTransformMult", TTR("Multiplies transform by transform."), -1, VisualShaderNode::PORT_TYPE_TRANSFORM));
@@ -2445,10 +2631,10 @@ VisualShaderEditor::VisualShaderEditor() {
add_options.push_back(AddOption("Sin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the sine of the parameter."), VisualShaderNodeVectorFunc::FUNC_SIN, VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("SinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic sine of the parameter."), VisualShaderNodeVectorFunc::FUNC_SINH, VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Sqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the square root of the parameter."), VisualShaderNodeVectorFunc::FUNC_SQRT, VisualShaderNode::PORT_TYPE_VECTOR));
- add_options.push_back(AddOption("SmoothStep", "Vector", "Functions", "VisualShaderNodeVectorSmoothStep", TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), -1, VisualShaderNode::PORT_TYPE_VECTOR));
- add_options.push_back(AddOption("SmoothStepS", "Vector", "Functions", "VisualShaderNodeVectorScalarSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), -1, VisualShaderNode::PORT_TYPE_VECTOR));
- add_options.push_back(AddOption("Step", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Step function( vector(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."), VisualShaderNodeVectorOp::OP_STEP, VisualShaderNode::PORT_TYPE_VECTOR));
- add_options.push_back(AddOption("StepS", "Vector", "Functions", "VisualShaderNodeVectorScalarStep", TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."), -1, VisualShaderNode::PORT_TYPE_VECTOR));
+ add_options.push_back(AddOption("SmoothStep", "Vector", "Functions", "VisualShaderNodeVectorSmoothStep", TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), -1, VisualShaderNode::PORT_TYPE_VECTOR));
+ add_options.push_back(AddOption("SmoothStepS", "Vector", "Functions", "VisualShaderNodeVectorScalarSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), -1, VisualShaderNode::PORT_TYPE_VECTOR));
+ add_options.push_back(AddOption("Step", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Step function( vector(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), VisualShaderNodeVectorOp::OP_STEP, VisualShaderNode::PORT_TYPE_VECTOR));
+ add_options.push_back(AddOption("StepS", "Vector", "Functions", "VisualShaderNodeVectorScalarStep", TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), -1, VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Tan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the tangent of the parameter."), VisualShaderNodeVectorFunc::FUNC_TAN, VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("TanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic tangent of the parameter."), VisualShaderNodeVectorFunc::FUNC_TANH, VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Trunc", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the truncated value of the parameter."), VisualShaderNodeVectorFunc::FUNC_TRUNC, VisualShaderNode::PORT_TYPE_VECTOR));
@@ -2466,6 +2652,7 @@ VisualShaderEditor::VisualShaderEditor() {
add_options.push_back(AddOption("Expression", "Special", "", "VisualShaderNodeExpression", TTR("Custom Godot Shader Language expression, with custom amount of input and output ports. This is a direct injection of code into the vertex/fragment/light function, do not use it to write the function declarations inside.")));
add_options.push_back(AddOption("Fresnel", "Special", "", "VisualShaderNodeFresnel", TTR("Returns falloff based on the dot product of surface normal and view direction of camera (pass associated inputs to it)."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("GlobalExpression", "Special", "", "VisualShaderNodeGlobalExpression", TTR("Custom Godot Shader Language expression, which placed on top of the resulted shader. You can place various function definitions inside and call it later in the Expressions. You can also declare varyings, uniforms and constants.")));
add_options.push_back(AddOption("ScalarDerivativeFunc", "Special", "Common", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) Scalar derivative function."), -1, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true));
add_options.push_back(AddOption("VectorDerivativeFunc", "Special", "Common", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) Vector derivative function."), -1, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true));
diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h
index d2b1e8bc45..cd5efc366b 100644
--- a/editor/plugins/visual_shader_editor_plugin.h
+++ b/editor/plugins/visual_shader_editor_plugin.h
@@ -60,14 +60,22 @@ class VisualShaderEditor : public VBoxContainer {
int editing_port;
Ref<VisualShader> visual_shader;
+ HSplitContainer *main_box;
GraphEdit *graph;
ToolButton *add_node;
+ ToolButton *preview_shader;
OptionButton *edit_type;
PanelContainer *error_panel;
Label *error_label;
+ bool pending_update_preview;
+ bool shader_error;
+ VBoxContainer *preview_vbox;
+ TextEdit *preview_text;
+ Label *error_text;
+
UndoRedo *undo_redo;
Point2 saved_node_pos;
bool saved_node_pos_dirty;
@@ -75,6 +83,8 @@ class VisualShaderEditor : public VBoxContainer {
ConfirmationDialog *members_dialog;
MenuButton *tools;
+ bool preview_showed;
+
enum ToolsMenuOptions {
EXPAND_ALL,
COLLAPSE_ALL
@@ -104,6 +114,7 @@ class VisualShaderEditor : public VBoxContainer {
int func;
float value;
bool highend;
+ bool is_custom;
AddOption(const String &p_name = String(), const String &p_category = String(), const String &p_sub_category = String(), const String &p_type = String(), const String &p_description = String(), int p_sub_func = -1, int p_return_type = -1, int p_mode = -1, int p_func = -1, float p_value = -1, bool p_highend = false) {
name = p_name;
@@ -117,6 +128,7 @@ class VisualShaderEditor : public VBoxContainer {
func = p_func;
value = p_value;
highend = p_highend;
+ is_custom = false;
}
AddOption(const String &p_name, const String &p_category, const String &p_sub_category, const String &p_type, const String &p_description, const String &p_sub_func, int p_return_type = -1, int p_mode = -1, int p_func = -1, float p_value = -1, bool p_highend = false) {
@@ -131,6 +143,7 @@ class VisualShaderEditor : public VBoxContainer {
func = p_func;
value = p_value;
highend = p_highend;
+ is_custom = false;
}
};
@@ -140,8 +153,13 @@ class VisualShaderEditor : public VBoxContainer {
void _draw_color_over_button(Object *obj, Color p_color);
void _add_node(int p_idx, int p_op_idx = -1);
+ void _update_custom_nodes();
void _update_options_menu();
+ void _show_preview_text();
+ void _update_preview();
+ String _get_description(int p_idx);
+
static VisualShaderEditor *singleton;
void _node_dragged(const Vector2 &p_from, const Vector2 &p_to, int p_node);
@@ -240,8 +258,8 @@ public:
static VisualShaderEditor *get_singleton() { return singleton; }
- void add_custom_type(const String &p_name, const String &p_category, const Ref<Script> &p_script);
- void remove_custom_type(const Ref<Script> &p_script);
+ void clear_custom_types();
+ void add_custom_type(const String &p_name, const Ref<Script> &p_script, const String &p_description, int p_return_icon_type, const String &p_category, const String &p_sub_category);
virtual Size2 get_minimum_size() const;
void edit(VisualShader *p_visual_shader);
diff --git a/editor/project_export.cpp b/editor/project_export.cpp
index c78a81dbe0..c54103f6f7 100644
--- a/editor/project_export.cpp
+++ b/editor/project_export.cpp
@@ -931,17 +931,8 @@ void ProjectExportDialog::_export_project() {
export_project->add_filter("*." + extension_list[i] + " ; " + platform->get_name() + " Export");
}
- String current_preset_export_path = current->get_export_path();
-
- if (current_preset_export_path != "") {
-
- if (!DirAccess::exists(current_preset_export_path.get_base_dir())) {
-
- DirAccessRef da(DirAccess::create(DirAccess::ACCESS_FILESYSTEM));
- da->make_dir_recursive(current_preset_export_path.get_base_dir());
- }
-
- export_project->set_current_path(current_preset_export_path);
+ if (current->get_export_path() != "") {
+ export_project->set_current_path(current->get_export_path());
} else {
if (extension_list.size() >= 1) {
export_project->set_current_file(default_filename + "." + extension_list[0]);
@@ -1125,6 +1116,7 @@ ProjectExportDialog::ProjectExportDialog() {
sections = memnew(TabContainer);
sections->set_tab_align(TabContainer::ALIGN_LEFT);
+ sections->set_use_hidden_tabs_for_min_size(true);
settings_vb->add_child(sections);
sections->set_v_size_flags(SIZE_EXPAND_FILL);
diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp
index feb2cdd071..c6e3dc1e32 100644
--- a/editor/project_manager.cpp
+++ b/editor/project_manager.cpp
@@ -195,7 +195,7 @@ private:
unzFile pkg = unzOpen2(valid_path.utf8().get_data(), &io);
if (!pkg) {
- set_message(TTR("Error opening package file, not in zip format."), MESSAGE_ERROR);
+ set_message(TTR("Error opening package file, not in ZIP format."), MESSAGE_ERROR);
memdelete(d);
get_ok()->set_disabled(true);
unzClose(pkg);
@@ -519,7 +519,7 @@ private:
unzFile pkg = unzOpen2(zip_path.utf8().get_data(), &io);
if (!pkg) {
- dialog_error->set_text(TTR("Error opening package file, not in zip format."));
+ dialog_error->set_text(TTR("Error opening package file, not in ZIP format."));
dialog_error->popup_centered_minsize();
return;
}
@@ -946,10 +946,16 @@ public:
static const char *SIGNAL_SELECTION_CHANGED;
static const char *SIGNAL_PROJECT_ASK_OPEN;
+ enum MenuOptions {
+ GLOBAL_NEW_WINDOW,
+ GLOBAL_OPEN_PROJECT
+ };
+
// Can often be passed by copy
struct Item {
String project_key;
String project_name;
+ String description;
String path;
String icon;
String main_scene;
@@ -965,6 +971,7 @@ public:
Item(const String &p_project,
const String &p_name,
+ const String &p_description,
const String &p_path,
const String &p_icon,
const String &p_main_scene,
@@ -976,6 +983,7 @@ public:
project_key = p_project;
project_name = p_name;
+ description = p_description;
path = p_path;
icon = p_icon;
main_scene = p_main_scene;
@@ -997,7 +1005,6 @@ public:
void load_projects();
void set_search_term(String p_search_term);
- void set_filter_option(ProjectListFilter::FilterOption p_option);
void set_order_option(ProjectListFilter::FilterOption p_option);
void sort_projects();
int get_project_count() const;
@@ -1030,7 +1037,6 @@ private:
static void load_project_data(const String &p_property_key, Item &p_item, bool p_favorite);
String _search_term;
- ProjectListFilter::FilterOption _filter_option;
ProjectListFilter::FilterOption _order_option;
Set<String> _selected_project_keys;
String _last_clicked; // Project key
@@ -1063,7 +1069,6 @@ struct ProjectListComparator {
};
ProjectList::ProjectList() {
- _filter_option = ProjectListFilter::FILTER_NAME;
_order_option = ProjectListFilter::FILTER_MODIFIED;
_scroll_children = memnew(VBoxContainer);
@@ -1109,7 +1114,7 @@ void ProjectList::load_project_icon(int p_index) {
Error err = img->load(item.icon.replace_first("res://", item.path + "/"));
if (err == OK) {
- img->resize(default_icon->get_width(), default_icon->get_height());
+ img->resize(default_icon->get_width(), default_icon->get_height(), Image::INTERPOLATE_LANCZOS);
Ref<ImageTexture> it = memnew(ImageTexture);
it->create_from_image(img);
icon = it;
@@ -1147,6 +1152,7 @@ void ProjectList::load_project_data(const String &p_property_key, Item &p_item,
grayed = true;
}
+ String description = cf->get_value("application", "config/description", "");
String icon = cf->get_value("application", "config/icon", "");
String main_scene = cf->get_value("application", "run/main_scene", "");
@@ -1168,7 +1174,7 @@ void ProjectList::load_project_data(const String &p_property_key, Item &p_item,
String project_key = p_property_key.get_slice("/", 1);
- p_item = Item(project_key, project_name, path, icon, main_scene, last_modified, p_favorite, grayed, missing, config_version);
+ p_item = Item(project_key, project_name, description, path, icon, main_scene, last_modified, p_favorite, grayed, missing, config_version);
}
void ProjectList::load_projects() {
@@ -1184,6 +1190,7 @@ void ProjectList::load_projects() {
_projects.clear();
_last_clicked = "";
_selected_project_keys.clear();
+ OS::get_singleton()->global_menu_clear("_dock");
// Load data
// TODO Would be nice to change how projects and favourites are stored... it complicates things a bit.
@@ -1221,6 +1228,9 @@ void ProjectList::load_projects() {
create_project_item_control(i);
}
+ OS::get_singleton()->global_menu_add_separator("_dock");
+ OS::get_singleton()->global_menu_add_item("_dock", TTR("New Window"), GLOBAL_NEW_WINDOW, Variant());
+
sort_projects();
set_v_scroll(0);
@@ -1243,6 +1253,7 @@ void ProjectList::create_project_item_control(int p_index) {
hb->connect("draw", this, "_panel_draw", varray(hb));
hb->connect("gui_input", this, "_panel_input", varray(hb));
hb->add_constant_override("separation", 10 * EDSCALE);
+ hb->set_tooltip(item.description);
VBoxContainer *favorite_box = memnew(VBoxContainer);
favorite_box->set_name("FavoriteBox");
@@ -1258,19 +1269,22 @@ void ProjectList::create_project_item_control(int p_index) {
TextureRect *tf = memnew(TextureRect);
tf->set_texture(get_icon("DefaultProjectIcon", "EditorIcons"));
+ if (item.missing) {
+ tf->set_modulate(Color(1, 1, 1, 0.5));
+ }
hb->add_child(tf);
hb->icon = tf;
VBoxContainer *vb = memnew(VBoxContainer);
if (item.grayed)
- vb->set_modulate(Color(0.5, 0.5, 0.5));
+ vb->set_modulate(Color(1, 1, 1, 0.5));
vb->set_h_size_flags(SIZE_EXPAND_FILL);
hb->add_child(vb);
Control *ec = memnew(Control);
ec->set_custom_minimum_size(Size2(0, 1));
ec->set_mouse_filter(MOUSE_FILTER_PASS);
vb->add_child(ec);
- Label *title = memnew(Label(item.project_name));
+ Label *title = memnew(Label(!item.missing ? item.project_name : TTR("Missing Project")));
title->add_font_override("font", get_font("title", "EditorFonts"));
title->add_color_override("font_color", font_color);
title->set_clip_text(true);
@@ -1281,12 +1295,21 @@ void ProjectList::create_project_item_control(int p_index) {
vb->add_child(path_hb);
Button *show = memnew(Button);
- show->set_icon(get_icon("Load", "EditorIcons")); // Folder icon
+ // Display a folder icon if the project directory can be opened, or a "broken file" icon if it can't
+ show->set_icon(get_icon(!item.missing ? "Load" : "FileBroken", "EditorIcons"));
show->set_flat(true);
- show->set_modulate(Color(1, 1, 1, 0.5));
+ if (!item.grayed) {
+ // Don't make the icon less prominent if the parent is already grayed out
+ show->set_modulate(Color(1, 1, 1, 0.5));
+ }
path_hb->add_child(show);
- show->connect("pressed", this, "_show_project", varray(item.path));
- show->set_tooltip(TTR("Show in File Manager"));
+
+ if (!item.missing) {
+ show->connect("pressed", this, "_show_project", varray(item.path));
+ show->set_tooltip(TTR("Show in File Manager"));
+ } else {
+ show->set_tooltip(TTR("Error: Project is missing on the filesystem."));
+ }
Label *fpath = memnew(Label(item.path));
path_hb->add_child(fpath);
@@ -1296,6 +1319,7 @@ void ProjectList::create_project_item_control(int p_index) {
fpath->set_clip_text(true);
_scroll_children->add_child(hb);
+ OS::get_singleton()->global_menu_add_item("_dock", item.project_name + " ( " + item.path + " )", GLOBAL_OPEN_PROJECT, Variant(item.path.plus_file("project.godot")));
item.control = hb;
}
@@ -1303,16 +1327,10 @@ void ProjectList::set_search_term(String p_search_term) {
_search_term = p_search_term;
}
-void ProjectList::set_filter_option(ProjectListFilter::FilterOption p_option) {
- if (_filter_option != p_option) {
- _filter_option = p_option;
- }
-}
-
void ProjectList::set_order_option(ProjectListFilter::FilterOption p_option) {
if (_order_option != p_option) {
_order_option = p_option;
- EditorSettings::get_singleton()->set("project_manager/sorting_order", (int)_filter_option);
+ EditorSettings::get_singleton()->set("project_manager/sorting_order", (int)_order_option);
EditorSettings::get_singleton()->save();
}
}
@@ -1328,11 +1346,18 @@ void ProjectList::sort_projects() {
bool visible = true;
if (_search_term != "") {
- if (_filter_option == ProjectListFilter::FILTER_PATH) {
- visible = item.path.findn(_search_term) != -1;
- } else if (_filter_option == ProjectListFilter::FILTER_NAME) {
- visible = item.project_name.findn(_search_term) != -1;
+
+ String search_path;
+ if (_search_term.find("/") != -1) {
+ // Search path will match the whole path
+ search_path = item.path;
+ } else {
+ // Search path will only match the last path component to make searching more strict
+ search_path = item.path.get_file();
}
+
+ // When searching, display projects whose name or path contain the search term
+ visible = item.project_name.findn(_search_term) != -1 || search_path.findn(_search_term) != -1;
}
item.control->set_visible(visible);
@@ -1694,7 +1719,6 @@ void ProjectList::_bind_methods() {
ClassDB::bind_method("_panel_input", &ProjectList::_panel_input);
ClassDB::bind_method("_favorite_pressed", &ProjectList::_favorite_pressed);
ClassDB::bind_method("_show_project", &ProjectList::_show_project);
- //ClassDB::bind_method("_unhandled_input", &ProjectList::_unhandled_input);
ADD_SIGNAL(MethodInfo(SIGNAL_SELECTION_CHANGED));
ADD_SIGNAL(MethodInfo(SIGNAL_PROJECT_ASK_OPEN));
@@ -1730,7 +1754,7 @@ void ProjectManager::_dim_window() {
// Dim the project manager window while it's quitting to make it clearer that it's busy.
// No transition is applied, as the effect needs to be visible immediately
- float c = 0.4f;
+ float c = 0.5f;
Color dim_color = Color(c, c, c);
gui_base->set_modulate(dim_color);
}
@@ -1740,10 +1764,18 @@ void ProjectManager::_update_project_buttons() {
Vector<ProjectList::Item> selected_projects = _project_list->get_selected_projects();
bool empty_selection = selected_projects.empty();
+ bool is_missing_project_selected = false;
+ for (int i = 0; i < selected_projects.size(); ++i) {
+ if (selected_projects[i].missing) {
+ is_missing_project_selected = true;
+ break;
+ }
+ }
+
erase_btn->set_disabled(empty_selection);
- open_btn->set_disabled(empty_selection);
- rename_btn->set_disabled(empty_selection);
- run_btn->set_disabled(empty_selection);
+ open_btn->set_disabled(empty_selection || is_missing_project_selected);
+ rename_btn->set_disabled(empty_selection || is_missing_project_selected);
+ run_btn->set_disabled(empty_selection || is_missing_project_selected);
erase_missing_btn->set_visible(_project_list->is_any_project_missing());
}
@@ -1754,8 +1786,19 @@ void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) {
if (k.is_valid()) {
- if (!k->is_pressed())
+ if (!k->is_pressed()) {
return;
+ }
+
+ // Pressing Command + Q quits the Project Manager
+ // This is handled by the platform implementation on macOS,
+ // so only define the shortcut on other platforms
+#ifndef OSX_ENABLED
+ if (k->get_scancode_with_modifiers() == (KEY_MASK_CMD | KEY_Q)) {
+ _dim_window();
+ get_tree()->quit();
+ }
+#endif
if (tabs->get_current_tab() != 0)
return;
@@ -1794,7 +1837,7 @@ void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) {
break;
int index = _project_list->get_single_selected_index();
- if (index - 1 > 0) {
+ if (index > 0) {
_project_list->select_project(index - 1);
_project_list->ensure_project_visible(index - 1);
_update_project_buttons();
@@ -1834,7 +1877,6 @@ void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) {
void ProjectManager::_load_recent_projects() {
- _project_list->set_filter_option(project_filter->get_filter_option());
_project_list->set_order_option(project_order_filter->get_filter_option());
_project_list->set_search_term(project_filter->get_search_term());
_project_list->load_projects();
@@ -1867,6 +1909,29 @@ void ProjectManager::_confirm_update_settings() {
_open_selected_projects();
}
+void ProjectManager::_global_menu_action(const Variant &p_id, const Variant &p_meta) {
+
+ int id = (int)p_id;
+ if (id == ProjectList::GLOBAL_NEW_WINDOW) {
+ List<String> args;
+ String exec = OS::get_singleton()->get_executable_path();
+
+ OS::ProcessID pid = 0;
+ OS::get_singleton()->execute(exec, args, false, &pid);
+ } else if (id == ProjectList::GLOBAL_OPEN_PROJECT) {
+ String conf = (String)p_meta;
+
+ if (conf != String()) {
+ List<String> args;
+ args.push_back(conf);
+ String exec = OS::get_singleton()->get_executable_path();
+
+ OS::ProcessID pid = 0;
+ OS::get_singleton()->execute(exec, args, false, &pid);
+ }
+ }
+}
+
void ProjectManager::_open_selected_projects() {
const Set<String> &selected_list = _project_list->get_selected_project_keys();
@@ -1921,6 +1986,9 @@ void ProjectManager::_open_selected_projects_ask() {
}
ProjectList::Item project = _project_list->get_selected_projects()[0];
+ if (project.missing) {
+ return;
+ }
// Update the project settings or don't open
String conf = project.path.plus_file("project.godot");
@@ -2075,10 +2143,12 @@ void ProjectManager::_rename_project() {
void ProjectManager::_erase_project_confirm() {
_project_list->erase_selected_projects();
+ _update_project_buttons();
}
void ProjectManager::_erase_missing_projects_confirm() {
_project_list->erase_missing_projects();
+ _update_project_buttons();
}
void ProjectManager::_erase_project() {
@@ -2101,7 +2171,7 @@ void ProjectManager::_erase_project() {
void ProjectManager::_erase_missing_projects() {
- erase_missing_ask->set_text(TTR("Remove all missing projects from the list? (Folders contents will not be modified)"));
+ erase_missing_ask->set_text(TTR("Remove all missing projects from the list?\nThe project folders' contents won't be modified."));
erase_missing_ask->popup_centered_minsize();
}
@@ -2196,7 +2266,6 @@ void ProjectManager::_on_order_option_changed() {
}
void ProjectManager::_on_filter_option_changed() {
- _project_list->set_filter_option(project_filter->get_filter_option());
_project_list->set_search_term(project_filter->get_search_term());
_project_list->sort_projects();
}
@@ -2205,6 +2274,7 @@ void ProjectManager::_bind_methods() {
ClassDB::bind_method("_open_selected_projects_ask", &ProjectManager::_open_selected_projects_ask);
ClassDB::bind_method("_open_selected_projects", &ProjectManager::_open_selected_projects);
+ ClassDB::bind_method(D_METHOD("_global_menu_action"), &ProjectManager::_global_menu_action, DEFVAL(Variant()));
ClassDB::bind_method("_run_project", &ProjectManager::_run_project);
ClassDB::bind_method("_run_project_confirm", &ProjectManager::_run_project_confirm);
ClassDB::bind_method("_scan_projects", &ProjectManager::_scan_projects);
@@ -2268,6 +2338,9 @@ ProjectManager::ProjectManager() {
} break;
}
+ // Define a minimum window size to prevent UI elements from overlapping or being cut off
+ OS::get_singleton()->set_min_window_size(Size2(750, 420) * EDSCALE);
+
#ifndef OSX_ENABLED
// The macOS platform implementation uses its own hiDPI window resizing code
// TODO: Resize windows on hiDPI displays on Windows and Linux and remove the line below
@@ -2293,26 +2366,11 @@ ProjectManager::ProjectManager() {
VBoxContainer *vb = memnew(VBoxContainer);
panel->add_child(vb);
vb->set_anchors_and_margins_preset(Control::PRESET_WIDE, Control::PRESET_MODE_MINSIZE, 8 * EDSCALE);
- vb->add_constant_override("separation", 8 * EDSCALE);
String cp;
cp += 0xA9;
OS::get_singleton()->set_window_title(VERSION_NAME + String(" - ") + TTR("Project Manager") + " - " + cp + " 2007-2019 Juan Linietsky, Ariel Manzur & Godot Contributors");
- HBoxContainer *top_hb = memnew(HBoxContainer);
- vb->add_child(top_hb);
- Label *l = memnew(Label);
- l->set_text(VERSION_NAME + String(" - ") + TTR("Project Manager"));
- top_hb->add_child(l);
- top_hb->add_spacer();
- l = memnew(Label);
- String hash = String(VERSION_HASH);
- if (hash.length() != 0)
- hash = "." + hash.left(9);
- l->set_text("v" VERSION_FULL_BUILD "" + hash);
- l->set_align(Label::ALIGN_CENTER);
- top_hb->add_child(l);
-
Control *center_box = memnew(Control);
center_box->set_v_size_flags(SIZE_EXPAND_FILL);
vb->add_child(center_box);
@@ -2320,11 +2378,12 @@ ProjectManager::ProjectManager() {
tabs = memnew(TabContainer);
center_box->add_child(tabs);
tabs->set_anchors_and_margins_preset(Control::PRESET_WIDE);
+ tabs->set_tab_align(TabContainer::ALIGN_LEFT);
HBoxContainer *tree_hb = memnew(HBoxContainer);
projects_hb = tree_hb;
- projects_hb->set_name(TTR("Project List"));
+ projects_hb->set_name(TTR("Projects"));
tabs->add_child(tree_hb);
@@ -2341,6 +2400,7 @@ ProjectManager::ProjectManager() {
sort_filter_titles.push_back("Path");
sort_filter_titles.push_back("Last Modified");
project_order_filter = memnew(ProjectListFilter);
+ project_order_filter->add_filter_option();
project_order_filter->_setup_filters(sort_filter_titles);
project_order_filter->set_filter_size(150);
sort_filters->add_child(project_order_filter);
@@ -2351,21 +2411,12 @@ ProjectManager::ProjectManager() {
project_order_filter->set_filter_option((ProjectListFilter::FilterOption)projects_sorting_order);
sort_filters->add_spacer(true);
- Label *search_label = memnew(Label);
- search_label->set_text(TTR("Search:"));
- sort_filters->add_child(search_label);
-
- HBoxContainer *search_filters = memnew(HBoxContainer);
- Vector<String> vec2;
- vec2.push_back("Name");
- vec2.push_back("Path");
+
project_filter = memnew(ProjectListFilter);
- project_filter->_setup_filters(vec2);
project_filter->add_search_box();
- search_filters->add_child(project_filter);
project_filter->connect("filter_changed", this, "_on_filter_option_changed");
project_filter->set_custom_minimum_size(Size2(280, 10) * EDSCALE);
- sort_filters->add_child(search_filters);
+ sort_filters->add_child(project_filter);
search_tree_vb->add_child(sort_filters);
@@ -2455,6 +2506,17 @@ ProjectManager::ProjectManager() {
settings_hb->set_alignment(BoxContainer::ALIGN_END);
settings_hb->set_h_grow_direction(Control::GROW_DIRECTION_BEGIN);
+ Label *version_label = memnew(Label);
+ String hash = String(VERSION_HASH);
+ if (hash.length() != 0) {
+ hash = "." + hash.left(9);
+ }
+ version_label->set_text("v" VERSION_FULL_BUILD "" + hash);
+ // Fade out the version label to be less prominent, but still readable
+ version_label->set_self_modulate(Color(1, 1, 1, 0.6));
+ version_label->set_align(Label::ALIGN_CENTER);
+ settings_hb->add_child(version_label);
+
language_btn = memnew(OptionButton);
language_btn->set_flat(true);
language_btn->set_focus_mode(Control::FOCUS_NONE);
@@ -2487,27 +2549,6 @@ ProjectManager::ProjectManager() {
center_box->add_child(settings_hb);
settings_hb->set_anchors_and_margins_preset(Control::PRESET_TOP_RIGHT);
- CenterContainer *cc = memnew(CenterContainer);
- Button *cancel = memnew(Button);
- cancel->set_text(TTR("Exit"));
- cancel->set_custom_minimum_size(Size2(100, 1) * EDSCALE);
-
-#ifndef OSX_ENABLED
- // Pressing Command + Q quits the Project Manager
- // This is handled by the platform implementation on macOS,
- // so only define the shortcut on other platforms
- InputEventKey *quit_key = memnew(InputEventKey);
- quit_key->set_command(true);
- quit_key->set_scancode(KEY_Q);
- ShortCut *quit_shortcut = memnew(ShortCut);
- quit_shortcut->set_shortcut(quit_key);
- cancel->set_shortcut(quit_shortcut);
-#endif
-
- cc->add_child(cancel);
- cancel->connect("pressed", this, "_exit_dialog");
- vb->add_child(cc);
-
//////////////////////////////////////////////////////////////
language_restart_ask = memnew(ConfirmationDialog);
@@ -2559,6 +2600,7 @@ ProjectManager::ProjectManager() {
}
SceneTree::get_singleton()->connect("files_dropped", this, "_files_dropped");
+ SceneTree::get_singleton()->connect("global_menu_action", this, "_global_menu_action");
run_error_diag = memnew(AcceptDialog);
gui_base->add_child(run_error_diag);
@@ -2628,11 +2670,20 @@ void ProjectListFilter::_bind_methods() {
ADD_SIGNAL(MethodInfo("filter_changed"));
}
+void ProjectListFilter::add_filter_option() {
+ filter_option = memnew(OptionButton);
+ filter_option->set_clip_text(true);
+ filter_option->connect("item_selected", this, "_filter_option_selected");
+ add_child(filter_option);
+}
+
void ProjectListFilter::add_search_box() {
search_box = memnew(LineEdit);
+ search_box->set_placeholder(TTR("Search"));
search_box->connect("text_changed", this, "_search_text_changed");
search_box->set_h_size_flags(SIZE_EXPAND_FILL);
add_child(search_box);
+
has_search_box = true;
}
@@ -2643,13 +2694,6 @@ void ProjectListFilter::set_filter_size(int h_size) {
ProjectListFilter::ProjectListFilter() {
_current_filter = FILTER_NAME;
-
- filter_option = memnew(OptionButton);
- set_filter_size(80);
- filter_option->set_clip_text(true);
- filter_option->connect("item_selected", this, "_filter_option_selected");
- add_child(filter_option);
-
has_search_box = false;
}
diff --git a/editor/project_manager.h b/editor/project_manager.h
index 4ccb99d6bd..cf0b8b8801 100644
--- a/editor/project_manager.h
+++ b/editor/project_manager.h
@@ -43,6 +43,7 @@ class ProjectList;
class ProjectListFilter;
class ProjectManager : public Control {
+
GDCLASS(ProjectManager, Control);
Button *erase_btn;
@@ -96,6 +97,7 @@ class ProjectManager : public Control {
void _restart_confirm();
void _exit_dialog();
void _scan_begin(const String &p_base);
+ void _global_menu_action(const Variant &p_id, const Variant &p_meta);
void _confirm_update_settings();
@@ -152,6 +154,7 @@ protected:
public:
void _setup_filters(Vector<String> options);
+ void add_filter_option();
void add_search_box();
void set_filter_size(int h_size);
String get_search_term();
diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp
index 1c588a45f1..a0d2332ffc 100644
--- a/editor/project_settings_editor.cpp
+++ b/editor/project_settings_editor.cpp
@@ -1674,6 +1674,7 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) {
tab_container = memnew(TabContainer);
tab_container->set_tab_align(TabContainer::ALIGN_LEFT);
+ tab_container->set_use_hidden_tabs_for_min_size(true);
add_child(tab_container);
VBoxContainer *props_base = memnew(VBoxContainer);
diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp
index 899343c0f8..ecb272876d 100644
--- a/editor/property_editor.cpp
+++ b/editor/property_editor.cpp
@@ -859,6 +859,13 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
add_child(color_picker);
color_picker->hide();
color_picker->connect("color_changed", this, "_color_changed");
+
+ // get default color picker mode from editor settings
+ int default_color_mode = EDITOR_GET("interface/inspector/default_color_picker_mode");
+ if (default_color_mode == 1)
+ color_picker->set_hsv_mode(true);
+ else if (default_color_mode == 2)
+ color_picker->set_raw_mode(true);
}
color_picker->show();
diff --git a/editor/property_editor.h b/editor/property_editor.h
index a8ef1d6fc1..029c2211d5 100644
--- a/editor/property_editor.h
+++ b/editor/property_editor.h
@@ -46,10 +46,6 @@
#include "scene/gui/texture_rect.h"
#include "scene/gui/tree.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class PropertyValueEvaluator;
class CreateDialog;
class PropertySelector;
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp
index 032b3a19a6..f0114b393d 100644
--- a/editor/scene_tree_dock.cpp
+++ b/editor/scene_tree_dock.cpp
@@ -986,9 +986,10 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
} else {
new_node = Object::cast_to<Node>(ClassDB::instance(selected_favorite_root));
}
+
if (!new_node) {
- ERR_EXPLAIN("Creating root from favorite '" + selected_favorite_root + "' failed. Creating 'Node' instead.");
new_node = memnew(Node);
+ ERR_PRINTS("Creating root from favorite '" + selected_favorite_root + "' failed. Creating 'Node' instead.");
}
} else {
switch (p_tool) {
@@ -1537,10 +1538,7 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V
Node *validate = new_parent;
while (validate) {
- if (p_nodes.find(validate) != -1) {
- ERR_EXPLAIN("Selection changed at some point.. can't reparent");
- ERR_FAIL();
- }
+ ERR_FAIL_COND_MSG(p_nodes.find(validate) != -1, "Selection changed at some point.. can't reparent.");
validate = validate->get_parent();
}
//ok all valid
@@ -2253,8 +2251,7 @@ void SceneTreeDock::_normalize_drop(Node *&to_node, int &to_pos, int p_type) {
//drop at above selected node
if (to_node == EditorNode::get_singleton()->get_edited_scene()) {
to_node = NULL;
- ERR_EXPLAIN("Cannot perform drop above the root node!");
- ERR_FAIL();
+ ERR_FAIL_MSG("Cannot perform drop above the root node!");
}
to_pos = to_node->get_index();
@@ -2712,6 +2709,7 @@ void SceneTreeDock::_bind_methods() {
ClassDB::bind_method(D_METHOD("_feature_profile_changed"), &SceneTreeDock::_feature_profile_changed);
ClassDB::bind_method(D_METHOD("instance"), &SceneTreeDock::instance);
+ ClassDB::bind_method(D_METHOD("get_tree_editor"), &SceneTreeDock::get_tree_editor);
ClassDB::bind_method(D_METHOD("replace_node"), &SceneTreeDock::replace_node);
ADD_SIGNAL(MethodInfo("remote_tree_selected"));
diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp
index 2d9accc3d8..f1fc4eb950 100644
--- a/editor/scene_tree_editor.cpp
+++ b/editor/scene_tree_editor.cpp
@@ -270,30 +270,63 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
item->add_button(0, get_icon("NodeWarning", "EditorIcons"), BUTTON_WARNING, false, TTR("Node configuration warning:") + "\n" + p_node->get_configuration_warning());
}
- bool has_connections = p_node->has_persistent_signal_connections();
- bool has_groups = p_node->has_persistent_groups();
-
- if (has_connections && has_groups) {
- item->add_button(0, get_icon("SignalsAndGroups", "EditorIcons"), BUTTON_SIGNALS, false, TTR("Node has connection(s) and group(s).\nClick to show signals dock."));
- } else if (has_connections) {
- item->add_button(0, get_icon("Signals", "EditorIcons"), BUTTON_SIGNALS, false, TTR("Node has connections.\nClick to show signals dock."));
- } else if (has_groups) {
- item->add_button(0, get_icon("Groups", "EditorIcons"), BUTTON_GROUPS, false, TTR("Node is in group(s).\nClick to show groups dock."));
+ int num_connections = p_node->get_persistent_signal_connection_count();
+ int num_groups = p_node->get_persistent_group_count();
+
+ if (num_connections >= 1 && num_groups >= 1) {
+ item->add_button(
+ 0,
+ get_icon("SignalsAndGroups", "EditorIcons"),
+ BUTTON_SIGNALS,
+ false,
+ vformat(TTR("Node has %s connection(s) and %s group(s).\nClick to show signals dock."), num_connections, num_groups));
+ } else if (num_connections >= 1) {
+ item->add_button(
+ 0,
+ get_icon("Signals", "EditorIcons"),
+ BUTTON_SIGNALS,
+ false,
+ vformat(TTR("Node has %s connection(s).\nClick to show signals dock."), num_connections));
+ } else if (num_groups >= 1) {
+ item->add_button(
+ 0,
+ get_icon("Groups", "EditorIcons"),
+ BUTTON_GROUPS,
+ false,
+ vformat(TTR("Node is in %s group(s).\nClick to show groups dock."), num_groups));
}
}
if (p_node == get_scene_node() && p_node->get_scene_inherited_state().is_valid()) {
item->add_button(0, get_icon("InstanceOptions", "EditorIcons"), BUTTON_SUBSCENE, false, TTR("Open in Editor"));
- item->set_tooltip(0, TTR("Inherits:") + " " + p_node->get_scene_inherited_state()->get_path() + "\n" + TTR("Type:") + " " + p_node->get_class());
- } else if (p_node != get_scene_node() && p_node->get_filename() != "" && can_open_instance) {
+ String tooltip = TTR("Inherits:") + " " + p_node->get_scene_inherited_state()->get_path() + "\n" + TTR("Type:") + " " + p_node->get_class();
+ if (p_node->get_editor_description() != String()) {
+ tooltip += "\n\n" + p_node->get_editor_description();
+ }
+
+ item->set_tooltip(0, tooltip);
+ } else if (p_node != get_scene_node() && p_node->get_filename() != "" && can_open_instance) {
item->add_button(0, get_icon("InstanceOptions", "EditorIcons"), BUTTON_SUBSCENE, false, TTR("Open in Editor"));
- item->set_tooltip(0, TTR("Instance:") + " " + p_node->get_filename() + "\n" + TTR("Type:") + " " + p_node->get_class());
+
+ String tooltip = TTR("Instance:") + " " + p_node->get_filename() + "\n" + TTR("Type:") + " " + p_node->get_class();
+ if (p_node->get_editor_description() != String()) {
+ tooltip += "\n\n" + p_node->get_editor_description();
+ }
+
+ item->set_tooltip(0, tooltip);
} else {
StringName type = EditorNode::get_singleton()->get_object_custom_type_name(p_node);
- if (type == StringName())
+ if (type == StringName()) {
type = p_node->get_class();
- item->set_tooltip(0, String(p_node->get_name()) + "\n" + TTR("Type:") + " " + type);
+ }
+
+ String tooltip = TTR("Type:") + " " + type;
+ if (p_node->get_editor_description() != String()) {
+ tooltip += "\n\n" + p_node->get_editor_description();
+ }
+
+ item->set_tooltip(0, tooltip);
}
if (can_open_instance && undo_redo) { //Show buttons only when necessary(SceneTreeDock) to avoid crashes
@@ -995,6 +1028,17 @@ bool SceneTreeEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_d
return true;
}
+ if (String(d["type"]) == "script_list_element") {
+ ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(d["script_list_element"]);
+ if (se) {
+ String sp = se->get_edited_resource()->get_path();
+ if (_is_script_type(EditorFileSystem::get_singleton()->get_file_type(sp))) {
+ tree->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM);
+ return true;
+ }
+ }
+ }
+
return String(d["type"]) == "nodes";
}
void SceneTreeEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
@@ -1032,6 +1076,16 @@ void SceneTreeEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data,
emit_signal("files_dropped", files, np, section);
}
}
+
+ if (String(d["type"]) == "script_list_element") {
+ ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(d["script_list_element"]);
+ if (se) {
+ String sp = se->get_edited_resource()->get_path();
+ if (_is_script_type(EditorFileSystem::get_singleton()->get_file_type(sp))) {
+ emit_signal("script_dropped", sp, np);
+ }
+ }
+ }
}
void SceneTreeEditor::_rmb_select(const Vector2 &p_pos) {
diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h
index 61cb59ce6f..b216be3b59 100644
--- a/editor/scene_tree_editor.h
+++ b/editor/scene_tree_editor.h
@@ -37,9 +37,7 @@
#include "scene/gui/button.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/tree.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class SceneTreeEditor : public Control {
GDCLASS(SceneTreeEditor, Control);
diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp
index 7d0f40fe91..ffb3f5feab 100644
--- a/editor/script_create_dialog.cpp
+++ b/editor/script_create_dialog.cpp
@@ -34,6 +34,7 @@
#include "core/os/file_access.h"
#include "core/project_settings.h"
#include "core/script_language.h"
+#include "core/string_builder.h"
#include "editor/create_dialog.h"
#include "editor/editor_node.h"
#include "editor/editor_scale.h"
@@ -238,16 +239,22 @@ void ScriptCreateDialog::_parent_name_changed(const String &p_parent) {
void ScriptCreateDialog::_template_changed(int p_template) {
- String selected_template = p_template == 0 ? "" : template_menu->get_item_text(template_menu->get_selected());
+ String selected_template = p_template == 0 ? "" : template_menu->get_item_text(p_template);
EditorSettings::get_singleton()->set_project_metadata("script_setup", "last_selected_template", selected_template);
if (p_template == 0) {
//default
script_template = "";
return;
}
- String ext = ScriptServer::get_language(language_menu->get_selected())->get_extension();
- String name = template_list[p_template - 1] + "." + ext;
- script_template = EditorSettings::get_singleton()->get_script_templates_dir().plus_file(name);
+ int selected_id = template_menu->get_selected_id();
+
+ for (int i = 0; i < template_list.size(); i++) {
+ const ScriptTemplateInfo &sinfo = template_list[i];
+ if (sinfo.id == selected_id) {
+ script_template = sinfo.dir.plus_file(sinfo.name + "." + sinfo.extension);
+ break;
+ }
+ }
}
void ScriptCreateDialog::ok_pressed() {
@@ -368,23 +375,77 @@ void ScriptCreateDialog::_lang_changed(int l) {
bool use_templates = language->is_using_templates();
template_menu->set_disabled(!use_templates);
template_menu->clear();
- if (use_templates) {
- template_list = EditorSettings::get_singleton()->get_script_templates(language->get_extension());
+ if (use_templates) {
+ _update_script_templates(language->get_extension());
String last_lang = EditorSettings::get_singleton()->get_project_metadata("script_setup", "last_selected_language", "");
String last_template = EditorSettings::get_singleton()->get_project_metadata("script_setup", "last_selected_template", "");
template_menu->add_item(TTR("Default"));
+
+ ScriptTemplateInfo *templates = template_list.ptrw();
+
+ Vector<String> origin_names;
+ origin_names.push_back(TTR("Project"));
+ origin_names.push_back(TTR("Editor"));
+ int cur_origin = -1;
+
+ // Populate script template items previously sorted and now grouped by origin
for (int i = 0; i < template_list.size(); i++) {
- String s = template_list[i].capitalize();
- template_menu->add_item(s);
- if (language_menu->get_item_text(language_menu->get_selected()) == last_lang && last_template == s) {
- template_menu->select(i + 1);
+
+ if (int(templates[i].origin) != cur_origin) {
+ template_menu->add_separator();
+
+ String origin_name = origin_names[templates[i].origin];
+
+ int last_index = template_menu->get_item_count() - 1;
+ template_menu->set_item_text(last_index, origin_name);
+
+ cur_origin = templates[i].origin;
}
+ String item_name = templates[i].name.capitalize();
+ template_menu->add_item(item_name);
+
+ int new_id = template_menu->get_item_count() - 1;
+ templates[i].id = new_id;
}
- } else {
+ // Disable overridden
+ for (Map<String, Vector<int> >::Element *E = template_overrides.front(); E; E = E->next()) {
+ const Vector<int> &overrides = E->get();
+
+ if (overrides.size() == 1) {
+ continue; // doesn't override anything
+ }
+ const ScriptTemplateInfo &extended = template_list[overrides[0]];
+
+ StringBuilder override_info;
+ override_info += TTR("Overrides");
+ override_info += ": ";
+
+ for (int i = 1; i < overrides.size(); i++) {
+ const ScriptTemplateInfo &overridden = template_list[overrides[i]];
+
+ int disable_index = template_menu->get_item_index(overridden.id);
+ template_menu->set_item_disabled(disable_index, true);
+ override_info += origin_names[overridden.origin];
+ if (i < overrides.size() - 1) {
+ override_info += ", ";
+ }
+ }
+ template_menu->set_item_icon(extended.id, get_icon("Override", "EditorIcons"));
+ template_menu->get_popup()->set_item_tooltip(extended.id, override_info.as_string());
+ }
+ // Reselect last selected template
+ for (int i = 0; i < template_menu->get_item_count(); i++) {
+ const String &ti = template_menu->get_item_text(i);
+ if (language_menu->get_item_text(language_menu->get_selected()) == last_lang && last_template == ti) {
+ template_menu->select(i);
+ break;
+ }
+ }
+ } else {
template_menu->add_item(TTR("N/A"));
script_template = "";
}
@@ -396,6 +457,41 @@ void ScriptCreateDialog::_lang_changed(int l) {
_update_dialog();
}
+void ScriptCreateDialog::_update_script_templates(const String &p_extension) {
+
+ template_list.clear();
+ template_overrides.clear();
+
+ Vector<String> dirs;
+
+ // Ordered from local to global for correct override mechanism
+ dirs.push_back(EditorSettings::get_singleton()->get_project_script_templates_dir());
+ dirs.push_back(EditorSettings::get_singleton()->get_script_templates_dir());
+
+ for (int i = 0; i < dirs.size(); i++) {
+
+ Vector<String> list = EditorSettings::get_singleton()->get_script_templates(p_extension, dirs[i]);
+
+ for (int j = 0; j < list.size(); j++) {
+ ScriptTemplateInfo sinfo;
+ sinfo.origin = ScriptOrigin(i);
+ sinfo.dir = dirs[i];
+ sinfo.name = list[j];
+ sinfo.extension = p_extension;
+ template_list.push_back(sinfo);
+
+ if (!template_overrides.has(sinfo.name)) {
+ Vector<int> overrides;
+ overrides.push_back(template_list.size() - 1); // first one
+ template_overrides.insert(sinfo.name, overrides);
+ } else {
+ Vector<int> &overrides = template_overrides[sinfo.name];
+ overrides.push_back(template_list.size() - 1);
+ }
+ }
+ }
+}
+
void ScriptCreateDialog::_built_in_pressed() {
if (internal->is_pressed()) {
diff --git a/editor/script_create_dialog.h b/editor/script_create_dialog.h
index 202846fd3c..31cf2478cf 100644
--- a/editor/script_create_dialog.h
+++ b/editor/script_create_dialog.h
@@ -78,8 +78,25 @@ class ScriptCreateDialog : public ConfirmationDialog {
int current_language;
int default_language;
bool re_check_path;
+
+ enum ScriptOrigin {
+ SCRIPT_ORIGIN_PROJECT,
+ SCRIPT_ORIGIN_EDITOR,
+ };
+ struct ScriptTemplateInfo {
+ int id;
+ ScriptOrigin origin;
+ String dir;
+ String name;
+ String extension;
+ };
+
String script_template;
- Vector<String> template_list;
+ Vector<ScriptTemplateInfo> template_list;
+ Map<String, Vector<int> > template_overrides; // name : indices
+
+ void _update_script_templates(const String &p_extension);
+
String base_type;
void _path_hbox_sorted();
diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp
index f7ff754a0b..fc5aecdbe9 100644
--- a/editor/script_editor_debugger.cpp
+++ b/editor/script_editor_debugger.cpp
@@ -1376,7 +1376,7 @@ void ScriptEditorDebugger::stop() {
profiler->set_enabled(true);
inspect_scene_tree->clear();
- inspector->edit(NULL);
+ EditorNode::get_singleton()->edit_current();
EditorNode::get_singleton()->get_pause_button()->set_pressed(false);
EditorNode::get_singleton()->get_pause_button()->set_disabled(true);
EditorNode::get_singleton()->get_scene_tree_dock()->hide_remote_tree();
diff --git a/editor/spatial_editor_gizmos.cpp b/editor/spatial_editor_gizmos.cpp
index f7ba5e5e3c..4c5371769f 100644
--- a/editor/spatial_editor_gizmos.cpp
+++ b/editor/spatial_editor_gizmos.cpp
@@ -2037,8 +2037,11 @@ PortalSpatialGizmo::PortalSpatialGizmo(Portal *p_portal) {
RayCastSpatialGizmoPlugin::RayCastSpatialGizmoPlugin() {
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
+ const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
create_material("shape_material", gizmo_color);
+ const float gizmo_value = gizmo_color.get_v();
+ const Color gizmo_color_disabled = Color(gizmo_value, gizmo_value, gizmo_value, 0.65);
+ create_material("shape_material_disabled", gizmo_color_disabled);
}
bool RayCastSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
@@ -2064,7 +2067,8 @@ void RayCastSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
lines.push_back(Vector3());
lines.push_back(raycast->get_cast_to());
- Ref<SpatialMaterial> material = get_material("shape_material", p_gizmo);
+ const Ref<SpatialMaterial> material =
+ get_material(raycast->is_enabled() ? "shape_material" : "shape_material_disabled", p_gizmo);
p_gizmo->add_lines(lines, material);
p_gizmo->add_collision_segments(lines);
@@ -3108,8 +3112,11 @@ void BakedIndirectLightGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
////
CollisionShapeSpatialGizmoPlugin::CollisionShapeSpatialGizmoPlugin() {
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
+ const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
create_material("shape_material", gizmo_color);
+ const float gizmo_value = gizmo_color.get_v();
+ const Color gizmo_color_disabled = Color(gizmo_value, gizmo_value, gizmo_value, 0.65);
+ create_material("shape_material_disabled", gizmo_color_disabled);
create_handle_material("handles");
}
@@ -3432,7 +3439,8 @@ void CollisionShapeSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
if (s.is_null())
return;
- Ref<Material> material = get_material("shape_material", p_gizmo);
+ const Ref<Material> material =
+ get_material(!cs->is_disabled() ? "shape_material" : "shape_material_disabled", p_gizmo);
Ref<Material> handles_material = get_material("handles");
if (Object::cast_to<SphereShape>(*s)) {
@@ -3733,8 +3741,11 @@ void CollisionShapeSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
/////
CollisionPolygonSpatialGizmoPlugin::CollisionPolygonSpatialGizmoPlugin() {
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
+ const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
create_material("shape_material", gizmo_color);
+ const float gizmo_value = gizmo_color.get_v();
+ const Color gizmo_color_disabled = Color(gizmo_value, gizmo_value, gizmo_value, 0.65);
+ create_material("shape_material_disabled", gizmo_color_disabled);
}
bool CollisionPolygonSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
@@ -3770,7 +3781,8 @@ void CollisionPolygonSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
lines.push_back(Vector3(points[i].x, points[i].y, -depth));
}
- Ref<Material> material = get_material("shape_material", p_gizmo);
+ const Ref<Material> material =
+ get_material(!polygon->is_disabled() ? "shape_material" : "shape_material_disabled", p_gizmo);
p_gizmo->add_lines(lines, material);
p_gizmo->add_collision_segments(lines);
diff --git a/editor/translations/af.po b/editor/translations/af.po
index e220906bcb..5c4eb539a8 100644
--- a/editor/translations/af.po
+++ b/editor/translations/af.po
@@ -61,7 +61,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Bevry"
@@ -672,17 +671,18 @@ msgid "Line Number:"
msgstr "Reël Nommer:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "Het %d verskynsel(s) vervang."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+#, fuzzy
+msgid "%d matches."
msgstr "Geen Pasmaats"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Het %d verskynsel(s) vervang."
-
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Pas Letterkas"
@@ -921,8 +921,7 @@ msgstr "Gunstelinge:"
msgid "Recent:"
msgstr "Onlangse:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1026,7 +1025,7 @@ msgstr ""
"reg kan werk.\n"
"Verwyder die lêers in elk geval? (geen ontdoen)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
#, fuzzy
msgid "Cannot remove:"
msgstr "Kan nie verwyder nie:\n"
@@ -1065,7 +1064,7 @@ msgstr "Skrap %d item(s) permanent? (Geen ontdoen!)"
msgid "Show Dependencies"
msgstr "Afhanklikhede"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Verweerde Hulpbron Verkenner"
@@ -1155,14 +1154,16 @@ msgid "License"
msgstr "Lisensie"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Derdeparty-lisensie"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Enjin maak staat op 'n nommer derdeparty vry en oopbron biblioteke, "
@@ -1183,7 +1184,8 @@ msgid "Licenses"
msgstr "Lisensies"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Fout met oopmaak, die pakket-lêer is nie in zip format nie."
#: editor/editor_asset_installer.cpp
@@ -1692,12 +1694,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2126,6 +2127,10 @@ msgstr "Vee uit"
msgid "Clear Output"
msgstr "Afvoer:"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2423,6 +2428,15 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Open Lêer(s)"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2518,6 +2532,11 @@ msgstr ""
msgid "Close Tab"
msgstr "Maak Toe"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Maak Toe"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2604,6 +2623,10 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr ""
@@ -2614,14 +2637,6 @@ msgid "Save All Scenes"
msgstr "Stoor As"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr ""
@@ -2651,16 +2666,20 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
@@ -2668,11 +2687,16 @@ msgstr ""
msgid "Open Project Data Folder"
msgstr "Projek Stigters"
-#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
msgstr ""
#: editor/editor_node.cpp
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Verweerde Hulpbron Verkenner"
+
+#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr ""
@@ -2749,13 +2773,14 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
-msgstr ""
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
+msgstr "Oorgange"
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2791,14 +2816,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2806,12 +2831,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Soek"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3252,7 +3278,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3269,6 +3295,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3330,12 +3360,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3349,14 +3377,20 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Kan nie verwyder nie:\n"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
-msgstr ""
+#, fuzzy
+msgid "Error requesting URL:"
+msgstr "Fout terwyl laai:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
@@ -3443,20 +3477,12 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "Gunstelinge:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3492,11 +3518,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3562,6 +3588,11 @@ msgstr "Dupliseer"
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Stoor Hulpbron As..."
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3631,6 +3662,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Skep Vouer"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3699,6 +3735,14 @@ msgid "Search complete"
msgstr "Deursoek Teks"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "AutoLaai '%s' bestaan reeds!"
@@ -3708,12 +3752,22 @@ msgstr "AutoLaai '%s' bestaan reeds!"
msgid "Invalid group name."
msgstr "Ongeldige naam."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Hernoem Oudio-Bus"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Skrap"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3726,12 +3780,13 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
+#, fuzzy
+msgid "Group Editor"
+msgstr "Afhanklikheid Bewerker"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3941,7 +3996,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4722,10 +4777,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4738,14 +4789,43 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Kan nie verwyder nie:\n"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4824,8 +4904,12 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Ek sien..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4846,7 +4930,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4858,6 +4942,11 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Laai"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -5019,6 +5108,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Vee uit"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -5049,6 +5143,7 @@ msgid "Zoom Reset"
msgstr "Zoem Uit"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -5069,14 +5164,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "Wissel Modus"
@@ -5101,6 +5199,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5117,11 +5216,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5134,6 +5228,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5346,16 +5445,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5673,14 +5762,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5764,19 +5845,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't contain geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6111,7 +6196,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6220,12 +6304,7 @@ msgstr "Leêr word gebêre:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "Kon nie vouer skep nie."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "Kon nie vouer skep nie."
#: editor/plugins/script_editor_plugin.cpp
@@ -6254,7 +6333,7 @@ msgid "Error Importing"
msgstr "Fout terwyl laai:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6340,6 +6419,11 @@ msgid "Open..."
msgstr "Oop"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Afhanklikheid Bewerker"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6379,11 +6463,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6473,6 +6557,10 @@ msgstr ""
msgid "Search Results"
msgstr "Deursoek Hulp"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6545,6 +6633,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6580,26 +6669,6 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Wissel Modus"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Gaan na Volgende Stap"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Gaan na Vorige Stap"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Hernoem AutoLaai"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr ""
@@ -6620,6 +6689,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Skaal Seleksie"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6636,32 +6710,37 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Vind"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "Gaan na Volgende Stap"
+msgid "Toggle Bookmark"
+msgstr "Wissel Modus"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "Gaan na Vorige Stap"
+msgid "Go to Next Bookmark"
+msgstr "Gaan na Volgende Stap"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Gaan na Vorige Stap"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Vind"
+msgid "Remove All Bookmarks"
+msgstr "Hernoem AutoLaai"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6674,9 +6753,24 @@ msgid "Go to Line..."
msgstr "Gaan na Reël"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Gaan na Volgende Stap"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Gaan na Vorige Stap"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -6915,8 +7009,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Verander Anim Lente"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6969,7 +7064,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6980,27 +7075,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7044,22 +7119,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -7114,7 +7173,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7419,10 +7478,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7511,11 +7566,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7637,8 +7692,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7940,6 +7995,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -8022,6 +8081,11 @@ msgid "Duplicate Nodes"
msgstr "Anim Dupliseer Sleutels"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Skrap"
@@ -8031,10 +8095,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -8048,6 +8108,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Skep Vouer"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Skep Vouer"
@@ -8412,7 +8477,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8421,7 +8486,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8585,6 +8650,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8610,7 +8679,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8619,7 +8688,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8628,14 +8697,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8680,6 +8749,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8887,6 +8963,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9037,6 +9117,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
#, fuzzy
msgid "Can't open project at '%s'."
msgstr "Kan nie '%s' oopmaak nie."
@@ -9107,8 +9195,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9128,8 +9216,9 @@ msgid "Project Manager"
msgstr "Projek Bestuurder"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "Projek Stigters"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9153,10 +9242,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9494,6 +9579,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9546,14 +9635,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -9846,6 +9927,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9971,19 +10056,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10077,6 +10162,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10268,6 +10357,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10682,10 +10775,31 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr ""
+"Ongeldige naam. Dit moet nie met bestaande ingeboude tiepename bots nie."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Skep Nuwe"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Skep Nuwe"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Skep Intekening"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10872,10 +10986,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "Lede"
@@ -11620,22 +11730,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11669,6 +11763,10 @@ msgid "Constants cannot be modified."
msgstr ""
#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "Kon nie vouer skep nie."
+
+#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "Voorskou:"
diff --git a/editor/translations/ar.po b/editor/translations/ar.po
index 21d1f3e745..341617c1b8 100644
--- a/editor/translations/ar.po
+++ b/editor/translations/ar.po
@@ -29,12 +29,13 @@
# ButterflyOfFire <ButterflyOfFire@protonmail.com>, 2019.
# PhoenixHO <oussamahaddouche0@gmail.com>, 2019.
# orcstudio <orcstudio@orcstudio.org>, 2019.
+# Rachid Graphicos <graphicos1d@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-29 19:20+0000\n"
-"Last-Translator: orcstudio <orcstudio@orcstudio.org>\n"
+"PO-Revision-Date: 2019-08-15 10:23+0000\n"
+"Last-Translator: Rachid Graphicos <graphicos1d@gmail.com>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/"
"godot/ar/>\n"
"Language: ar\n"
@@ -43,7 +44,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.8\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -85,7 +86,6 @@ msgid "On call to '%s':"
msgstr "عند الأستدعاء إلى '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "مجاني/ÙØ§Ø±Øº"
@@ -679,17 +679,18 @@ msgid "Line Number:"
msgstr "رقم الخط:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "Ø¥Ø³ØªØ¨ÙØ¯Ù„ %d حادثة(حوادث)."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+#, fuzzy
+msgid "%d matches."
msgstr "لا مطابقة"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Ø¥Ø³ØªØ¨ÙØ¯Ù„ %d حادثة(حوادث)."
-
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "قضية تشابه"
@@ -922,8 +923,7 @@ msgstr "Ø§Ù„Ù…ÙØ¶Ù„Ø©:"
msgid "Recent:"
msgstr "الحالي:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1026,7 +1026,7 @@ msgstr ""
"المل٠الذي ÙŠÙمسح مطلوب من موارد أخري لكل تعمل جيداً.\n"
"إمسح علي أية حال؟ (لا رجعة)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "لا يمكن المسح:"
@@ -1063,7 +1063,7 @@ msgstr "إمسح نهائيا %d عنصر(عناصر)؟ (بلا رجعة!)"
msgid "Show Dependencies"
msgstr "التبعيات"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Ù…ØªØµÙØ­ الموارد Ø£ÙˆØ±ÙØ§Ù†"
@@ -1152,14 +1152,16 @@ msgid "License"
msgstr "الرخصة"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "ترخيص الطر٠الثالث"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"محرك \"Godot\" يعتمد على عدد من المكتبات و المكونات البرمجية لملاك اخرين و "
@@ -1180,7 +1182,8 @@ msgid "Licenses"
msgstr "تراخيص"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "خطأ Ø¹Ù†Ø¯ÙØªØ­ مل٠الحزمة بسبب أن المل٠ليس ÙÙŠ صيغة \"ZIP\"."
#: editor/editor_asset_installer.cpp
@@ -1690,12 +1693,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "إستيراد"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "تصدير"
@@ -2120,6 +2122,10 @@ msgstr "خالي"
msgid "Clear Output"
msgstr "أخلاء الخرج"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "تصدير المشروع ÙØ´Ù„, رمز الخطأ %d."
@@ -2439,6 +2445,15 @@ msgid "Pick a Main Scene"
msgstr "إختر المشهد الأساسي"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "اغلاق المشهد"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "اغلاق المشهد"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr "غير قادر علي ØªÙØ¹ÙŠÙ„ Ø¥Ø¶Ø§ÙØ© البرنامج Ø§Ù„Ù…ÙØ³Ø§Ø¹Ø¯ ÙÙŠ: '%s' تحميل الظبط ÙØ´Ù„."
@@ -2551,6 +2566,11 @@ msgstr "تشغيل المشهد"
msgid "Close Tab"
msgstr "اغلاق"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "اغلاق"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2637,6 +2657,10 @@ msgstr "مشهد مورث جديد..."
msgid "Open Scene..."
msgstr "Ø§ÙØªØ­ مشهد..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "ÙÙØªØ­ مؤخراً"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Ø­ÙØ¸ المشهد"
@@ -2647,14 +2671,6 @@ msgid "Save All Scenes"
msgstr "Ø­ÙØ¸ جميع المشاهد"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "اغلاق المشهد"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "ÙÙØªØ­ مؤخراً"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "تحويل الي..."
@@ -2684,26 +2700,37 @@ msgstr "إعادة المشهد"
msgid "Miscellaneous project or scene-wide tools."
msgstr "ادوات لكل-المشهد او لمشاريع متنوعه."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "مشروع"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "إعدادات المشروع"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "ادوات"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "تصدير"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "ÙØªØ­ مدير المشروع؟"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "ادوات"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Ù…ØªØµÙØ­ الموارد Ø£ÙˆØ±ÙØ§Ù†"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2799,12 +2826,13 @@ msgstr ""
"حينما يتم إستخدامة عن بعد علي جهاز، سيكون هذا أكثر ÙØ¹Ø§Ù„ية مع نظام شبكات "
"Ø§Ù„Ù…Ù„ÙØ§Øª."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Ø§Ù„Ù…ÙØ¹Ø¯Ù„"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "إعدادات Ø§Ù„Ù…ÙØ¹Ø¯Ù„"
#: editor/editor_node.cpp
@@ -2846,14 +2874,15 @@ msgstr "إعدادات Ø§Ù„Ù…ÙØ¹Ø¯Ù„"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "إدارة قوالب التصدير"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "إدارة قوالب التصدير"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "مساعدة"
@@ -2861,12 +2890,13 @@ msgstr "مساعدة"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "بحث"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "مستندات الإنترنت"
@@ -3320,7 +3350,8 @@ msgid "Import From Node:"
msgstr "إستيراد من عقدة:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "اعادة التحميل"
#: editor/export_template_manager.cpp
@@ -3337,6 +3368,10 @@ msgid "Download"
msgstr "تنزيل"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Ù…Ùقود)"
@@ -3401,12 +3436,10 @@ msgid "No response."
msgstr "لا يوجد إستجابة."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "ÙØ´Ù„ الطلب."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "اعادة توجيه حلقة التكرار."
@@ -3420,13 +3453,19 @@ msgid "Download Complete."
msgstr "التحميل إكتمل."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "لا يمكن المسح:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "خطأ ÙÙŠ طلب الرابط: "
#: editor/export_template_manager.cpp
@@ -3514,21 +3553,12 @@ msgstr "تنزيل القوالب"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "حدد Ø§Ù„Ø³Ø±ÙØ± من القائمة: "
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"لا يمكن ÙØªØ­ file_type_cache.cch من إجل الكتابة، لا يمكن Ø­ÙØ¸ خبأ أنواع الملÙ!"
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "Ø§Ù„Ù…ÙØ¶Ù„Ø©:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "لا يمكن التنقل إلي '%s' حيث لم يتم العثور عليها ÙÙŠ نظام Ø§Ù„Ù…Ù„ÙØ§Øª!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr "الحالة: إستيراد Ø§Ù„Ù…Ù„Ù ÙØ´Ù„. من ÙØ¶Ù„Ùƒ أصلح المل٠و أعد إستيراده يدوياً."
@@ -3562,14 +3592,14 @@ msgid "Provided name contains invalid characters."
msgstr "الأسم المÙقدم يحتوي علي حرو٠خاطئة"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "الأسم يحتوي علي أحر٠غير صالحة."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "مل٠أو مجلد مع هذا الأسم موجود Ø¨Ø§Ù„ÙØ¹Ù„."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "الأسم يحتوي علي أحر٠غير صالحة."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "إعادة تسمية ملÙ:"
@@ -3629,6 +3659,11 @@ msgstr "تكرير..."
msgid "Move To..."
msgstr "تحريك إلي..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "مشهد جديد"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3703,6 +3738,11 @@ msgstr "مل٠أو مجلد مع هذا الأسم موجود Ø¨Ø§Ù„ÙØ¹Ù„."
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Ø­ÙØ¸ المشهد"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3772,6 +3812,14 @@ msgid "Search complete"
msgstr "إبحث عن كتابة"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Ø¥Ø¶Ø§ÙØ© إلي مجموعة"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "حذ٠من المجموعة"
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "خطأ: إسم الحركة موجود Ø¨Ø§Ù„ÙØ¹Ù„!"
@@ -3781,13 +3829,23 @@ msgstr "خطأ: إسم الحركة موجود Ø¨Ø§Ù„ÙØ¹Ù„!"
msgid "Invalid group name."
msgstr "اسم غير صالح."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "المجموعات"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "مسح المخطط"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "المجموعات"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr "Ø¥Ø¶Ø§ÙØ© إلي مجموعة"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3801,12 +3859,13 @@ msgid "Nodes in Group"
msgstr "Ø¥Ø¶Ø§ÙØ© إلي مجموعة"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Ø¥Ø¶Ø§ÙØ© إلي مجموعة"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "حذ٠من المجموعة"
+#, fuzzy
+msgid "Group Editor"
+msgstr "ÙØªØ­ Ù…ÙØ¹Ø¯Ù„ الكود"
#: editor/groups_editor.cpp
#, fuzzy
@@ -4017,7 +4076,8 @@ msgid "MultiNode Set"
msgstr "تحديد عقد متعددة"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "حدد عقدة لكي ØªÙØ¹Ø¯Ù„ الإشارات والمجموعات."
#: editor/plugin_config_dialog.cpp
@@ -4816,10 +4876,6 @@ msgid "View Files"
msgstr "إظهار Ø§Ù„Ù…Ù„ÙØ§Øª"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "لا يمكن حل أسم Ø§Ù„Ù…ÙØ¶ÙŠÙ:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "خطأ ÙÙŠ الإتصال، من ÙØ¶Ù„Ùƒ حاول مجدداً."
@@ -4832,14 +4888,47 @@ msgid "No response from host:"
msgstr "لا ردّ من Ø§Ù„Ù…ÙØ¶ÙŠÙ:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "لا يمكن حل أسم Ø§Ù„Ù…ÙØ¶ÙŠÙ:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "ÙØ´Ù„ إتمام الطلب٫ الرمز الذي تم إرجاعه:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "ÙØ´Ù„ الطلب."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "لا يمكن المسح:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "ÙØ´Ù„ الطلب٫ السبب هو اعادة التحويل مرات اكثر من اللازم"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "اعادة توجيه حلقة التكرار."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "ÙØ´Ù„ إتمام الطلب٫ الرمز الذي تم إرجاعه:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "الوقت"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "تجزئة تحميل سيئة، من المتوقع أن يكون المل٠قد تم العبث به."
@@ -4921,8 +5010,13 @@ msgid "All"
msgstr "الكل"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "إستيراد"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Ø¥Ø¶Ø§ÙØ§Øª"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4944,7 +5038,8 @@ msgid "Site:"
msgstr "الموقع:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "الدعم..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4956,6 +5051,11 @@ msgid "Testing"
msgstr "أختبار"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "تحميل"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "مل٠أصول مضغوط"
@@ -5126,6 +5226,11 @@ msgstr "لصق الوضع"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "إخلاء الوضع"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "أنشئ نقاط إنبعاث من الشبكة"
@@ -5155,6 +5260,7 @@ msgid "Zoom Reset"
msgstr "إعادة تعيين التكبير"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "تحديد الوضع"
@@ -5175,14 +5281,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+زر Ø§Ù„ÙØ£Ø±Ø© الأيمن: تحديد قائمة العمق"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "وضع التحريك"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "وضع التدوير"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "تحديد الوضع"
@@ -5210,6 +5319,7 @@ msgid "Toggle snapping."
msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ الكبس"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "إستخدم الكبس"
@@ -5228,11 +5338,6 @@ msgid "Use Rotation Snap"
msgstr "إستعمال كبس التدوير"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "تعديل الكبس..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "نسبية الكبس"
@@ -5246,6 +5351,11 @@ msgid "Smart Snapping"
msgstr "الكبس الذكي"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "تعديل الكبس..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
msgstr "الكبس إلي الطÙÙ„"
@@ -5468,16 +5578,6 @@ msgstr "حدد المعامل"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "خطأ تحميل الصورة:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "لا بيكسل Ø¨Ø´ÙØ§Ùية > 128 ÙÙŠ الصورة..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "حمل قناع الانبعاث"
@@ -5801,14 +5901,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "مصدر السطح خاطئ (لا وجوه)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "الأب ليس لديه وجوه ثابته لكي تتزايد."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "لا يمكنه تخطيط المنطقة."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "حدد مصدر ميش:"
@@ -5894,20 +5986,27 @@ msgid "Generation Time (sec):"
msgstr "وقت التوليد (تانية):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "الوجوه لا تحتوي على منطقة!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "العقدة لا تحتوي على هندسة (الوجوه)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "لا وجوه!"
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "العقدة لا تحتوي على هندسة."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "العقدة لا تحتوي على هندسة (الوجوه)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "العقدة لا تحتوي على هندسة."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6249,7 +6348,6 @@ msgid "Grid Settings"
msgstr "إعدادات Ø§Ù„Ù…ÙØ¹Ø¯Ù„"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6363,12 +6461,7 @@ msgstr "خطأ ÙÙŠ Ø­ÙØ¸ مجموعة البلاط!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "لا يمكن إنشاء المجلد."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "لا يمكن إنشاء المجلد."
#: editor/plugins/script_editor_plugin.cpp
@@ -6398,7 +6491,7 @@ msgstr "خطأ ÙÙŠ تحريك:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "مجلد جديد..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6421,7 +6514,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving"
-msgstr ""
+msgstr "خطأ ÙÙŠ Ø§Ù„Ø­ÙØ¸"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
@@ -6435,7 +6528,7 @@ msgstr " مرجع الصنÙ"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Next"
-msgstr ""
+msgstr "بحث عن التالي"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6459,13 +6552,13 @@ msgstr "ترتيب"
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Up"
-msgstr ""
+msgstr "تحريك لأعلى"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Down"
-msgstr ""
+msgstr "تحرك لأسÙÙ„"
#: editor/plugins/script_editor_plugin.cpp
msgid "Next script"
@@ -6477,7 +6570,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "File"
-msgstr ""
+msgstr "ملÙ"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6485,8 +6578,13 @@ msgid "Open..."
msgstr "Ø¥ÙØªØ­"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "ÙØªØ­ الكود"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
-msgstr ""
+msgstr "Ø§Ø­ÙØ¸ الكل"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
@@ -6524,11 +6622,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6619,6 +6717,11 @@ msgstr ""
msgid "Search Results"
msgstr "إبحث ÙÙŠ المساعدة"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "إخلاء المشاهد الحالية"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6691,6 +6794,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6726,26 +6830,6 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ وضع النظرة الحرة"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "إذهب إلي الخطوة التالية"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "إذهب إلي الخطوة السابقة"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "مسح الكل"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ طي الخط"
@@ -6766,6 +6850,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "تكبير المحدد"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6784,32 +6873,37 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Ùلتر Ø§Ù„Ù…Ù„ÙØ§Øª..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "إذهب إلي الخطوة التالية"
+msgid "Toggle Bookmark"
+msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ وضع النظرة الحرة"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "إذهب إلي الخطوة السابقة"
+msgid "Go to Next Bookmark"
+msgstr "إذهب إلي الخطوة التالية"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "إذهب إلي الخطوة السابقة"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Ùلتر Ø§Ù„Ù…Ù„ÙØ§Øª..."
+msgid "Remove All Bookmarks"
+msgstr "مسح الكل"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6822,9 +6916,24 @@ msgid "Go to Line..."
msgstr "إذهب إلي الخط"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "إذهب إلي الخطوة التالية"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "إذهب إلي الخطوة السابقة"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -7066,8 +7175,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "تغيير خط الحركة"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7122,8 +7232,8 @@ msgid "Snap Nodes To Floor"
msgstr "الكبس إلي الشبكة"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "تحديد الوضع (ض)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7133,30 +7243,10 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "وضع الكبس (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr ""
@@ -7197,22 +7287,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ وضع النظرة الحرة"
@@ -7268,8 +7342,9 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
-msgstr ""
+#, fuzzy
+msgid "Settings..."
+msgstr "جاري الإعداد..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7579,10 +7654,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7677,12 +7748,12 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "عنصر"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "عنصر"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7807,8 +7878,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8127,6 +8198,10 @@ msgid "TileSet"
msgstr "مجموعة البلاط"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "أض٠مدخله"
@@ -8216,6 +8291,11 @@ msgid "Duplicate Nodes"
msgstr "Ù…ÙØ§ØªÙŠØ­ نسخ التحريك"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "إنشاء عقدة"
@@ -8225,10 +8305,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -8243,6 +8319,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "إنشاء عقدة"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "إنشاء عقدة"
@@ -8609,7 +8690,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8618,7 +8699,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8782,6 +8863,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8807,7 +8892,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8816,7 +8901,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8825,14 +8910,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8878,6 +8963,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9093,6 +9185,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "إدارة قوالب التصدير"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9241,6 +9337,15 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "بناء المشروع"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "لا يمكن ÙØªØ­ المشروع"
@@ -9313,8 +9418,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9334,8 +9439,9 @@ msgid "Project Manager"
msgstr "مدير المشروع"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "مشروع"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9359,10 +9465,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9701,6 +9803,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Ø¥Ø¶Ø§ÙØ§Øª"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9753,14 +9859,6 @@ msgstr "إختر طريقة Ø¥ÙØªØ±Ø§Ø¶ÙŠØ©"
msgid "Select Method"
msgstr "إختر طريقة"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10061,6 +10159,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10188,19 +10290,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10297,6 +10399,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10495,6 +10601,10 @@ msgid "Change Shortcut"
msgstr "تغيير المرتكزات"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "إعدادات Ø§Ù„Ù…ÙØ¹Ø¯Ù„"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10920,10 +11030,30 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "إسم غير صالح، يجب أن لا يتصادم مع الأسماء المبنية تلقائياً الموجودة."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "إنشاء %s جديد"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "إنشاء %s جديد"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "أنشئ شكل جديد من لا شئ."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -11111,10 +11241,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "الأعضاء"
@@ -11869,39 +11995,21 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "خطأ ÙÙŠ Ù…Ø¹Ø±ÙØ© النوع الحر."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "صيغة الخط غير Ù…Ø¹Ø±ÙˆÙØ©."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "حدث خطأ أثناء تحميل الخط."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "حجم الخط غير مناسب."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "إدخال"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for preview."
-msgstr "مصدر غير صالح لتظليل."
+msgstr "مصدر غير صالح للمعاينة."
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
msgstr "مصدر غير صالح لتظليل."
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid comparison function for that type."
-msgstr "مصدر غير صالح لتظليل."
+msgstr "comparison function غير صالحة لهذا النوع."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
@@ -11919,6 +12027,55 @@ msgstr "يمكن تعيين المتغيرات Ùقط ÙÙŠ الذروة ."
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "لا يمكن ÙØªØ­ file_type_cache.cch من إجل الكتابة، لا يمكن Ø­ÙØ¸ خبأ أنواع "
+#~ "الملÙ!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "لا يمكن التنقل إلي '%s' حيث لم يتم العثور عليها ÙÙŠ نظام Ø§Ù„Ù…Ù„ÙØ§Øª!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "خطأ تحميل الصورة:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "لا بيكسل Ø¨Ø´ÙØ§Ùية > 128 ÙÙŠ الصورة..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "الأب ليس لديه وجوه ثابته لكي تتزايد."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "لا يمكنه تخطيط المنطقة."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "الوجوه لا تحتوي على منطقة!"
+
+#~ msgid "No faces!"
+#~ msgstr "لا وجوه!"
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "لا يمكن إنشاء المجلد."
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "تحديد الوضع (ض)"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "وضع الكبس (%s)"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "خطأ ÙÙŠ Ù…Ø¹Ø±ÙØ© النوع الحر."
+
+#~ msgid "Unknown font format."
+#~ msgstr "صيغة الخط غير Ù…Ø¹Ø±ÙˆÙØ©."
+
+#~ msgid "Error loading font."
+#~ msgstr "حدث خطأ أثناء تحميل الخط."
+
+#~ msgid "Invalid font size."
+#~ msgstr "حجم الخط غير مناسب."
+
#~ msgid "Previous Folder"
#~ msgstr "المجلد السابق"
@@ -11951,9 +12108,6 @@ msgstr ""
#~ msgid "Create C# solution"
#~ msgstr "إنشاء حل C#‎"
-#~ msgid "Build Project"
-#~ msgstr "بناء المشروع"
-
#, fuzzy
#~ msgid "View log"
#~ msgstr "إظهار Ø§Ù„Ù…Ù„ÙØ§Øª"
@@ -12339,9 +12493,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "لا يمكن Ø­ÙØ¸ النسيج Ø§Ù„ÙØ±Ø¹ÙŠ Ù„Ù„Ø£Ø·Ù„Ø³:"
-#~ msgid "Setting Up..."
-#~ msgstr "جاري الإعداد..."
-
#~ msgid "The quick brown fox jumps over the lazy dog."
#~ msgstr "أبجد هوز حطي كلمن ØµØ¹ÙØµ قرشت ثخذ ضظغ."
diff --git a/editor/translations/bg.po b/editor/translations/bg.po
index 848408b8f3..eab5310b25 100644
--- a/editor/translations/bg.po
+++ b/editor/translations/bg.po
@@ -66,7 +66,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Free"
msgstr "Свободен"
@@ -667,17 +666,18 @@ msgid "Line Number:"
msgstr "Ðомер на Реда:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr ""
+#, fuzzy
+msgid "Replaced %d occurrence(s)."
+msgstr "Готово - %d замеÑтване(ниÑ)."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "ÐÑма СъвпадениÑ"
+msgid "%d match."
+msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/editor_help.cpp
#, fuzzy
-msgid "Replaced %d occurrence(s)."
-msgstr "Готово - %d замеÑтване(ниÑ)."
+msgid "%d matches."
+msgstr "ÐÑма СъвпадениÑ"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -910,8 +910,7 @@ msgstr "Любими:"
msgid "Recent:"
msgstr "Скорошни:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1006,7 +1005,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Ðе може да Ñе премахне:"
@@ -1044,7 +1043,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr "ЗавиÑимоÑти"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1134,14 +1133,14 @@ msgid "License"
msgstr "Лиценз"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1158,7 +1157,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1658,12 +1657,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "ВнаÑÑне"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "ИзнаÑÑне"
@@ -2086,6 +2084,10 @@ msgstr "ИзчиÑтване"
msgid "Clear Output"
msgstr "Ðова Ñцена"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2386,6 +2388,15 @@ msgid "Pick a Main Scene"
msgstr "Изберете главна Ñцена"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "ЗатварÑне на Ñцената"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "ЗатварÑне на Ñцената"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2484,6 +2495,11 @@ msgstr "Възпроизвеждане на Ñцената"
msgid "Close Tab"
msgstr "ЗатварÑне"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "ЗатварÑне"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2572,6 +2588,10 @@ msgstr ""
msgid "Open Scene..."
msgstr "ОтварÑне на Ñцена..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Запазване на Ñцената"
@@ -2582,14 +2602,6 @@ msgid "Save All Scenes"
msgstr "Запазване на вÑички Ñцени"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "ЗатварÑне на Ñцената"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr ""
@@ -2619,25 +2631,35 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Проект"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "ÐаÑтройки на проекта"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Сечива"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "ИзнаÑÑне"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "ДиÑпечер на проектите"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Сечива"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2717,12 +2739,13 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "ÐаÑтройки на редактора"
#: editor/editor_node.cpp
@@ -2763,14 +2786,15 @@ msgid "Open Editor Settings Folder"
msgstr "ÐаÑтройки на редактора"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
-msgstr ""
-
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+msgid "Manage Editor Features..."
msgstr ""
#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
+msgstr "Шаблони"
+
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2778,12 +2802,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "ТърÑене"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3227,8 +3252,9 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
-msgstr ""
+#, fuzzy
+msgid "Redownload"
+msgstr "Презареди"
#: editor/export_template_manager.cpp
msgid "Uninstall"
@@ -3245,6 +3271,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3307,13 +3337,11 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Request Failed."
msgstr "Запитване..."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3327,14 +3355,19 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Ðе може да Ñе премахне:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
#, fuzzy
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr "Имаше грешка при внаÑÑнето:"
#: editor/export_template_manager.cpp
@@ -3427,20 +3460,12 @@ msgstr "Шаблони"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "Любими:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3476,14 +3501,14 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Вече ÑъщеÑтвува файл или папка Ñ Ñ‚Ð¾Ð²Ð° име."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Renaming file:"
msgstr "Имаше грешка при внаÑÑнето:"
@@ -3545,6 +3570,11 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Ðова Ñцена"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3615,6 +3645,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Запазване на Ñцената"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3680,6 +3715,14 @@ msgid "Search complete"
msgstr "ТърÑенето е завършено"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "Група Ñ Ñ‚Ð¾Ð²Ð° име вече ÑъщеÑтвува."
@@ -3689,12 +3732,22 @@ msgstr "Група Ñ Ñ‚Ð¾Ð²Ð° име вече ÑъщеÑтвува."
msgid "Invalid group name."
msgstr "невалидно име на Група."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Ðов проект"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Избиране на вÑичко"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Групи"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3708,12 +3761,13 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
+#, fuzzy
+msgid "Group Editor"
+msgstr "Отвори Кодов Редактор"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3937,7 +3991,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4731,10 +4785,6 @@ msgid "View Files"
msgstr "Преглед на файловете"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Грешка във връзката, Ð¼Ð¾Ð»Ñ Ð¾Ð¿Ð¸Ñ‚Ð°Ð¹ отново."
@@ -4747,14 +4797,45 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "ЗаÑвката Ñе провали, върнат код:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Запитване..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Ðе може да Ñе премахне:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "ЗаÑвката Ñе провали, твърде много пренаÑочваниÑ"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "ЗаÑвката Ñе провали, върнат код:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4833,8 +4914,13 @@ msgid "All"
msgstr "Ð’Ñички"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Повторно внаÑÑне..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "ПриÑтавки"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4856,7 +4942,8 @@ msgid "Site:"
msgstr "МÑÑто:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Поддръжка..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4868,6 +4955,11 @@ msgid "Testing"
msgstr "ТеÑтова"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Зареди..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -5034,6 +5126,11 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "Възпроизвеждане на Ñцена по избор"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Възпроизвеждане на Ñцена по избор"
@@ -5064,6 +5161,7 @@ msgid "Zoom Reset"
msgstr "Оригинално увеличение"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Режим на Селектиране"
@@ -5084,14 +5182,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Режим на ПремеÑтване"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Режим на Завъртане"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "Режим на Селектиране"
@@ -5118,6 +5219,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5134,11 +5236,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5151,6 +5248,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5368,16 +5470,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5695,14 +5787,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5786,20 +5870,27 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "ÐÑма лица!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Възелът не Ñъдържа Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ (лица)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Възелът не Ñъдържа геометриÑ."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Възелът не Ñъдържа Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ (лица)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Възелът не Ñъдържа геометриÑ."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6136,7 +6227,6 @@ msgid "Grid Settings"
msgstr "ÐаÑтройки"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6243,11 +6333,7 @@ msgstr "Грешка при запиÑване на TextFile:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "Грешка, не можа да Ñе зареди файла."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "Грешка, не можа да Ñе зареди файла."
#: editor/plugins/script_editor_plugin.cpp
@@ -6275,7 +6361,8 @@ msgid "Error Importing"
msgstr "Имаше грешка при внаÑÑнето"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Ðов TextFile..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6360,6 +6447,11 @@ msgid "Open..."
msgstr "Отвори"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Ðова Ñцена"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Запази Ð’Ñичко"
@@ -6399,13 +6491,13 @@ msgid "Save Theme"
msgstr "Запази Темата"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Затвори ДокументациÑта"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "ЗатварÑне на вÑичко"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Затвори ДокументациÑта"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "ПуÑкане"
@@ -6496,6 +6588,11 @@ msgstr "ОтÑтранител на грешки"
msgid "Search Results"
msgstr "ТърÑене"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "ЗатварÑне на Ñцената"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6565,6 +6662,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6600,26 +6698,6 @@ msgid "Toggle Comment"
msgstr "Вкарай Коментар"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Добави Breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Отиди на ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Отиди на ÐŸÑ€ÐµÐ´Ð¸ÑˆÐ½Ð¸Ñ Breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Премахни Ð’Ñички Breakpoint-ове"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Разтвори/Събери Реда"
@@ -6641,6 +6719,11 @@ msgstr "Завърши Символа (Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð·Ð° довършÐ
#: editor/plugins/script_text_editor.cpp
#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Центрирай върху СелекциÑта"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
msgid "Trim Trailing Whitespace"
msgstr "Премахни Празните Ñимволи в ÐºÑ€Ð°Ñ Ð½Ð° реда"
@@ -6657,32 +6740,37 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Добави Breakpoint"
+msgid "Find Previous"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Премахни Ð’Ñички Breakpoint-ове"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Ðамери във файлове"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "Отиди на ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Breakpoint"
+msgid "Toggle Bookmark"
+msgstr "Добави Breakpoint"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "Отиди на ÐŸÑ€ÐµÐ´Ð¸ÑˆÐ½Ð¸Ñ Breakpoint"
+msgid "Go to Next Bookmark"
+msgstr "Отиди на ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Breakpoint"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Отиди на ÐŸÑ€ÐµÐ´Ð¸ÑˆÐ½Ð¸Ñ Breakpoint"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Ðамери във файлове"
+msgid "Remove All Bookmarks"
+msgstr "Премахни Ð’Ñички Breakpoint-ове"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6694,8 +6782,23 @@ msgid "Go to Line..."
msgstr "Отиди на Ред"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr ""
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Добави Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Премахни Ð’Ñички Breakpoint-ове"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Отиди на ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Отиди на ÐŸÑ€ÐµÐ´Ð¸ÑˆÐ½Ð¸Ñ Breakpoint"
#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
@@ -6940,8 +7043,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Позволи филтриране"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6994,8 +7098,8 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Режим на Селектиране (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7005,31 +7109,10 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap Mode (%s)"
-msgstr "Избиране на вÑичко"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr ""
@@ -7070,22 +7153,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -7140,7 +7207,8 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "ÐаÑтройки"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7450,10 +7518,6 @@ msgid "TextureRegion"
msgstr "Двуизмерна текÑтура"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7543,11 +7607,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7670,8 +7734,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7992,6 +8056,10 @@ msgid "TileSet"
msgstr "Файл:"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -8079,6 +8147,11 @@ msgid "Duplicate Nodes"
msgstr "Ðаправи дупликат на Key(s)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "ПоÑтавÑне на възелите"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Избиране на вÑичко"
@@ -8088,10 +8161,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -8105,6 +8174,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Създай Възел"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Създай Възел"
@@ -8466,7 +8540,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8475,7 +8549,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8639,6 +8713,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8664,7 +8742,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8673,7 +8751,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8682,14 +8760,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8734,6 +8812,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8949,6 +9034,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9105,6 +9194,15 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "ВнаÑÑне на ÑъщеÑтвуващ проект"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "Създаване на нов проект"
@@ -9174,8 +9272,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9195,8 +9293,9 @@ msgid "Project Manager"
msgstr "ДиÑпечер на проектите"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "СпиÑък Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð¸"
+#, fuzzy
+msgid "Projects"
+msgstr "Проект"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9220,10 +9319,6 @@ msgid "Templates"
msgstr "Шаблони"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Изход"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9568,6 +9663,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "ПриÑтавки"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9623,14 +9722,6 @@ msgstr "Изберете метод"
msgid "Select Method"
msgstr "Изберете метод"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9927,6 +10018,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10055,19 +10150,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10165,6 +10260,10 @@ msgid "Error loading script from %s"
msgstr "Грешка при зареждането на шрифта."
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10360,6 +10459,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "ÐаÑтройки на редактора"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10794,10 +10897,29 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Създай нови възли."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Създай нови възли."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Създай нов полигон от нулата."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10988,10 +11110,6 @@ msgid "Cut Nodes"
msgstr "ИзрÑзване на възелите"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "ПоÑтавÑне на възелите"
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "Файл:"
@@ -11773,22 +11891,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Ðепознат формат за шрифтове."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Грешка при зареждането на шрифта."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11821,6 +11923,32 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "No faces!"
+#~ msgstr "ÐÑма лица!"
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "Грешка, не можа да Ñе зареди файла."
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Режим на Селектиране (Q)"
+
+#, fuzzy
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Избиране на вÑичко"
+
+#~ msgid "Project List"
+#~ msgstr "СпиÑък Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð¸"
+
+#~ msgid "Exit"
+#~ msgstr "Изход"
+
+#~ msgid "Unknown font format."
+#~ msgstr "Ðепознат формат за шрифтове."
+
+#~ msgid "Error loading font."
+#~ msgstr "Грешка при зареждането на шрифта."
+
#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "Предишен подпрозорец"
@@ -12003,9 +12131,6 @@ msgstr ""
#~ "Status: Needs Re-Import"
#~ msgstr "Запазване и повторно внаÑÑне"
-#~ msgid "Re-Import..."
-#~ msgstr "Повторно внаÑÑне..."
-
#~ msgid "Font Import"
#~ msgstr "ВнаÑÑне на шрифт"
diff --git a/editor/translations/bn.po b/editor/translations/bn.po
index 97f6925f1d..44a7be497c 100644
--- a/editor/translations/bn.po
+++ b/editor/translations/bn.po
@@ -65,7 +65,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "মà§à¦•à§à¦¤ করে দিন"
@@ -691,17 +690,18 @@ msgid "Line Number:"
msgstr "লাইন নামà§à¦¬à¦¾à¦°:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "%d সংখà§à¦¯à¦• সংঘটন পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¿à¦¤ হয়েছে ।"
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+#, fuzzy
+msgid "%d matches."
msgstr "কোনো মিল নেই"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d সংখà§à¦¯à¦• সংঘটন পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¿à¦¤ হয়েছে ।"
-
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "অকà§à¦·à¦°à§‡à¦° মাতà§à¦°à¦¾ (বড়/ছোট-হাতের) মিল করà§à¦¨"
@@ -945,8 +945,7 @@ msgstr "ফেবরিট/পà§à¦°à¦¿à¦¯à¦¼-সমূহ:"
msgid "Recent:"
msgstr "সামà§à¦ªà§à¦°à¦¤à¦¿à¦•:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1050,7 +1049,7 @@ msgstr ""
"দরকারি।\n"
"তবà§à¦“ তাদের অপসারণ করবেন? (অফেরৎযোগà§à¦¯)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
#, fuzzy
msgid "Cannot remove:"
msgstr "অপসারণ সমà§à¦­à¦¬ নয় :\n"
@@ -1089,7 +1088,7 @@ msgstr "%d -টি বসà§à¦¤à§(সমূহ) সà§à¦¥à¦¾à¦¯à¦¼à§€à¦­à¦¾à¦¬à
msgid "Show Dependencies"
msgstr "নিরà§à¦­à¦°à¦¤à¦¾-সমূহ"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "মালিকবিহীন রিসোরà§à¦¸à§‡à¦° অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à¦•ারী"
@@ -1179,14 +1178,16 @@ msgid "License"
msgstr "লাইসেনà§à¦¸"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "থারà§à¦¡ পারà§à¦Ÿà¦¿ লাইসেনà§à¦¸"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot ইঞà§à¦œà¦¿à¦¨ বিভিনà§à¦¨ থারà§à¦¡ পারà§à¦Ÿà¦¿ ফà§à¦°à¦¿ à¦à¦¬à¦‚ ওপেন সোরà§à¦¸ লাইবà§à¦°à§‡à¦°à¦¿ বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦° করে থাকে। "
@@ -1206,7 +1207,8 @@ msgid "Licenses"
msgstr "লাইসেনà§à¦¸"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "জিপ ফরমà§à¦¯à¦¾à¦Ÿ খà§à¦à¦œà§‡ পেতে বà§à¦¯à¦¾à¦°à§à¦¥, পà§à¦¯à¦¾à¦•েজ ফাইল ওপেন করা যায়নি।"
#: editor/editor_asset_installer.cpp
@@ -1730,12 +1732,11 @@ msgid "New"
msgstr "নতà§à¦¨"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "ইমà§à¦ªà§‹à¦°à§à¦Ÿ"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ"
@@ -2183,6 +2184,11 @@ msgstr "পরিসà§à¦•ার করà§à¦¨/কà§à¦²à§€à§Ÿà¦¾à¦°"
msgid "Clear Output"
msgstr "আউটপà§à¦Ÿ/ফলাফল"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "উইনà§à¦¡à§‹"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2512,6 +2518,15 @@ msgid "Pick a Main Scene"
msgstr "à¦à¦•টি মà§à¦–à§à¦¯ দৃশà§à¦¯ মনোনীত করà§à¦¨"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "দৃশà§à¦¯ বনà§à¦§ করà§à¦¨"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "দৃশà§à¦¯ বনà§à¦§ করà§à¦¨"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr "অà§à¦¯à¦¾à¦¡-অন পà§à¦²à¦¾à¦—ইন à¦à¦¨à¦¾à¦¬à¦² করা সমà§à¦­à¦¬ হয় নি। কনফিগার পারà§à¦¸à¦¿à¦‚ ('%s') বà§à¦¯à¦°à§à¦¥ হয়েছে।"
@@ -2629,6 +2644,11 @@ msgstr "দৃশà§à¦¯ চালান"
msgid "Close Tab"
msgstr "অনà§à¦¯ টà§à¦¯à¦¾à¦¬à¦—à§à¦²à¦¿ বনà§à¦§ করà§à¦¨"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "অনà§à¦¯ টà§à¦¯à¦¾à¦¬à¦—à§à¦²à¦¿ বনà§à¦§ করà§à¦¨"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "অনà§à¦¯ টà§à¦¯à¦¾à¦¬à¦—à§à¦²à¦¿ বনà§à¦§ করà§à¦¨"
@@ -2721,6 +2741,10 @@ msgstr "নতà§à¦¨ উতà§à¦¤à¦°à¦¾à¦§à¦¿à¦•ারী দৃশà§à¦¯..."
msgid "Open Scene..."
msgstr "দৃশà§à¦¯ খà§à¦²à§à¦¨..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "সামà§à¦ªà§à¦°à¦¤à¦¿à¦•সমূহ খà§à¦²à§à¦¨"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "দৃশà§à¦¯ সংরকà§à¦·à¦£ করà§à¦¨"
@@ -2731,14 +2755,6 @@ msgid "Save All Scenes"
msgstr "সকল দৃশà§à¦¯ সংরকà§à¦·à¦£ করà§à¦¨"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "দৃশà§à¦¯ বনà§à¦§ করà§à¦¨"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "সামà§à¦ªà§à¦°à¦¤à¦¿à¦•সমূহ খà§à¦²à§à¦¨"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "à¦à¦¤à§‡ রূপানà§à¦¤à¦° করà§à¦¨..."
@@ -2768,27 +2784,37 @@ msgstr "দৃশà§à¦¯ পà§à¦°à¦¤à§à¦¯à¦¾à¦¬à§ƒà¦¤à§à¦¤ করà§à¦¨"
msgid "Miscellaneous project or scene-wide tools."
msgstr "পà§à¦°à¦•লà§à¦ª অথবা দৃশà§à¦¯à§‡-বà§à¦¯à¦¾à¦ªà§€ বিবিধ সরঞà§à¦œà¦¾à¦®-সমূহ।"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
#, fuzzy
msgid "Project"
msgstr "নতà§à¦¨ পà§à¦°à¦•লà§à¦ª"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° সেটিংস"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "সরঞà§à¦œà¦¾à¦®-সমূহ"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ..."
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "পà§à¦°à¦•লà§à¦ª মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦°"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "সরঞà§à¦œà¦¾à¦®-সমূহ"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "মালিকবিহীন রিসোরà§à¦¸à§‡à¦° অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à¦•ারী"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2887,13 +2913,14 @@ msgstr ""
"রিমোট ডিভাইসে বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° সময়, নেটওয়ারà§à¦• ফাইল-সিসà§à¦Ÿà§‡à¦® (filesystem) à¦à¦Ÿà¦¿à¦•ে আরো "
"কারà§à¦¯à¦•র করবে।"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
#, fuzzy
msgid "Editor"
msgstr "সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨ (Edit)"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡à¦° সেটিংস"
#: editor/editor_node.cpp
@@ -2935,15 +2962,15 @@ msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡à¦° সেটিংস"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ টেমপà§à¦²à§‡à¦Ÿà¦¸à¦®à§‚হ লোড হচà§à¦›à§‡"
-#: editor/editor_node.cpp editor/project_export.cpp
+#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Export Templates"
+msgid "Manage Export Templates..."
msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ টেমপà§à¦²à§‡à¦Ÿà¦¸à¦®à§‚হ লোড হচà§à¦›à§‡"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "হেলà§à¦ª"
@@ -2951,12 +2978,13 @@ msgstr "হেলà§à¦ª"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
msgid "Online Docs"
msgstr "ডকà§à¦®à§‡à¦¨à§à¦Ÿà¦¸à¦®à§‚হ বনà§à¦§ করà§à¦¨"
@@ -3431,7 +3459,7 @@ msgstr "নোড হতে ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨:"
#: editor/export_template_manager.cpp
#, fuzzy
-msgid "Re-Download"
+msgid "Redownload"
msgstr "রিলোড"
#: editor/export_template_manager.cpp
@@ -3451,6 +3479,10 @@ msgid "Download"
msgstr "নীচে"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(খà§à¦à¦œà§‡ পাওয়া যায়নি)"
@@ -3519,13 +3551,11 @@ msgid "No response."
msgstr "কোন পà§à¦°à¦¤à¦¿à¦•à§à¦°à¦¿à§Ÿà¦¾ নেই।"
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Request Failed."
msgstr "রিকà§à§Ÿà§‡à¦¸à§à¦Ÿ বà§à¦¯à¦°à§à¦¥ হয়েছে।"
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "লà§à¦ª পà§à¦¨à¦ƒà¦¨à¦¿à¦°à§à¦¦à§‡à¦¶ করà§à¦¨à¥¤"
@@ -3540,14 +3570,19 @@ msgid "Download Complete."
msgstr "নীচে"
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "থিমটি ফাইলে সংরকà§à¦·à¦£ করা সমà§à¦­à¦¬ হয়নি:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
#, fuzzy
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr "à¦à¦Ÿà¦²à¦¾à¦¸/মানচিতà§à¦°à¦¾à¦¬à¦²à§€ সংরকà§à¦·à¦£à§‡ সমসà§à¦¯à¦¾ হয়েছে:"
#: editor/export_template_manager.cpp
@@ -3651,22 +3686,12 @@ msgstr "বসà§à¦¤à§ অপসারণ করà§à¦¨"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "লিসà§à¦Ÿ থেকে মিরর নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨: "
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"লেখার জনà§à¦¯ file_type_cache.cch খোলা সমà§à¦­à¦¬ হচà§à¦›à§‡ না, ফাইলের ধরণ কà§à¦¯à¦¾à¦¶ (cache) "
-"সংরকà§à¦·à¦¿à¦¤ হচà§à¦›à§‡ না!"
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "ফেবরিট/পà§à¦°à¦¿à¦¯à¦¼-সমূহ:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "'%s' তে নেভিগেট করা যাবে না কারণ à¦à¦Ÿà¦¿ ফাইল সিসà§à¦Ÿà§‡à¦®à§‡ পাওয়া যায়নি!"
-
-#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3711,13 +3736,13 @@ msgstr "বà§à¦¯à¦¬à¦¹à§ƒà¦¤ নামে অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ অ
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Name contains invalid characters."
-msgstr "গà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ অকà§à¦·à¦°à¦¸à¦®à§‚হ:"
+msgid "A file or folder with this name already exists."
+msgstr "গà§à¦°à§à¦ªà§‡à¦° নাম ইতিমধà§à¦¯à§‡à¦‡ আছে!"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "A file or folder with this name already exists."
-msgstr "গà§à¦°à§à¦ªà§‡à¦° নাম ইতিমধà§à¦¯à§‡à¦‡ আছে!"
+msgid "Name contains invalid characters."
+msgstr "গà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ অকà§à¦·à¦°à¦¸à¦®à§‚হ:"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3785,6 +3810,11 @@ msgstr "ডà§à¦ªà§à¦²à¦¿à¦•েট"
msgid "Move To..."
msgstr "à¦à¦–ানে সরান..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "নতà§à¦¨ দৃশà§à¦¯"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3859,6 +3889,11 @@ msgstr "গà§à¦°à§à¦ªà§‡à¦° নাম ইতিমধà§à¦¯à§‡à¦‡ আছে!"
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "দৃশà§à¦¯ হতে তৈরি করবেন"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ তৈরি করà§à¦¨"
@@ -3928,6 +3963,14 @@ msgid "Search complete"
msgstr "টেকà§à¦¸à¦Ÿ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "গà§à¦°à§à¦ª/দলে যোগ করà§à¦¨"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "গà§à¦°à§à¦ª/দল হতে অপসারণ করà§à¦¨"
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "ভà§à¦²: অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° নাম ইতিমধà§à¦¯à§‡à¦‡ বিদà§à¦¯à¦®à¦¾à¦¨!"
@@ -3937,13 +3980,23 @@ msgstr "ভà§à¦²: অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° নাম ইতিমà¦
msgid "Invalid group name."
msgstr "অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ নাম।"
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "ছবির গà§à¦°à§à¦ªà¦¸à¦®à§‚হ"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "ছবির গà§à¦°à§à¦ª অপসারণ করà§à¦¨"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "দলসমূহ"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr "গà§à¦°à§à¦ª/দলে যোগ করà§à¦¨"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3958,12 +4011,13 @@ msgid "Nodes in Group"
msgstr "গà§à¦°à§à¦ªà¦¸à¦®à§‚হ সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "গà§à¦°à§à¦ª/দলে যোগ করà§à¦¨"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "গà§à¦°à§à¦ª/দল হতে অপসারণ করà§à¦¨"
+#, fuzzy
+msgid "Group Editor"
+msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡ খà§à¦²à§à¦¨"
#: editor/groups_editor.cpp
#, fuzzy
@@ -4183,7 +4237,8 @@ msgid "MultiNode Set"
msgstr "মালà§à¦Ÿà¦¿-নোড সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "সিগনà§à¦¯à¦¾à¦²-সমূহ à¦à¦¬à¦‚ দলসমূহ সমà§à¦ªà¦¾à¦¦à¦¨ করতে à¦à¦•টি নোড নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨à¥¤"
#: editor/plugin_config_dialog.cpp
@@ -4999,10 +5054,6 @@ msgid "View Files"
msgstr "ফাইল"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "হোসà§à¦Ÿà¦¨à¦¾à¦® রিসলভ করা যায়নি:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "সংযোগ তà§à¦°à§à¦Ÿà¦¿, আবার চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤"
@@ -5016,15 +5067,48 @@ msgid "No response from host:"
msgstr "হোসà§à¦Ÿ থেকে কোন পà§à¦°à¦¤à¦¿à¦•à§à¦°à¦¿à¦¯à¦¼à¦¾ নেই:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "হোসà§à¦Ÿà¦¨à¦¾à¦® রিসলভ করা যায়নি:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Request failed, return code:"
msgstr "আবেদনকৃত ফাইল ফরমà§à¦¯à¦¾à¦Ÿ/ধরণ অজানা:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "রিকà§à§Ÿà§‡à¦¸à§à¦Ÿ বà§à¦¯à¦°à§à¦¥ হয়েছে।"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "থিমটি ফাইলে সংরকà§à¦·à¦£ করা সমà§à¦­à¦¬ হয়নি:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "অনà§à¦°à§‹à¦§ বà§à¦¯à¦°à§à¦¥ হয়েছে, অধিক সংখà§à¦¯à¦• রিডাইরেকà§à¦Ÿ à¦à¦° কারণে"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "লà§à¦ª পà§à¦¨à¦ƒà¦¨à¦¿à¦°à§à¦¦à§‡à¦¶ করà§à¦¨à¥¤"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "আবেদনকৃত ফাইল ফরমà§à¦¯à¦¾à¦Ÿ/ধরণ অজানা:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "সময়:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "ডাউনলোড হà§à¦¯à¦¾à¦¶ তà§à¦°à§à¦Ÿà¦¿à¦¯à§à¦•à§à¦¤, কাংখিত ফাইলটি কà§à¦·à¦¤à¦¿à¦—à§à¦°à¦¸à§à¦¤ হয়েছে।"
@@ -5109,8 +5193,13 @@ msgid "All"
msgstr "সকল"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "পà§à¦¨-ইমà§à¦ªà§‹à¦°à§à¦Ÿ..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "পà§à¦²à¦¾à¦—ইন-সমূহ"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -5132,7 +5221,8 @@ msgid "Site:"
msgstr "ওয়েবসাইট:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "সমরà§à¦¥à¦¨..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -5144,6 +5234,11 @@ msgid "Testing"
msgstr "পরীকà§à¦·à¦¾à¦®à§‚লক উৎস"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "লোড"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "পà§à¦°à¦¯à¦¼à§‡à¦¾à¦œà¦¨à§€à¦¯à¦¼ উপকরণসমূহের ZIP ফাইল"
@@ -5319,6 +5414,11 @@ msgstr "ভঙà§à¦—ি পà§à¦°à¦¤à¦¿à¦²à§‡à¦ªà¦¨ করà§à¦¨"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "ভঙà§à¦—ি পরিষà§à¦•ার করà§à¦¨"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Mesh হতে Emitter তৈরি করà§à¦¨"
@@ -5349,6 +5449,7 @@ msgid "Zoom Reset"
msgstr "জà§à¦®à§ পà§à¦¨:সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "মোড (Mode) বাছাই করà§à¦¨"
@@ -5369,14 +5470,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "অলà§à¦Ÿà¦¾à¦° কী + মাউসের ডান বোতাম: গভীর তালিকায় নিরà§à¦¬à¦¾à¦šà¦¨"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "মোড (Mode) সরান"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "ঘূরà§à¦£à¦¾à§Ÿà¦¨ মোড"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "মাপের মোড করà§à¦¨ (R)"
@@ -5404,6 +5508,7 @@ msgid "Toggle snapping."
msgstr "ছেদবিনà§à¦¦à§ অদলবদল করà§à¦¨ (টগল বà§à¦°à§‡à¦•পয়েনà§à¦Ÿ)"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨"
@@ -5422,12 +5527,6 @@ msgid "Use Rotation Snap"
msgstr "ঘূরà§à¦£à¦¨ সà§à¦¨à§à¦¯à¦¾à¦ª বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Configure Snap..."
-msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª কনফিগার করà§à¦¨..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "আপেকà§à¦·à¦¿à¦• সà§à¦¨à§à¦¯à¦¾à¦ª"
@@ -5441,6 +5540,12 @@ msgid "Smart Snapping"
msgstr "সà§à¦®à¦¾à¦°à§à¦Ÿ সà§à¦¨à§à¦¯à¦¾à¦ªà¦¿à¦‚ বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦° করà§à¦¨"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Configure Snap..."
+msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª কনফিগার করà§à¦¨..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
msgstr "ধারক/বাহক পরà§à¦¯à¦¨à§à¦¤ বিসà§à¦¤à§ƒà¦¤ করà§à¦¨"
@@ -5669,16 +5774,6 @@ msgstr "হà§à¦¯à¦¾à¦¨à§à¦¡à§‡à¦² সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "ছবি লোডে সমসà§à¦¯à¦¾ হয়েছে:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "সà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦¸à¦¹ কোনো পিকà§à¦¸à§‡à¦² নেই > ছবিতে ১২৮..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Emission Mask লোড করà§à¦¨"
@@ -6013,14 +6108,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "পৃষà§à¦ à¦¤à¦²à§‡à¦° উৎস অকারà§à¦¯à¦•র (কোনো ফোকাস নেই)।"
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "পপà§à¦²à§‡à¦Ÿ করার জনà§à¦¯ ধারকের কোনো নিরেট পৃষà§à¦  নেই।"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "à¦à¦²à¦¾à¦•ার নকশা করা সমà§à¦­à¦¬ হয়নি।"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Mesh-à¦à¦° à¦à¦•টি উৎস নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨:"
@@ -6107,20 +6194,27 @@ msgid "Generation Time (sec):"
msgstr "গড় সময় (সেঃ)"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "পৃষà§à¦ à¦¸à¦®à§‚হ কোনো আকার নেই!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "কোনো পৃষà§à¦  নেই!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "নোডে কোনো জà§à¦¯à¦¾à¦®à¦¿à¦¤à¦¿à¦• আকার নেই (পৃষà§à¦ )।"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "নোডে কোনো জà§à¦¯à¦¾à¦®à¦¿à¦¤à¦¿à¦• আকার নেই।"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "নোডে কোনো জà§à¦¯à¦¾à¦®à¦¿à¦¤à¦¿à¦• আকার নেই (পৃষà§à¦ )।"
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "নোডে কোনো জà§à¦¯à¦¾à¦®à¦¿à¦¤à¦¿à¦• আকার নেই।"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6474,7 +6568,6 @@ msgid "Grid Settings"
msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª সেটিংস"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª"
@@ -6594,13 +6687,8 @@ msgstr "ছবি লোডে সমসà§à¦¯à¦¾ হয়েছে:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "ছবি লোড অসমà§à¦­à¦¬ হয়েছে"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
-msgstr "ছবি লোড অসমà§à¦­à¦¬ হয়েছে"
+msgid "Could not load file at:"
+msgstr "টাইলটি খà§à¦à¦œà§‡ পাওয়া যায়নি:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6629,7 +6717,7 @@ msgstr "ইমà§à¦ªà§‹à¦°à§à¦Ÿà§‡ সমসà§à¦¯à¦¾ হয়েছে"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "ফোলà§à¦¡à¦¾à¦° তৈরি করà§à¦¨"
#: editor/plugins/script_editor_plugin.cpp
@@ -6717,6 +6805,11 @@ msgid "Open..."
msgstr "খà§à¦²à§à¦¨"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "পরবরà§à¦¤à§€ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "সকলà§à¦—à§à¦²à¦¿ সংরকà§à¦·à¦£ করà§à¦¨"
@@ -6757,13 +6850,13 @@ msgid "Save Theme"
msgstr "থিম সংরকà§à¦·à¦£ করà§à¦¨"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "ডকà§à¦®à§‡à¦¨à§à¦Ÿà¦¸à¦®à§‚হ বনà§à¦§ করà§à¦¨"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "সবগà§à¦²à¦¿ বনà§à¦§ করà§à¦¨"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "ডকà§à¦®à§‡à¦¨à§à¦Ÿà¦¸à¦®à§‚হ বনà§à¦§ করà§à¦¨"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "চালান"
@@ -6856,6 +6949,11 @@ msgstr "ডিবাগার"
msgid "Search Results"
msgstr "সাহাযà§à¦¯ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "বোনà§â€Œ/হাড় পরিষà§à¦•ার করà§à¦¨"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6930,6 +7028,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6967,26 +7066,6 @@ msgstr "কমেনà§à¦Ÿ টগল করà§à¦¨"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "পূরà§à¦£-পরà§à¦¦à¦¾ অদলবদল/টগল করà§à¦¨"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "পরের বিরতিবিনà§à¦¦à§à¦¤à§‡ যান"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "পূরà§à¦¬à§‡à¦° বিরতিবিনà§à¦¦à§à¦¤à§‡ যান"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° আইটেম অপসারণ করà§à¦¨"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Fold/Unfold Line"
msgstr "লাইন আনফোলà§à¦¡ করà§à¦¨"
@@ -7007,6 +7086,11 @@ msgid "Complete Symbol"
msgstr "সিমà§à¦¬à¦² সমà§à¦ªà§‚রà§à¦£ করà§à¦¨"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সমূহের আকার পরিবরà§à¦¤à¦¨ করà§à¦¨"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "শেষের হোয়াইটসà§à¦ªà§‡à¦¸ ছেà¦à¦Ÿà§‡ ফেলà§à¦¨"
@@ -7025,32 +7109,37 @@ msgid "Auto Indent"
msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿà¦­à¦¾à¦¬à§‡ মাতà§à¦°à¦¾ দিন"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "ছেদবিনà§à¦¦à§ অদলবদল করà§à¦¨ (টগল বà§à¦°à§‡à¦•পয়েনà§à¦Ÿ)"
+msgid "Find Previous"
+msgstr "পূরà§à¦¬à§‡ খà§à¦à¦œà§à¦¨"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "সকল বিরতি-বিনà§à¦¦à§-সমূহ অপসারণ করà§à¦¨"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "দà§à¦°à§à¦¤ ফাইলসমূহ ফিলà§à¦Ÿà¦¾à¦° করà§à¦¨..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "পà§à¦°à¦¾à¦¸à¦™à§à¦—িক সাহাযà§à¦¯"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "পরের বিরতিবিনà§à¦¦à§à¦¤à§‡ যান"
+msgid "Toggle Bookmark"
+msgstr "পূরà§à¦£-পরà§à¦¦à¦¾ অদলবদল/টগল করà§à¦¨"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "পূরà§à¦¬à§‡à¦° বিরতিবিনà§à¦¦à§à¦¤à§‡ যান"
+msgid "Go to Next Bookmark"
+msgstr "পরের বিরতিবিনà§à¦¦à§à¦¤à§‡ যান"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "পূরà§à¦¬à§‡ খà§à¦à¦œà§à¦¨"
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "পূরà§à¦¬à§‡à¦° বিরতিবিনà§à¦¦à§à¦¤à§‡ যান"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "দà§à¦°à§à¦¤ ফাইলসমূহ ফিলà§à¦Ÿà¦¾à¦° করà§à¦¨..."
+msgid "Remove All Bookmarks"
+msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° আইটেম অপসারণ করà§à¦¨"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -7063,8 +7152,23 @@ msgid "Go to Line..."
msgstr "লাইনে যান..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "পà§à¦°à¦¾à¦¸à¦™à§à¦—িক সাহাযà§à¦¯"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "ছেদবিনà§à¦¦à§ অদলবদল করà§à¦¨ (টগল বà§à¦°à§‡à¦•পয়েনà§à¦Ÿ)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "সকল বিরতি-বিনà§à¦¦à§-সমূহ অপসারণ করà§à¦¨"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "পরের বিরতিবিনà§à¦¦à§à¦¤à§‡ যান"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "পূরà§à¦¬à§‡à¦° বিরতিবিনà§à¦¦à§à¦¤à§‡ যান"
#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
@@ -7325,8 +7429,8 @@ msgstr "অডিও শà§à¦°à§‹à¦¤à¦¾"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Doppler Enable"
-msgstr "সকà§à¦°à¦¿à¦¯à¦¼ করà§à¦¨"
+msgid "Enable Doppler"
+msgstr "সমà§à¦ªà¦¾à¦¦à¦¨à¦¯à§‹à¦—à§à¦¯ অংশীদারীসমূহ"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7385,9 +7489,8 @@ msgid "Snap Nodes To Floor"
msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª মোড:"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Select Mode (Q)"
-msgstr "মোড (Mode) বাছাই করà§à¦¨"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7398,32 +7501,11 @@ msgid ""
msgstr "অলà§à¦Ÿà¦¾à¦° কী + মাউসের ডান বোতাম: গভীর তালিকায় নিরà§à¦¬à¦¾à¦šà¦¨"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "সরানোর মোড (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "ঘোরানোর মোড (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "মাপের মোড করà§à¦¨ (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "সà§à¦¥à¦¾à¦¨à§€à§Ÿ সà§à¦¥à¦¾à¦¨à¦¾à¦™à§à¦•সমূহ"
-
-#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Local Space Mode (%s)"
+msgid "Use Local Space"
msgstr "মাপের মোড করà§à¦¨ (R)"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap Mode (%s)"
-msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª মোড:"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "নিমà§à¦¨ দরà§à¦¶à¦¨"
@@ -7466,26 +7548,6 @@ msgstr "নিরà§à¦¬à¦¾à¦šà¦¨à§‡ ফোকাস করà§à¦¨"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Tool Select"
-msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Tool Move"
-msgstr "সরান"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Tool Rotate"
-msgstr "কনà§à¦Ÿà§à¦°à§‹à¦² বোতাম: ঘূরà§à¦£à¦¨"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Tool Scale"
-msgstr "সà§à¦•েল/মাপ:"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Freelook"
msgstr "পূরà§à¦£-পরà§à¦¦à¦¾ অদলবদল/টগল করà§à¦¨"
@@ -7542,7 +7604,8 @@ msgstr "গà§à¦°à¦¿à¦¡ দেখà§à¦¨"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "সেটিংস"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7865,10 +7928,6 @@ msgid "TextureRegion"
msgstr "গঠনবিনà§à¦¯à¦¾à¦¸à§‡à¦° à¦à¦²à¦¾à¦•া"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "থিমটি ফাইলে সংরকà§à¦·à¦£ করা সমà§à¦­à¦¬ হয়নি:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "সকল বসà§à¦¤à§ যোগ করà§à¦¨"
@@ -7963,12 +8022,12 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "বসà§à¦¤à§/আইটেম"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "বসà§à¦¤à§/আইটেম"
#: editor/plugins/theme_editor_plugin.cpp
@@ -8098,8 +8157,8 @@ msgstr "TileMap আà¦à¦•à§à¦¨"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8422,6 +8481,10 @@ msgid "TileSet"
msgstr "TileSet (টাইল-সেট)..."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "ইনপà§à¦Ÿ যোগ করà§à¦¨"
@@ -8514,6 +8577,11 @@ msgid "Duplicate Nodes"
msgstr "নোড(সমূহ) পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ করà§à¦¨"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "নোড-সমূহ পà§à¦°à¦¤à¦¿à¦²à§‡à¦ªà¦¨/পেসà§à¦Ÿ করà§à¦¨"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "নোড(সমূহ) অপসারণ করà§à¦¨"
@@ -8523,10 +8591,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Vertex"
msgstr "ভারটেকà§à¦¸"
@@ -8542,6 +8606,11 @@ msgstr "ডান"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "নোড তৈরি করà§à¦¨"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "নোড তৈরি করà§à¦¨"
@@ -8909,7 +8978,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8918,7 +8987,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -9087,6 +9156,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -9112,7 +9185,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -9121,7 +9194,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -9130,14 +9203,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -9184,6 +9257,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9421,6 +9501,11 @@ msgstr "à¦à¦‡ পà§à¦²à§à¦¯à¦¾à¦Ÿà¦«à¦°à§à¦®à§‡à¦° জনà§à¦¯ দরকা
#: editor/project_export.cpp
#, fuzzy
+msgid "Manage Export Templates"
+msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ টেমপà§à¦²à§‡à¦Ÿà¦¸à¦®à§‚হ লোড হচà§à¦›à§‡"
+
+#: editor/project_export.cpp
+#, fuzzy
msgid "Export With Debug"
msgstr "Tile Set à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨"
@@ -9582,6 +9667,15 @@ msgstr "নামহীন পà§à¦°à¦•লà§à¦ª"
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "বিদà§à¦¯à¦®à¦¾à¦¨ পà§à¦°à¦•লà§à¦ª ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "সংযোগ..."
@@ -9661,8 +9755,8 @@ msgstr "তালিকা হতে পà§à¦°à¦•লà§à¦ª অপসারণ à¦
#: editor/project_manager.cpp
#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr "তালিকা হতে পà§à¦°à¦•লà§à¦ª অপসারণ করবেন? (ফোলà§à¦¡à¦¾à¦°à§‡à¦° বিষয়াদি পরিবরà§à¦¤à¦¨ হবে না)"
#: editor/project_manager.cpp
@@ -9688,8 +9782,9 @@ msgid "Project Manager"
msgstr "পà§à¦°à¦œà§‡à¦•à§à¦Ÿ মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦°"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° তালিকা"
+#, fuzzy
+msgid "Projects"
+msgstr "নতà§à¦¨ পà§à¦°à¦•লà§à¦ª"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9714,10 +9809,6 @@ msgid "Templates"
msgstr "বসà§à¦¤à§ অপসারণ করà§à¦¨"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "পà§à¦°à¦¸à§à¦¥à¦¾à¦¨ করà§à¦¨"
-
-#: editor/project_manager.cpp
#, fuzzy
msgid "Restart Now"
msgstr "পà§à¦¨à¦°à¦¾à¦°à¦®à§à¦­ (সেঃ):"
@@ -10074,6 +10165,10 @@ msgstr "ঘটনাসà§à¦¥à¦²"
msgid "AutoLoad"
msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿ-লোড"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "পà§à¦²à¦¾à¦—ইন-সমূহ"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "শূনà§à¦¯"
@@ -10129,14 +10224,6 @@ msgstr "মেথড/পদà§à¦§à¦¤à¦¿ বাছাই করà§à¦¨"
msgid "Select Method"
msgstr "মেথড/পদà§à¦§à¦¤à¦¿ বাছাই করà§à¦¨"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "PVRTC সরঞà§à¦œà¦¾à¦® à¦à¦•à§à¦¸à¦¿à¦•িউট করা সমà§à¦­à¦¬ হচà§à¦›à§‡ না:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr "PVRTC সরঞà§à¦œà¦¾à¦® দà§à¦¬à¦¾à¦°à¦¾ রূপানà§à¦¤à¦°à¦¿à¦¤ ছবি পà§à¦¨à¦°à¦¾à§Ÿ লোড করা সমà§à¦­à¦¬ নয়:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10443,6 +10530,11 @@ msgid "Remove Node(s)"
msgstr "নোড(সমূহ) অপসারণ করà§à¦¨"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "ইনপà§à¦Ÿ নাম পরিবরà§à¦¤à¦¨ করà§à¦¨"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10579,23 +10671,25 @@ msgstr "নোড কনফিগারেশন সতরà§à¦•বারà§à¦¤à
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"à¦à¦‡ নোডের কানেকশন à¦à¦¬à¦‚ গà§à¦°à§à¦ª বিদà§à¦¯à¦®à¦¾à¦¨\n"
"সিগনà§à¦¯à¦¾à¦² ডক দেখানোর জনà§à¦¯ কà§à¦²à¦¿à¦• করà§à¦¨à¥¤"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"à¦à¦‡ নোডের কানেকশন বিদà§à¦¯à¦®à¦¾à¦¨\n"
"সিগনà§à¦¯à¦¾à¦² ডক দেখানোর জনà§à¦¯ কà§à¦²à¦¿à¦• করà§à¦¨à¥¤"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"à¦à¦‡ নোডটি à¦à¦•টি গà§à¦°à§à¦ªà§‡à¦° অনà§à¦¤à¦°à§à¦­à§à¦•à§à¦¤à¥¤\n"
@@ -10705,6 +10799,11 @@ msgid "Error loading script from %s"
msgstr "%s হতে সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ তà§à¦²à¦¤à§‡/লোডে সমসà§à¦¯à¦¾ হয়েছে"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "ওভাররাইড..."
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "না/আ"
@@ -10913,6 +11012,10 @@ msgid "Change Shortcut"
msgstr "অà§à¦¯à¦¾à¦‚করসমূহ পরিবরà§à¦¤à¦¨ করà§à¦¨"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡à¦° সেটিংস"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "শরà§à¦Ÿà¦•াটসমূহ"
@@ -11374,10 +11477,32 @@ msgid "Set Variable Type"
msgstr "চলক/ভেরিয়েবল সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr ""
+"অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ নাম। নামটি অবশà§à¦¯à¦‡ বিদà§à¦¯à¦®à¦¾à¦¨ পূরà§à¦¬à¦¨à¦¿à¦°à§à¦®à¦¿à¦¤ ধরণের নামের সাথে পরমà§à¦ªà¦°à¦¬à¦¿à¦°à§‡à¦¾à¦§à§€ "
+"হতে পারবে না।"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "নতà§à¦¨ তৈরি করà§à¦¨"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "ভেরিয়েবলস/চলকসমূহ:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "নতà§à¦¨ তৈরি করà§à¦¨"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "আরমà§à¦­ হতে নতà§à¦¨ polygon তৈরি করà§à¦¨à¥¤"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "নামটি কারà§à¦¯à¦•র সনাকà§à¦¤à¦•ারী নয়:"
@@ -11586,10 +11711,6 @@ msgid "Cut Nodes"
msgstr "নোড-সমূহ করà§à¦¤à¦¨/কাট করà§à¦¨"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "নোড-সমূহ পà§à¦°à¦¤à¦¿à¦²à§‡à¦ªà¦¨/পেসà§à¦Ÿ করà§à¦¨"
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "সদসà§à¦¯à¦—ণ (Members):"
@@ -12401,22 +12522,6 @@ msgstr ""
"আকার ধারণ করতে পারে। অনà§à¦¯à¦¥à¦¾à§Ÿ, à¦à¦Ÿà¦¿à¦•ে à¦à¦•টি RenderTarget করà§à¦¨ à¦à¦¬à¦‚ à¦à¦° অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ "
"দৃশà§à¦¯à¦¾à¦¬à¦²à¦¿à¦•ে (texture) দৃশà§à¦¯à¦®à¦¾à¦¨ করতে কোনো নোডে হসà§à¦¤à¦¾à¦¨à§à¦¤à¦° করà§à¦¨à¥¤"
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "FreeType আরমà§à¦­à§‡ সমসà§à¦¯à¦¾ হয়েছে।"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "অজানা ধরনের ফনà§à¦Ÿà¥¤"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "ফনà§à¦Ÿ তà§à¦²à¦¤à§‡/লোডে সমসà§à¦¯à¦¾ হয়েছে।"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "ফনà§à¦Ÿà§‡à¦° আকার অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯à¥¤"
-
#: scene/resources/visual_shader.cpp
#, fuzzy
msgid "Input"
@@ -12453,6 +12558,111 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "লেখার জনà§à¦¯ file_type_cache.cch খোলা সমà§à¦­à¦¬ হচà§à¦›à§‡ না, ফাইলের ধরণ কà§à¦¯à¦¾à¦¶ (cache) "
+#~ "সংরকà§à¦·à¦¿à¦¤ হচà§à¦›à§‡ না!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "'%s' তে নেভিগেট করা যাবে না কারণ à¦à¦Ÿà¦¿ ফাইল সিসà§à¦Ÿà§‡à¦®à§‡ পাওয়া যায়নি!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "ছবি লোডে সমসà§à¦¯à¦¾ হয়েছে:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "সà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦¸à¦¹ কোনো পিকà§à¦¸à§‡à¦² নেই > ছবিতে ১২৮..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "পপà§à¦²à§‡à¦Ÿ করার জনà§à¦¯ ধারকের কোনো নিরেট পৃষà§à¦  নেই।"
+
+#~ msgid "Couldn't map area."
+#~ msgstr "à¦à¦²à¦¾à¦•ার নকশা করা সমà§à¦­à¦¬ হয়নি।"
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "পৃষà§à¦ à¦¸à¦®à§‚হ কোনো আকার নেই!"
+
+#~ msgid "No faces!"
+#~ msgstr "কোনো পৃষà§à¦  নেই!"
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "ছবি লোড অসমà§à¦­à¦¬ হয়েছে"
+
+#, fuzzy
+#~ msgid "Error could not load file."
+#~ msgstr "ছবি লোড অসমà§à¦­à¦¬ হয়েছে"
+
+#, fuzzy
+#~ msgid "Doppler Enable"
+#~ msgstr "সকà§à¦°à¦¿à¦¯à¦¼ করà§à¦¨"
+
+#, fuzzy
+#~ msgid "Select Mode (Q)"
+#~ msgstr "মোড (Mode) বাছাই করà§à¦¨"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "সরানোর মোড (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "ঘোরানোর মোড (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "মাপের মোড করà§à¦¨ (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "সà§à¦¥à¦¾à¦¨à§€à§Ÿ সà§à¦¥à¦¾à¦¨à¦¾à¦™à§à¦•সমূহ"
+
+#, fuzzy
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª মোড:"
+
+#, fuzzy
+#~ msgid "Tool Select"
+#~ msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨"
+
+#, fuzzy
+#~ msgid "Tool Move"
+#~ msgstr "সরান"
+
+#, fuzzy
+#~ msgid "Tool Rotate"
+#~ msgstr "কনà§à¦Ÿà§à¦°à§‹à¦² বোতাম: ঘূরà§à¦£à¦¨"
+
+#, fuzzy
+#~ msgid "Tool Scale"
+#~ msgstr "সà§à¦•েল/মাপ:"
+
+#, fuzzy
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr "তালিকা হতে পà§à¦°à¦•লà§à¦ª অপসারণ করবেন? (ফোলà§à¦¡à¦¾à¦°à§‡à¦° বিষয়াদি পরিবরà§à¦¤à¦¨ হবে না)"
+
+#~ msgid "Project List"
+#~ msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° তালিকা"
+
+#~ msgid "Exit"
+#~ msgstr "পà§à¦°à¦¸à§à¦¥à¦¾à¦¨ করà§à¦¨"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "PVRTC সরঞà§à¦œà¦¾à¦® à¦à¦•à§à¦¸à¦¿à¦•িউট করা সমà§à¦­à¦¬ হচà§à¦›à§‡ না:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr "PVRTC সরঞà§à¦œà¦¾à¦® দà§à¦¬à¦¾à¦°à¦¾ রূপানà§à¦¤à¦°à¦¿à¦¤ ছবি পà§à¦¨à¦°à¦¾à§Ÿ লোড করা সমà§à¦­à¦¬ নয়:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "FreeType আরমà§à¦­à§‡ সমসà§à¦¯à¦¾ হয়েছে।"
+
+#~ msgid "Unknown font format."
+#~ msgstr "অজানা ধরনের ফনà§à¦Ÿà¥¤"
+
+#~ msgid "Error loading font."
+#~ msgstr "ফনà§à¦Ÿ তà§à¦²à¦¤à§‡/লোডে সমসà§à¦¯à¦¾ হয়েছে।"
+
+#~ msgid "Invalid font size."
+#~ msgstr "ফনà§à¦Ÿà§‡à¦° আকার অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯à¥¤"
+
#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "পূরà§à¦¬à§‡à¦° টà§à¦¯à¦¾à¦¬"
@@ -13064,9 +13274,6 @@ msgstr ""
#~ msgid "Erase selection"
#~ msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤à¦¸à¦®à§‚হ মà§à¦›à§‡ ফেলà§à¦¨"
-#~ msgid "Could not find tile:"
-#~ msgstr "টাইলটি খà§à¦à¦œà§‡ পাওয়া যায়নি:"
-
#~ msgid "Item name or ID:"
#~ msgstr "আইটেমের নাম বা আইডি:"
@@ -13321,9 +13528,6 @@ msgstr ""
#~ msgid "Info"
#~ msgstr "তথà§à¦¯"
-#~ msgid "Re-Import..."
-#~ msgstr "পà§à¦¨-ইমà§à¦ªà§‹à¦°à§à¦Ÿ..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "ইমà§à¦ªà§‹à¦°à§à¦Ÿ করার জনà§à¦¯ কোনো বিট মাসà§à¦• নেই!"
@@ -13719,9 +13923,6 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "সà§à¦Ÿà§‡à¦°à¦¿à¦“"
-#~ msgid "Window"
-#~ msgstr "উইনà§à¦¡à§‹"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "%s%% -ঠমাপিত হচà§à¦›à§‡à¥¤"
@@ -13952,9 +14153,6 @@ msgstr ""
#~ msgid "Add Image Group"
#~ msgstr "ছবির গà§à¦°à§à¦ª যোগ করà§à¦¨"
-#~ msgid "Delete Image Group"
-#~ msgstr "ছবির গà§à¦°à§à¦ª অপসারণ করà§à¦¨"
-
#~ msgid "Project Export Settings"
#~ msgstr "পà§à¦°à¦•লà§à¦ª à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ-à¦à¦° সেটিংস"
@@ -14039,9 +14237,6 @@ msgstr ""
#~ msgid "Export Project PCK"
#~ msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° PCK à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨"
-#~ msgid "Export..."
-#~ msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ..."
-
#~ msgid "Project Export"
#~ msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ পà§à¦°à¦•লà§à¦ª"
diff --git a/editor/translations/ca.po b/editor/translations/ca.po
index 2ef6d44e3e..44afcb8066 100644
--- a/editor/translations/ca.po
+++ b/editor/translations/ca.po
@@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-19 13:41+0000\n"
+"PO-Revision-Date: 2019-08-04 14:23+0000\n"
"Last-Translator: roger <616steam@gmail.com>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/"
"godot/ca/>\n"
@@ -63,7 +63,6 @@ msgid "On call to '%s':"
msgstr "En la crida a '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Allibera"
@@ -652,16 +651,18 @@ msgid "Line Number:"
msgstr "Línia:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "S'han trobat %d coincidències."
+msgid "Replaced %d occurrence(s)."
+msgstr "%d ocurrència/es reemplaçades."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Cap Coincidència"
+#, fuzzy
+msgid "%d match."
+msgstr "S'han trobat %d coincidències."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d ocurrència/es reemplaçades."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "S'han trobat %d coincidències."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -889,8 +890,7 @@ msgstr "Favorits:"
msgid "Recent:"
msgstr "Recents:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -990,7 +990,7 @@ msgstr ""
"Els fitxers seleccionats són utilitzats per altres recursos.\n"
"Voleu Eliminar-los de totes maneres? (No es pot desfer!)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "No es pot eliminar:"
@@ -1026,7 +1026,7 @@ msgstr "Voleu Eliminar permanentment %d element(s)? (No es pot desfer!)"
msgid "Show Dependencies"
msgstr "Mostrar Dependències"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Navegador de Recursos Orfes"
@@ -1115,14 +1115,16 @@ msgid "License"
msgstr "Llicència"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Llicència externa"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"El motor Godot es recolza en una sèrie de biblioteques lliures i de codi "
@@ -1143,7 +1145,8 @@ msgid "Licenses"
msgstr "Llicències"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Error en obrir el paquet d'arxius. El fitxer no té el format zip."
#: editor/editor_asset_installer.cpp
@@ -1531,8 +1534,11 @@ msgid "Template file not found:"
msgstr "No s'ha trobat la Plantilla:"
#: editor/editor_export.cpp
+#, fuzzy
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
msgstr ""
+"En les exportacions de 32 bits, el PCK incrustat no pot ser més gran que 4 "
+"GiB."
#: editor/editor_feature_profile.cpp
msgid "3D Editor"
@@ -1644,12 +1650,11 @@ msgid "New"
msgstr "Nou"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importa"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Exportar"
@@ -1786,14 +1791,12 @@ msgid "Move Favorite Down"
msgstr "Mou Favorit Avall"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Anar al directori pare."
+msgstr "Anar al directori anterior."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Anar al directori pare."
+msgstr "Anar al directori següent."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
@@ -1802,14 +1805,13 @@ msgstr "Anar al directori pare."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
#, fuzzy
msgid "Refresh files."
-msgstr "Cerca Fitxers"
+msgstr "Actualitzar Fitxers"
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "Eliminar carpeta actual de preferits."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
msgstr "Commutar visibilitat dels fitxers ocults."
@@ -2052,6 +2054,10 @@ msgstr "Neteja"
msgid "Clear Output"
msgstr "Buida la Sortida"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "L'exportació del projecte ha fallat amb el codi d'error %d."
@@ -2224,8 +2230,9 @@ msgid ""
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
-"En ser un object remot, els canvis no es desaran.\n"
-"Referiu-vos a la documentació rellevant sobre la Depuració de codi."
+"Aquest és un objecte remot, de manera que els canvis no es conservaran.\n"
+"Si us plau, llegiu la documentació rellevant a la depuració per entendre "
+"millor aquest flux de treball."
#: editor/editor_node.cpp
msgid "There is no defined scene to run."
@@ -2373,6 +2380,15 @@ msgid "Pick a Main Scene"
msgstr "Tria una Escena Principal"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Tanca l'Escena"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Tanca l'Escena"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"No es pot habilitar el complement a: '%s' ha fallat l'anàlisi de la "
@@ -2490,6 +2506,11 @@ msgstr "Reprodueix aquesta Escena"
msgid "Close Tab"
msgstr "Tanca la Pestanya"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Tanca la Pestanya"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Tanca les altres pestanyes"
@@ -2543,9 +2564,8 @@ msgid "Go to previously opened scene."
msgstr "Vés a l'escena oberta anteriorment."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "Copia Camí"
+msgstr "Copiar text"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2575,6 +2595,10 @@ msgstr "Nova Escena heretada..."
msgid "Open Scene..."
msgstr "Obre Escena..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Obre Recent"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Desa Escena"
@@ -2584,14 +2608,6 @@ msgid "Save All Scenes"
msgstr "Desar Totes les Escenes"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Tanca l'Escena"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Obre Recent"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Converteix a..."
@@ -2621,25 +2637,37 @@ msgstr "Reverteix Escena"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Eines vàries o d'escena."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Projecte"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Configuració del Projecte"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Eines"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Exportar"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Instal·lar plantilla de compilació d'Android"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Obre el directori de Dades del Projecte"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Eines"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Instal·lar plantilla de compilació d'Android"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Navegador de Recursos Orfes"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2738,12 +2766,13 @@ msgstr ""
"En usar-se remotament en un dispositiu, un sistema de fitxers en xarxa en "
"millora el rendiment."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Editor"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Configuració de l'Editor"
#: editor/editor_node.cpp
@@ -2781,14 +2810,16 @@ msgid "Open Editor Settings Folder"
msgstr "Obre el directori de Configuració de l'Editor"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "Administrar Característiques de l'Editor"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Gestor de Plantilles d'Exportació"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Ajuda"
@@ -2796,12 +2827,13 @@ msgstr "Ajuda"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Cerca"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Documentació en línia"
@@ -2928,7 +2960,6 @@ msgid ""
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Android build template is already installed and it won't be overwritten.\n"
"Remove the \"build\" directory manually before attempting this operation "
@@ -2936,8 +2967,8 @@ msgid ""
msgstr ""
"La plantilla de compilació d'Android ja està instal·lada i no se "
"sobreescriurà.\n"
-"Elimineu el directori \"Build\" manualment abans de tornar a intentar "
-"aquesta operació."
+"Elimineu el directori 'build' manualment abans de tornar a intentar aquesta "
+"operació."
#: editor/editor_node.cpp
msgid "Import Templates From ZIP File"
@@ -3082,9 +3113,8 @@ msgid "Calls"
msgstr "Crides"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Editar Tema"
+msgstr "Editar Text:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3251,7 +3281,8 @@ msgid "Import From Node:"
msgstr "Importa des del Node:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Torna a Baixar"
#: editor/export_template_manager.cpp
@@ -3268,6 +3299,10 @@ msgid "Download"
msgstr "Baixa"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Mancant)"
@@ -3331,12 +3366,10 @@ msgid "No response."
msgstr "Cap resposta."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Ha fallat la sol·licitud."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Bucle de redirecció."
@@ -3350,15 +3383,22 @@ msgid "Download Complete."
msgstr "Baixada Completa."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "No es pot desar el Tema:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"No s'han pogut instal·lar les plantilles. Els fitxers problemàtics es troben "
"a '%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Error en la sol·licitud de l'url: "
#: editor/export_template_manager.cpp
@@ -3443,21 +3483,11 @@ msgstr "Baixa plantilles"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Selecciona un mirror de la llista: (Maj+Clic: Obre en el Navegador)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"No s'ha pogut escriure el fitxer file_type_cache.cch. No es desara el cau de "
-"tipus de fitxers!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Preferits"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "No es pot accedir a '%s'. No es troba en el sistema de fitxers!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr "Estat: No s'ha pogut importar. Corregiu el fitxer i torneu a importar."
@@ -3490,14 +3520,14 @@ msgid "Provided name contains invalid characters."
msgstr "El nom proporcionat conté caràcters invàlids."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "El Nom conté caràcters que no són vàlids."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Ja existeix un Fitxer o Directori amb aquest nom."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "El Nom conté caràcters que no són vàlids."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Reanomenant fitxer:"
@@ -3553,6 +3583,11 @@ msgstr "Duplica..."
msgid "Move To..."
msgstr "Mou cap a..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Nova Escena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Script Nou..."
@@ -3616,6 +3651,11 @@ msgstr "Ja hi existex un fitxer o directori amb aquest nom."
msgid "Overwrite"
msgstr "Sobreescriu"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Crea-ho a partir de l'Escena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Crea un Script"
@@ -3678,6 +3718,14 @@ msgid "Search complete"
msgstr "Cerca completa"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Afegeix al Grup"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Treu del Grup"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Aquest grup ja existeix."
@@ -3685,12 +3733,23 @@ msgstr "Aquest grup ja existeix."
msgid "Invalid group name."
msgstr "Nom del grup no vàlid."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Gestiona Grups"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Elimina Disseny"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grups"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Els nodes no es troben en el Grup"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3703,12 +3762,13 @@ msgid "Nodes in Group"
msgstr "Nodes del Grup"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Afegeix al Grup"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Treu del Grup"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Editor de scripts"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3916,7 +3976,8 @@ msgid "MultiNode Set"
msgstr "Establir MultiNode"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Seleccioneu un Node per editar Senyals i Grups."
#: editor/plugin_config_dialog.cpp
@@ -4682,10 +4743,6 @@ msgid "View Files"
msgstr "Visualitza Fitxers"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "No es pot resoldre l'amfitrió:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "S'ha produït un error en la connexió. Torneu-ho a provar."
@@ -4698,14 +4755,47 @@ msgid "No response from host:"
msgstr "Cap resposta de l'amfitrió:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "No es pot resoldre l'amfitrió:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Ha fallat la sol·licitud, codi de devolució:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Ha fallat la sol·licitud."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "No es pot desar el Tema:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Ha fallat la sol·licitud. Massa redireccionaments"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Bucle de redirecció."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Ha fallat la sol·licitud, codi de devolució:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Temps"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Error en la baixada (hash incorrecte). El fitxer fou manipulat."
@@ -4746,9 +4836,8 @@ msgid "Idle"
msgstr "Inactiu"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "Instal·la"
+msgstr "Instal·lar..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -4783,8 +4872,13 @@ msgid "All"
msgstr "Tot"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "ReImporta..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Connectors"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4794,7 +4888,7 @@ msgstr "Ordena:"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Reverse sorting."
-msgstr "Sol·licitud en marxa..."
+msgstr "Ordenació inversa."
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
@@ -4806,7 +4900,8 @@ msgid "Site:"
msgstr "Lloc:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Suport..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4818,6 +4913,11 @@ msgid "Testing"
msgstr "Provant"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Carregar..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Arxiu ZIP d'Actius"
@@ -4876,39 +4976,32 @@ msgid "Rotation Step:"
msgstr "Pas de la Rotació:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Vertical Guide"
-msgstr "Mou la guia vertical"
+msgstr "Moure guia vertical"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Vertical Guide"
-msgstr "Crea una nova guia vertical"
+msgstr "Crear guia vertical"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Vertical Guide"
-msgstr "Elimina la guia vertical"
+msgstr "Eliminar guia vertical"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Horizontal Guide"
-msgstr "Mou la guia horitzontal"
+msgstr "Moure guia horitzontal"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal Guide"
-msgstr "Crea una nova guia horitzontal"
+msgstr "Crear guia horitzontal"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Horizontal Guide"
-msgstr "Elimina la guia horitzontal"
+msgstr "Eliminar guia horitzontal"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal and Vertical Guides"
-msgstr "Crea una guia horitzontal i vertical noves"
+msgstr "Crea guies horitzontal i vertical"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move pivot"
@@ -4997,6 +5090,11 @@ msgid "Paste Pose"
msgstr "Enganxa Positura"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Reestableix la Postura"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Crea Os(sos) Personalitzat(s) a partir de Node(s)"
@@ -5028,6 +5126,7 @@ msgid "Zoom Reset"
msgstr "Restablir zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Mode de selecció"
@@ -5050,14 +5149,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+Clic Dret: Selecció detallada per llista"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Mode de moviment"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Mode de Rotació"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Mode d'Escalat"
@@ -5083,6 +5185,7 @@ msgid "Toggle snapping."
msgstr "Commutar Ajustament."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Utilitzar Ajustament"
@@ -5100,11 +5203,6 @@ msgid "Use Rotation Snap"
msgstr "Utilitzar Ajustament de Rotació"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Configurar Ajustament..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Ajustament Relatiu"
@@ -5118,6 +5216,11 @@ msgid "Smart Snapping"
msgstr "Ajustament Intel·ligent"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Configurar Ajustament..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "Ajustar al Pare"
@@ -5340,16 +5443,6 @@ msgstr "Estableix la Nansa"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Error en carregar la imatge:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Cap píxel amb transparència > 128 en la imatge..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Carrega una Màscara d'Emissió"
@@ -5669,14 +5762,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "La Superfície d'origen no és vàlida (li manquen cares)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "el node Pare no disposa de cares sòlides per omplir."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "No es pot mapar la zona."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Selecciona una Malla d'Origen:"
@@ -5761,20 +5846,27 @@ msgid "Generation Time (sec):"
msgstr "Temps de generació (s):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Les Cares no tenen àrea!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Cap Cara!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "El Node no conté cap geometria (cares)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "El Node no conté cap geometria."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "El Node no conté cap geometria (cares)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "El Node no conté cap geometria."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6109,7 +6201,6 @@ msgid "Grid Settings"
msgstr "Configuració de la Quadrícula"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Ajustar"
@@ -6216,12 +6307,9 @@ msgid "Error writing TextFile:"
msgstr "Error en escriure el Fitxer de Text:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Error: No s'ha pogut carregar el fitxer."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "Error no s'ha pogut carregar el fitxer."
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "No s'ha trobat la tessel·la:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6244,7 +6332,8 @@ msgid "Error Importing"
msgstr "Error en Importar"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Nou Fitxer de Text..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6327,6 +6416,11 @@ msgid "Open..."
msgstr "Obrir..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Obrir Script"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Desa-ho Tot"
@@ -6364,13 +6458,13 @@ msgid "Save Theme"
msgstr "Desa el Tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Tanca la Documentació"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Tanca-ho Tot"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Tanca la Documentació"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Executar"
@@ -6459,6 +6553,11 @@ msgstr "Depurador"
msgid "Search Results"
msgstr "Resultats de cerca"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Buida les Escenes Recents"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "Connexions al mètode:"
@@ -6528,6 +6627,7 @@ msgid "Syntax Highlighter"
msgstr "Ressaltador de sintaxi"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6563,24 +6663,6 @@ msgid "Toggle Comment"
msgstr "Comentaris"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Commutar Marcador"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "Anar al marcador següent"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Anar al marcador anterior"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "Suprimir tots els marcadors"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "(Des)Plega la línia"
@@ -6601,6 +6683,11 @@ msgid "Complete Symbol"
msgstr "Completa el Símbol"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Escala la Selecció"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Retalla els espais en blanc al final"
@@ -6617,29 +6704,34 @@ msgid "Auto Indent"
msgstr "Sagnat Automàtic"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Commuta el punt d'Interrupció"
+msgid "Find Previous"
+msgstr "Cerca l'Anterior"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Elimina tots els punts d'interrupció"
+msgid "Find in Files..."
+msgstr "Cercar en Fitxers..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Anar al Punt d'Interrupció següent"
+msgid "Contextual Help"
+msgstr "Ajuda Contextual"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Anar al Punt d'Interrupció anterior"
+#, fuzzy
+msgid "Toggle Bookmark"
+msgstr "Commutar Marcador"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Cerca l'Anterior"
+msgid "Go to Next Bookmark"
+msgstr "Anar al marcador següent"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Cercar en Fitxers..."
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Anar al marcador anterior"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Suprimir tots els marcadors"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6650,8 +6742,21 @@ msgid "Go to Line..."
msgstr "Anar a la Línia..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Ajuda Contextual"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Commuta el punt d'Interrupció"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Elimina tots els punts d'interrupció"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Anar al Punt d'Interrupció següent"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Anar al Punt d'Interrupció anterior"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -6899,8 +7004,9 @@ msgid "Audio Listener"
msgstr "Receptor d'Àudio"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Activa Doppler"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Habilitar Filtració"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6956,8 +7062,8 @@ msgid "Snap Nodes To Floor"
msgstr "Ajustar Nodes al Terra"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Mode Selecció (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6970,30 +7076,11 @@ msgstr ""
"Alt+Clic Dret: Selecció de llista de profunditat"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Mode Moviment (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Mode Rotació (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Mode Escala (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Coordenades Locals"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Mode Espai Local (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Mode d'Ajustament (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Vista Inferior"
@@ -7034,22 +7121,6 @@ msgid "Focus Selection"
msgstr "Focalitza't en la Selecció"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Selecciona una Eina"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Eina de Translació"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Eina de Rotació"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Eina d'Escala"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Vista Lliure"
@@ -7105,7 +7176,8 @@ msgstr "Mostra la Graella"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Configuració"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7418,10 +7490,6 @@ msgid "TextureRegion"
msgstr "Regió de Textura"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "No es pot desar el Tema:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Afegeix tots els Elements"
@@ -7508,12 +7576,12 @@ msgstr "Submenú"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "Element"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "Element"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7636,8 +7704,8 @@ msgstr "Pinta Rajola"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Maj + RMB: dibuixar una línia\n"
"Maj + Ctrl + RMB: pintar rectangle"
@@ -7955,6 +8023,10 @@ msgid "TileSet"
msgstr "Conjunt de rajoles"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Afegeix una Entrada"
@@ -8046,6 +8118,11 @@ msgid "Duplicate Nodes"
msgstr "Duplicar Nodes"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Enganxa els Nodes"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "Eliminar Nodes"
@@ -8055,10 +8132,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "El tipus d'entrada VisualShader ha canviat"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "Vèrtex"
@@ -8071,6 +8144,11 @@ msgid "Light"
msgstr "Llum"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Crear node Shader"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr "Crear node Shader"
@@ -8457,7 +8535,7 @@ msgstr "Retorna l'arrel quadrada del paràmetre."
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8466,7 +8544,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8647,6 +8725,11 @@ msgid "Linear interpolation between two vectors."
msgstr "Interpolació lineal entre dos vectors."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Interpolació lineal entre dos vectors."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr "Calcula el producte normalitzar del vector."
@@ -8676,7 +8759,7 @@ msgstr "Retorna un vector que apunta en la direcció de la refracció."
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8685,7 +8768,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8694,14 +8777,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8753,6 +8836,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8970,6 +9060,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Manquen les plantilles d'exportació per aquesta plataforma:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Gestor de Plantilles d'Exportació"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "Exporta en mode Depuració"
@@ -9128,6 +9222,15 @@ msgid "Unnamed Project"
msgstr "Projecte sense nom"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Importa un Projecte existent"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "No es pot obrir el projecte a '%s'."
@@ -9225,12 +9328,13 @@ msgstr ""
"El contingut del directori del projecte no es modificarà."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
-"Eliminar tots els projectes que falten de la llista? (El contingut dels "
-"directoris no es modificarà)"
+"Eliminar %d projectes de la llista?\n"
+"El contingut del directori del projecte no es modificarà."
#: editor/project_manager.cpp
msgid ""
@@ -9255,8 +9359,9 @@ msgid "Project Manager"
msgstr "Gestor del Projecte"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Llista de Projectes"
+#, fuzzy
+msgid "Projects"
+msgstr "Projecte"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9280,10 +9385,6 @@ msgid "Templates"
msgstr "Plantilles"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Surt"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Reinicia"
@@ -9627,6 +9728,10 @@ msgstr "Localitzacions:"
msgid "AutoLoad"
msgstr "Càrrega Automàtica"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Connectors"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Zero"
@@ -9679,14 +9784,6 @@ msgstr "Selecciona un Mètode Virtual"
msgid "Select Method"
msgstr "Selecciona un Mètode"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "No s'ha pogut executar l'eina PVRTC:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr "No es pot recarregar la imatge convertida amb PVRTC:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -9983,6 +10080,11 @@ msgid "Remove Node(s)"
msgstr "Elimina els Nodes"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Modifica el Nom de l'Entrada"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10111,23 +10213,25 @@ msgstr "Avís de Configuració del Node:"
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"El Node té connexions i grups\n"
"Feu Clic per mostrar el Tauler de Senyals."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"El Node té connexions.\n"
"Feu Clic per mostrar el Tauler de Senyals."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"El Node està agrupat.\n"
@@ -10225,6 +10329,11 @@ msgid "Error loading script from %s"
msgstr "Error en carregar l'Script des de '%s'"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Sobreescriu"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "No Disponible"
@@ -10416,6 +10525,10 @@ msgid "Change Shortcut"
msgstr "Canviar Drecera"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Configuració de l'Editor"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Dreceres"
@@ -10848,10 +10961,32 @@ msgid "Set Variable Type"
msgstr "Estableix el Tipus de Variable"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr ""
+"El Nom no és vàlid. No pot coincidir amb noms de tipus integrats ja "
+"existents."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Crear un nou rectangle."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Variables:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Crear un nou rectangle."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Crear un nou polígon."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "El nom no és un identificador vàlid:"
@@ -11043,10 +11178,6 @@ msgid "Cut Nodes"
msgstr "Talla els Nodes"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Enganxa els Nodes"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "Editar Membre"
@@ -11939,22 +12070,6 @@ msgstr ""
"forma per tal d'obtenir-ne la mida. Altrament, establiu-la com a Destinació "
"de Renderització i assigneu-ne la textura interna a algun node."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Error inicialitzant FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Format de lletra desconegut."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Error carregant lletra."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "La mida de la lletra no és vàlida."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Entrada"
@@ -11989,6 +12104,106 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr "Les constants no es poden modificar."
+#~ msgid "No Matches"
+#~ msgstr "Cap Coincidència"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "No s'ha pogut escriure el fitxer file_type_cache.cch. No es desara el cau "
+#~ "de tipus de fitxers!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "No es pot accedir a '%s'. No es troba en el sistema de fitxers!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Error en carregar la imatge:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Cap píxel amb transparència > 128 en la imatge..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "el node Pare no disposa de cares sòlides per omplir."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "No es pot mapar la zona."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Les Cares no tenen àrea!"
+
+#~ msgid "No faces!"
+#~ msgstr "Cap Cara!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Error: No s'ha pogut carregar el fitxer."
+
+#~ msgid "Error could not load file."
+#~ msgstr "Error no s'ha pogut carregar el fitxer."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Activa Doppler"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Mode Selecció (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Mode Moviment (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Mode Rotació (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Mode Escala (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Coordenades Locals"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Mode d'Ajustament (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Selecciona una Eina"
+
+#~ msgid "Tool Move"
+#~ msgstr "Eina de Translació"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Eina de Rotació"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Eina d'Escala"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "Eliminar tots els projectes que falten de la llista? (El contingut dels "
+#~ "directoris no es modificarà)"
+
+#~ msgid "Project List"
+#~ msgstr "Llista de Projectes"
+
+#~ msgid "Exit"
+#~ msgstr "Surt"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "No s'ha pogut executar l'eina PVRTC:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr "No es pot recarregar la imatge convertida amb PVRTC:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Error inicialitzant FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Format de lletra desconegut."
+
+#~ msgid "Error loading font."
+#~ msgstr "Error carregant lletra."
+
+#~ msgid "Invalid font size."
+#~ msgstr "La mida de la lletra no és vàlida."
+
#~ msgid "Previous Folder"
#~ msgstr "Directori Anterior"
@@ -12622,9 +12837,6 @@ msgstr "Les constants no es poden modificar."
#~ msgid "Erase selection"
#~ msgstr "Elimina la Selecció"
-#~ msgid "Could not find tile:"
-#~ msgstr "No s'ha trobat la tessel·la:"
-
#~ msgid "Item name or ID:"
#~ msgstr "Nom o ID de l'Element:"
@@ -12866,9 +13078,6 @@ msgstr "Les constants no es poden modificar."
#~ msgid "Info"
#~ msgstr "Informació"
-#~ msgid "Re-Import..."
-#~ msgstr "ReImporta..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "Cap màscara de bits per importar!"
diff --git a/editor/translations/cs.po b/editor/translations/cs.po
index f3eaafab33..a9cae4a444 100644
--- a/editor/translations/cs.po
+++ b/editor/translations/cs.po
@@ -11,12 +11,14 @@
# zxey <r.hozak@seznam.cz>, 2018.
# Vojtěch Šamla <auzkok@seznam.cz>, 2018, 2019.
# Peeter Angelo <contact@peeterangelo.com>, 2019.
+# VojtechBrezina <vojta.brezina@gmail.com>, 2019.
+# Garrom Orc Shaman <garromorcshaman@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-09 10:46+0000\n"
-"Last-Translator: Martin Novák <maidx@seznam.cz>\n"
+"PO-Revision-Date: 2019-08-21 15:57+0000\n"
+"Last-Translator: VojtechBrezina <vojta.brezina@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/"
"cs/>\n"
"Language: cs\n"
@@ -24,7 +26,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -67,7 +69,6 @@ msgid "On call to '%s':"
msgstr "Při volání '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Volný"
@@ -136,27 +137,22 @@ msgid "Anim Change Call"
msgstr "Animace: změna volání"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Animace: ZmÄ›nit Äas klíÄového snímku"
+msgstr "Animace: ZmÄ›nit Äas klíÄových snímků"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Animace: změna přechodu"
+msgstr "Animace: změna přechodů"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Animace: změna transformace"
+msgstr "Animace: změna transformací"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Animace: ZmÄ›nit hodnotu klíÄového snímku"
+msgstr "Animace: ZmÄ›nit hodnotu klíÄových snímků"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
msgstr "Animace: změna volání"
@@ -232,7 +228,7 @@ msgstr "Aktivovat/Deaktivovat tuto stopu."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr "Režim aktualizece (jak je tato vlastnost nastavena)"
+msgstr "Režim aktualizace (jak je tato vlastnost nastavena)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
@@ -291,7 +287,6 @@ msgid "Clamp Loop Interp"
msgstr "Režim svorkové smyÄky"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Wrap Loop Interp"
msgstr "Interpolace ovinutou smyÄkou"
@@ -317,9 +312,8 @@ msgid "Change Animation Interpolation Mode"
msgstr "Změnit režim interpolace animace"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Loop Mode"
-msgstr "ZmÄ›nit smyÄku animace"
+msgstr "ZmÄ›nit režim smyÄky animace"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -350,7 +344,7 @@ msgstr "Animace: vložit"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr "AnimationPlayer nemůže animovat sám sebe, pouze ostatní."
+msgstr "AnimationPlayer nemůže animovat sám sebe, pouze ostatní pÅ™ehrávaÄe."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -413,23 +407,20 @@ msgid "Track is not of type Spatial, can't insert key"
msgstr "Stopa není typu Spatial, nelze vložit klíÄ"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Transform Track Key"
-msgstr "Stopa 3D transformace"
+msgstr "PÅ™idat klÃ­Ä stopy transformace"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track Key"
-msgstr "Přidat stopu"
+msgstr "PÅ™idat klÃ­Ä stopy"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
msgstr "Cesta stopy není validní, nelze vložit klÃ­Ä metody."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Method Track Key"
-msgstr "Stopa volání metody"
+msgstr "PÅ™idat klÃ­Ä volání metody"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
@@ -452,12 +443,11 @@ msgid "Anim Scale Keys"
msgstr "Animace: zmÄ›nit měřítko klíÄů"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
-"Tato možnost nefunguje s Beziérovými úpravami, protože se jedná pouze o "
-"jednu stopu."
+"Tato možnost nefunguje pro úpravy Beziérovy křivky , protože se jedná pouze "
+"o jednu stopu."
#: editor/animation_track_editor.cpp
msgid ""
@@ -471,6 +461,15 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
+"Tato animace patří k importované scéně, takže změny na importovaných stopách "
+"nebudou uloženy\n"
+"\n"
+"Aby jste povolily možnost přidávat vlastní stopy, běžte do nastavení importu "
+"této scény a nastavte\n"
+"\"Animace > Úložiště\" na \"Soubory\", Povolte \"Animace > Ponechat vlastní "
+"stopy\", poté re-importujte.\n"
+"Alternativně použijte přednastavení importu které importuje animace do "
+"separovaných souborů."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
@@ -482,9 +481,8 @@ msgid "Select All"
msgstr "Vybrat vše"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select None"
-msgstr "Vybrat uzel"
+msgstr "Nevybrat nic"
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
@@ -629,17 +627,16 @@ msgid "Copy"
msgstr "Kopírovat"
#: editor/animation_track_editor_plugins.cpp
-#, fuzzy
msgid "Add Audio Track Clip"
-msgstr "Audio klipy:"
+msgstr "Přidat klip audio stopy"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
-msgstr ""
+msgstr "ZmÄ›nit poÄáteÄní pozici audio klipu"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip End Offset"
-msgstr ""
+msgstr "Změnit koncovou pozici audio klipu"
#: editor/array_property_edit.cpp
msgid "Resize Array"
@@ -662,16 +659,18 @@ msgid "Line Number:"
msgstr "Číslo řádku:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr ""
+msgid "Replaced %d occurrence(s)."
+msgstr "Nahrazeno %d výskytů."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Žádné shody"
+#, fuzzy
+msgid "%d match."
+msgstr "Nalezeno %d shod(a)."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Nahrazeno %d výskytů."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Nalezeno %d shod(a)."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -723,33 +722,28 @@ msgid "Line and column numbers."
msgstr "Čísla řádků a sloupců."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Method in target node must be specified."
-msgstr "Je nutné zadat metodu v cílovém uzlu!"
+msgstr "Je nutné zadat metodu v cílovém uzlu."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
msgstr ""
-"Cílová metoda nenalezena! Specifikujte existující metodu, nebo k cílovému "
+"Cílová metoda nenalezena. Specifikujte existující metodu, nebo k cílovému "
"uzlu připojte skript."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Node:"
msgstr "Připojit k uzlu:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Script:"
-msgstr "Nelze se připojit k hostiteli:"
+msgstr "Připojit ke skriptu:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "From Signal:"
-msgstr "Signály:"
+msgstr "Z signálu:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
@@ -781,9 +775,8 @@ msgid "Extra Call Arguments:"
msgstr "Další argumenty volání:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Advanced"
-msgstr "PokroÄilé možnosti"
+msgstr "PokroÄilé"
#: editor/connections_dialog.cpp
msgid "Deferred"
@@ -858,7 +851,7 @@ msgstr "Připojit Signál: "
#: editor/connections_dialog.cpp
#, fuzzy
msgid "Edit Connection:"
-msgstr "Upravit připojení: "
+msgstr "Upravit připojení:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
@@ -906,8 +899,7 @@ msgstr "Oblíbené:"
msgid "Recent:"
msgstr "Nedávné:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1010,7 +1002,7 @@ msgstr ""
"Soubory ke smazání potÅ™ebují jiné zdroje ke své Äinnosti.\n"
"Přesto je chcete smazat? (nelze vrátit zpět)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Nelze odstranit:"
@@ -1048,7 +1040,7 @@ msgstr "Permanentně smazat %d položek? (nelze vrátit zpět!)"
msgid "Show Dependencies"
msgstr "Závislosti"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Průzkumník osiřelých zdrojů"
@@ -1137,14 +1129,16 @@ msgid "License"
msgstr "Licence"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Licence třetích stran"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine závisí na volně dostupných a open source knihovnách od třetích "
@@ -1165,7 +1159,8 @@ msgid "Licenses"
msgstr "Licence"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "NepodaÅ™ilo se otevřít balíÄek, není ve formátu zip."
#: editor/editor_asset_installer.cpp
@@ -1558,9 +1553,8 @@ msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "3D Editor"
-msgstr "Editor"
+msgstr "3D Editor"
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1680,12 +1674,11 @@ msgid "New"
msgstr "Nový"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importovat"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Exportovat"
@@ -2098,6 +2091,10 @@ msgstr "VyÄistit"
msgid "Clear Output"
msgstr "Vymazat výstup"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Export projektu selhal s chybovým kódem %d."
@@ -2419,6 +2416,15 @@ msgid "Pick a Main Scene"
msgstr "Vybrat hlavní scénu"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Zavřít scénu"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Zavřít scénu"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Nelze povolit rozšiřující plugin: '%s' parsování konfigurace se nezdařilo."
@@ -2526,6 +2532,11 @@ msgstr "Spustit tuto scénu"
msgid "Close Tab"
msgstr "Zavřít záložku"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Zavřít záložku"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Zavřít ostatní záložky"
@@ -2612,6 +2623,10 @@ msgstr "Nová odvozená scéna..."
msgid "Open Scene..."
msgstr "Otevřít scénu..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Otevřít nedávné"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Uložit scénu"
@@ -2621,14 +2636,6 @@ msgid "Save All Scenes"
msgstr "Uložit všechny scény"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Zavřít scénu"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Otevřít nedávné"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Konvertovat na..."
@@ -2658,25 +2665,36 @@ msgstr "Vrátit scénu"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Různé nástroje pro projekt nebo scény."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Projekt"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Nastavení projektu"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Nástroje"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Exportovat"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Otevřít složku s daty projektu"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Nástroje"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Průzkumník osiřelých zdrojů"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2773,12 +2791,13 @@ msgstr ""
"Při použití se vzdáleným spuštěním je toto více efektivní při použití "
"síťového souborového systému."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Editor"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Nastavení editoru"
#: editor/editor_node.cpp
@@ -2818,14 +2837,15 @@ msgstr "Otevřít složku s nastavením editoru"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "Spravovat exportní šablony"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Spravovat exportní šablony"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Nápověda"
@@ -2833,12 +2853,13 @@ msgstr "Nápověda"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Hledat"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Online dokumentace"
@@ -3286,7 +3307,8 @@ msgid "Import From Node:"
msgstr "Import z uzlu:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Stáhnout znovu"
#: editor/export_template_manager.cpp
@@ -3303,6 +3325,10 @@ msgid "Download"
msgstr "Stáhnout"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Nenalezeno)"
@@ -3366,12 +3392,10 @@ msgid "No response."
msgstr "Žádná odpovÄ›Ä."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Požadavek se nezdařil."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Zacyklené přesměrování."
@@ -3385,14 +3409,21 @@ msgid "Download Complete."
msgstr "Stahování dokonÄeno."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Nelze uložit motiv do souboru:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Instalace šablon selhala. Problémové archivy šablon lze nalézt na '%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Chyba požadavku o url: "
#: editor/export_template_manager.cpp
@@ -3479,21 +3510,11 @@ msgstr "Stáhnout šablony"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Zvolte zrcadlo ze seznamu: (Shift + Klik: OtevÅ™it v prohlížeÄi)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Nelze otevřít file_type_cache.cch pro zápis, cache typů souborů není "
-"ukládána!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Oblíbené"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "Nelze přejít k '%s', protože nebylo nalezeno v souborovém systému!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Status: import souboru selhal. Opravte, prosím, soubor a naimportujte ho "
@@ -3529,14 +3550,14 @@ msgid "Provided name contains invalid characters."
msgstr "Poskytnuté jméno obsahuje neplatné znaky"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Jméno obsahuje neplatné znaky."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Soubor nebo složka s tímto názvem již existuje."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Jméno obsahuje neplatné znaky."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Přejmenovávání souboru:"
@@ -3596,6 +3617,11 @@ msgstr "Duplikovat..."
msgid "Move To..."
msgstr "Přesunout do..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Nová scéna"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Nový skript..."
@@ -3664,6 +3690,11 @@ msgstr "Soubor nebo složka se stejným názvem již na tomto místě existuje."
msgid "Overwrite"
msgstr "Přepsat"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Vytvořit ze scény"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Vytvořit skript"
@@ -3724,6 +3755,14 @@ msgid "Search complete"
msgstr "Vyhledávání dokonÄeno"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Přidat do skupiny"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Odebrat ze skupiny"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Název skupiny již existuje."
@@ -3731,12 +3770,23 @@ msgstr "Název skupiny již existuje."
msgid "Invalid group name."
msgstr "Neplatný název skupiny."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Spravovat skupiny"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Odstranit rozložení"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Skupiny"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Uzly nejsou ve skupinÄ›"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3749,12 +3799,13 @@ msgid "Nodes in Group"
msgstr "Uzly jsou ve skupinÄ›"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Přidat do skupiny"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Odebrat ze skupiny"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Otevřít editor skriptů"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3962,7 +4013,8 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Zvolit uzel pro editaci signálů a skupin."
#: editor/plugin_config_dialog.cpp
@@ -4721,10 +4773,6 @@ msgid "View Files"
msgstr "Zobrazit soubory"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Nelze přeložit název hostitele:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Chyba připojení, zkuste to prosím znovu."
@@ -4737,14 +4785,47 @@ msgid "No response from host:"
msgstr "Žádná odpovÄ›Ä od hostitele:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Nelze přeložit název hostitele:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Požadavek se nezdařil, návratový kód:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Požadavek se nezdařil."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Nelze uložit motiv do souboru:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Požadavek se nezdařil, příliš mnoho přesměrování"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Zacyklené přesměrování."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Požadavek se nezdařil, návratový kód:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "ÄŒas"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Špatný hash staženého souboru, soubor byl nejspíše zfalšován."
@@ -4822,8 +4903,13 @@ msgid "All"
msgstr "Všechny"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Importovat"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Pluginy"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4845,7 +4931,8 @@ msgid "Site:"
msgstr "Web:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Podpora..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4857,6 +4944,11 @@ msgid "Testing"
msgstr "Testované"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "NaÄíst..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "ZIP soubor asetů"
@@ -5024,6 +5116,11 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "Vymazat pózu"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Vytvořit ze scény"
@@ -5053,6 +5150,7 @@ msgid "Zoom Reset"
msgstr "Resetovat zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Režim výběru"
@@ -5074,14 +5172,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+Pravé tlaÄíko myÅ¡i:"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Režim přesouvání"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Režim otáÄení"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Režim škálování"
@@ -5105,6 +5206,7 @@ msgid "Toggle snapping."
msgstr "Přepnout přichycování."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Použít přichycování"
@@ -5122,11 +5224,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Nastavení přichytávání..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5140,6 +5237,11 @@ msgid "Smart Snapping"
msgstr "Chytré přichytávání"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Nastavení přichytávání..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
msgstr "PÅ™ichytit k rodiÄovi"
@@ -5358,16 +5460,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Chyba při nahrávání obrázku:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Žádný pixel s průhledností > 128 v obrázku..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "NaÄíst emisní masku"
@@ -5691,14 +5783,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5783,19 +5867,24 @@ msgid "Generation Time (sec):"
msgstr "Čas generování (sec):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Scéna neobsahuje žádný skript."
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't contain geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6129,7 +6218,6 @@ msgid "Grid Settings"
msgstr "Nastavení mřížky"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Přichytit"
@@ -6236,11 +6324,8 @@ msgid "Error writing TextFile:"
msgstr "Chyba při zápisu textového souboru:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Chyba: nelze naÄíst soubor."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+#, fuzzy
+msgid "Could not load file at:"
msgstr "Chyba: nelze naÄíst soubor."
#: editor/plugins/script_editor_plugin.cpp
@@ -6264,7 +6349,8 @@ msgid "Error Importing"
msgstr "Chyba importu"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Nový textový soubor..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6348,6 +6434,11 @@ msgid "Open..."
msgstr "Otevřít..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Otevřít skript"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Uložit vše"
@@ -6386,13 +6477,13 @@ msgid "Save Theme"
msgstr "Uložit motiv"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Zavřít dokumentaci"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Zavřít vše"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Zavřít dokumentaci"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Spustit"
@@ -6482,6 +6573,11 @@ msgstr "Ladicí program"
msgid "Search Results"
msgstr "Výsledky hledání"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Vymazat nedávné scény"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6552,6 +6648,7 @@ msgid "Syntax Highlighter"
msgstr "ZvýrazňovaÄ syntaxe"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6587,26 +6684,6 @@ msgid "Toggle Comment"
msgstr "Přepnout komentář"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Přepnout volný pohled"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Přejít na další breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Přejít na předchozí breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Odstranit všechny položky"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Složit/Rozložit řádek"
@@ -6627,6 +6704,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Změnit měřítko výběru"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Osekat koncové mezery"
@@ -6643,29 +6725,36 @@ msgid "Auto Indent"
msgstr "Automatické odsazení"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Přepnout breakpoint"
+msgid "Find Previous"
+msgstr "Najít předchozí"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Odstranit všechny breakpointy"
+msgid "Find in Files..."
+msgstr "Najít v souborech..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Přejít na další breakpoint"
+msgid "Contextual Help"
+msgstr "Kontextová nápověda"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Přejít na předchozí breakpoint"
+#, fuzzy
+msgid "Toggle Bookmark"
+msgstr "Přepnout volný pohled"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Najít předchozí"
+#, fuzzy
+msgid "Go to Next Bookmark"
+msgstr "Přejít na další breakpoint"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Najít v souborech..."
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Přejít na předchozí breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Remove All Bookmarks"
+msgstr "Odstranit všechny položky"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6676,8 +6765,21 @@ msgid "Go to Line..."
msgstr "Přejít na řádek..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Kontextová nápověda"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Přepnout breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Odstranit všechny breakpointy"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Přejít na další breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Přejít na předchozí breakpoint"
#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
@@ -6922,8 +7024,8 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Doppler Enable"
-msgstr "Povolit"
+msgid "Enable Doppler"
+msgstr "Povolit filtrování"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6978,8 +7080,8 @@ msgid "Snap Nodes To Floor"
msgstr "Přichytit k mřížce"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Režim výběru (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6992,30 +7094,10 @@ msgstr ""
"Alt+Pravé tlaÄíko myÅ¡i: VýbÄ›r seznamu hloubky"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Režim posunu (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Režim otáÄení (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Režim zvětšování (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Místní souřadnice"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Režim přichycení (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Pohled zdola"
@@ -7057,22 +7139,6 @@ msgid "Focus Selection"
msgstr "Zaměřit výběr"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Nástroj Výběr"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Nástroj Přesunout"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Nástroj OtoÄit"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Nástroj Zvětšení"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Přepnout volný pohled"
@@ -7128,7 +7194,8 @@ msgstr "Zobrazit mřížku"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Nastavení"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7440,10 +7507,6 @@ msgid "TextureRegion"
msgstr "Oblast textury"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "Nelze uložit motiv do souboru:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Přidat všechny položky"
@@ -7534,12 +7597,12 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "Položka"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "Položka"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7661,8 +7724,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7976,6 +8039,10 @@ msgid "TileSet"
msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Přidat vstup"
@@ -8067,6 +8134,11 @@ msgid "Duplicate Nodes"
msgstr "Duplikovat uzel/uzly"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Vložit uzly"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Smazat uzel"
@@ -8076,10 +8148,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "Vrchol"
@@ -8093,6 +8161,11 @@ msgstr "Světlo"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Vytvořit uzel"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Vytvořit uzel"
@@ -8470,7 +8543,7 @@ msgstr "Vrátí odmocninu parametru."
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8479,7 +8552,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8646,6 +8719,11 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Lineární interpolace mezi dvěma skaláry."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8671,7 +8749,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8680,7 +8758,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8689,14 +8767,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8741,6 +8819,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8953,6 +9038,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Exportní šablony pro tuto platformu chybí:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Spravovat exportní šablony"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9100,6 +9189,15 @@ msgid "Unnamed Project"
msgstr "Nepojmenovaný projekt"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Sestavit projekt"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "Nelze otevřít projekt v '%s'."
@@ -9173,8 +9271,8 @@ msgstr "Odstranit projekt ze seznamu? (Obsah složky zůstane nedotÄen)"
#: editor/project_manager.cpp
#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr "Odstranit projekt ze seznamu? (Obsah složky zůstane nedotÄen)"
#: editor/project_manager.cpp
@@ -9194,8 +9292,9 @@ msgid "Project Manager"
msgstr "Správce projektů"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Seznam projektů"
+#, fuzzy
+msgid "Projects"
+msgstr "Projekt"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9219,10 +9318,6 @@ msgid "Templates"
msgstr "Å ablony"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "UkonÄit"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Restartovat nyní"
@@ -9573,6 +9668,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Pluginy"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Nula"
@@ -9625,14 +9724,6 @@ msgstr "Vybrat virtuální metodu"
msgid "Select Method"
msgstr "Vybrat metodu"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "Dávkové přejmenování"
@@ -9924,6 +10015,11 @@ msgid "Remove Node(s)"
msgstr "Odstranit uzel/uzly"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Změnit název vstupu"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10051,19 +10147,19 @@ msgstr "Varování konfigurace uzlu:"
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10162,6 +10258,11 @@ msgid "Error loading script from %s"
msgstr "Chyba nahrávání skriptu z %s"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Přepsat"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "N/A"
@@ -10362,6 +10463,10 @@ msgid "Change Shortcut"
msgstr "Upravit kotvy"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Nastavení editoru"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Zkratky"
@@ -10794,10 +10899,31 @@ msgid "Set Variable Type"
msgstr "Nastavit typ proměnné"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr ""
+"Neplatný název. Nesmí kolidovat s existujícím jménem zabudovaného typu."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Vytvořit nové uzly."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Proměnné:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Vytvořit nové uzly."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Vytvořit nový polygon."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Jméno není platný identifikátor:"
@@ -10992,10 +11118,6 @@ msgid "Cut Nodes"
msgstr "Vyjmout uzly"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Vložit uzly"
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "Členové"
@@ -11816,22 +11938,6 @@ msgstr ""
"mohl získat velikost. Jinak ho nastavte jako render target a pÅ™iÅ™aÄte jeho "
"vnitřní texturu nějakému uzlu k zobrazení."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Chyba při inicializaci FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Neznámý formát fontu."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Chyba nahrávání fontu."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Neplatná velikost fontu."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Vstup"
@@ -11866,6 +11972,85 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr "Konstanty není možné upravovat."
+#~ msgid "No Matches"
+#~ msgstr "Žádné shody"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Nelze otevřít file_type_cache.cch pro zápis, cache typů souborů není "
+#~ "ukládána!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "Nelze přejít k '%s', protože nebylo nalezeno v souborovém systému!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Chyba při nahrávání obrázku:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Žádný pixel s průhledností > 128 v obrázku..."
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Chyba: nelze naÄíst soubor."
+
+#, fuzzy
+#~ msgid "Doppler Enable"
+#~ msgstr "Povolit"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Režim výběru (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Režim posunu (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Režim otáÄení (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Režim zvětšování (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Místní souřadnice"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Režim přichycení (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Nástroj Výběr"
+
+#~ msgid "Tool Move"
+#~ msgstr "Nástroj Přesunout"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Nástroj OtoÄit"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Nástroj Zvětšení"
+
+#, fuzzy
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr "Odstranit projekt ze seznamu? (Obsah složky zůstane nedotÄen)"
+
+#~ msgid "Project List"
+#~ msgstr "Seznam projektů"
+
+#~ msgid "Exit"
+#~ msgstr "UkonÄit"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Chyba při inicializaci FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Neznámý formát fontu."
+
+#~ msgid "Error loading font."
+#~ msgstr "Chyba nahrávání fontu."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Neplatná velikost fontu."
+
#~ msgid "Previous Folder"
#~ msgstr "Předchozí složka"
@@ -11915,9 +12100,6 @@ msgstr "Konstanty není možné upravovat."
#~ msgid "Builds"
#~ msgstr "Sestavení"
-#~ msgid "Build Project"
-#~ msgstr "Sestavit projekt"
-
#~ msgid "View log"
#~ msgstr "Zobrazit logy"
diff --git a/editor/translations/da.po b/editor/translations/da.po
index 33b763b7ee..bacbf07ff6 100644
--- a/editor/translations/da.po
+++ b/editor/translations/da.po
@@ -67,7 +67,6 @@ msgid "On call to '%s':"
msgstr "Ved kald til '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Gratis"
@@ -670,17 +669,18 @@ msgid "Line Number:"
msgstr "Linjenummer:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "Erstattede %d forekomst(er)."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+#, fuzzy
+msgid "%d matches."
msgstr "Ingen Match"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Erstattede %d forekomst(er)."
-
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Match stor/lille"
@@ -915,8 +915,7 @@ msgstr "Favoritter:"
msgid "Recent:"
msgstr "Seneste:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1019,7 +1018,7 @@ msgstr ""
"De filer der fjernes er nødvendige for, at andre ressourcer kan fungere.\n"
"Fjern dem alligevel? (ej fortrydes)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Kan ikke fjerne:"
@@ -1056,7 +1055,7 @@ msgstr "Slette %d styk(s) permanent? (ej fortryd)"
msgid "Show Dependencies"
msgstr "Afhængigheder"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Forældreløs ressource udforsker"
@@ -1145,14 +1144,16 @@ msgid "License"
msgstr "Licens"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Tredjeparts Licens"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine er afhængig af en række tredjeparts biblioteker som er gratis "
@@ -1173,7 +1174,8 @@ msgid "Licenses"
msgstr "Licenser"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Fejl ved åbning af pakke fil, ikke i zip format."
#: editor/editor_asset_installer.cpp
@@ -1686,12 +1688,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importer"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Eksport"
@@ -2105,6 +2106,10 @@ msgstr "Clear"
msgid "Clear Output"
msgstr "Ryd Output"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Projekt eksport fejlede med fejlkode %d."
@@ -2425,6 +2430,15 @@ msgid "Pick a Main Scene"
msgstr "Vælg en Main Scene"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Luk Scene"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Luk Scene"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Kan ikke aktivere addon plugin ved: '%s' parsing af konfiguration "
@@ -2538,6 +2552,11 @@ msgstr "Spil denne Scene"
msgid "Close Tab"
msgstr "Luk faneblad"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Luk faneblad"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2624,6 +2643,10 @@ msgstr "Ny Nedarvet Scene..."
msgid "Open Scene..."
msgstr "Ã…bn Scene..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Ã…ben Seneste"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Gem Scene"
@@ -2633,14 +2656,6 @@ msgid "Save All Scenes"
msgstr "Gem alle Scener"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Luk Scene"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Ã…ben Seneste"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Konverter Til..."
@@ -2670,25 +2685,36 @@ msgstr "Gendan scene"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Diverse projekt eller scene redskaber."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Projekt"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Projekt Indstillinger"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Værktøjer"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Eksport"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Ã…bn Projekt datamappe"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Værktøjer"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Forældreløs ressource udforsker"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2786,12 +2812,13 @@ msgstr ""
"Når det bruges eksternt på en enhed, er dette mere effektivt med "
"netværksfilsystem."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Redaktør"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Editor Indstillinger"
#: editor/editor_node.cpp
@@ -2831,14 +2858,15 @@ msgstr "Åbn redaktør Indstillinger mappe"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "Organiser Eksport Skabeloner"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Organiser Eksport Skabeloner"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Hjælp"
@@ -2846,12 +2874,13 @@ msgstr "Hjælp"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Søg"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Online Dokumentation"
@@ -3297,7 +3326,8 @@ msgid "Import From Node:"
msgstr "Importer Fra Node:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Gen-Download"
#: editor/export_template_manager.cpp
@@ -3314,6 +3344,10 @@ msgid "Download"
msgstr "Download"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Mangler)"
@@ -3377,12 +3411,10 @@ msgid "No response."
msgstr "Ingen reaktion."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Forespørgsel mislykkedes."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Omdiriger Løkke."
@@ -3396,13 +3428,19 @@ msgid "Download Complete."
msgstr "Download fuldført."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Kan ikke fjerne:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Fejl ved anmodning af url: "
#: editor/export_template_manager.cpp
@@ -3489,19 +3527,11 @@ msgstr "Download Skabeloner"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Vælg spejl fra liste: (Shift+Click: Åbn i Browser)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr "Kan ikke skrive til file_type_cache.cch. Gemmer ikke fil type cache!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Favoritter"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "Kan ikke navigere til '%s' da det ikke blev fundet i filsystemet!"
-
-#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3543,14 +3573,14 @@ msgid "Provided name contains invalid characters."
msgstr "Det angivne navn indeholder ugyldige karakterer"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Navnet indeholder ugyldige karakterer."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "En fil eller mappe med dette navn findes allerede."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Navnet indeholder ugyldige karakterer."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Omdøb fil:"
@@ -3613,6 +3643,11 @@ msgstr "Duplikere"
msgid "Move To..."
msgstr "Flyt Til..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Ny Scene"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3687,6 +3722,11 @@ msgstr "En fil eller mappe med dette navn findes allerede."
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Gem Scene"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3756,6 +3796,14 @@ msgid "Search complete"
msgstr "Søg Tekst"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Føj til Gruppe"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Fjern fra Gruppe"
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "FEJL: Animationsnavn eksisterer allerede!"
@@ -3765,13 +3813,23 @@ msgstr "FEJL: Animationsnavn eksisterer allerede!"
msgid "Invalid group name."
msgstr "Ugyldigt navn."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Grupper"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Slet Layout"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupper"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr "Føj til Gruppe"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3785,12 +3843,13 @@ msgid "Nodes in Group"
msgstr "Føj til Gruppe"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Føj til Gruppe"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Fjern fra Gruppe"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Ã…bn Script Editor"
#: editor/groups_editor.cpp
#, fuzzy
@@ -4001,7 +4060,8 @@ msgid "MultiNode Set"
msgstr "MultiNode Sæt"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Vælg en Node at redigere Signaler og Grupper for."
#: editor/plugin_config_dialog.cpp
@@ -4800,10 +4860,6 @@ msgid "View Files"
msgstr "Vis filer"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4816,14 +4872,47 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Forespørgsel mislykkedes."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Kan ikke fjerne:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Omdiriger Løkke."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Forespørgsel mislykkedes."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Tid"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4904,8 +4993,12 @@ msgid "All"
msgstr "Alle"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Importer"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4927,7 +5020,8 @@ msgid "Site:"
msgstr "Websted:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Støtte..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4939,6 +5033,11 @@ msgid "Testing"
msgstr "Tester"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Indlæs"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Assets zipfil"
@@ -5106,6 +5205,11 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "Spil Brugerdefineret Scene"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Spil Brugerdefineret Scene"
@@ -5136,6 +5240,7 @@ msgid "Zoom Reset"
msgstr "Zoom Ud"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -5156,14 +5261,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "Skifter Modus"
@@ -5189,6 +5297,7 @@ msgid "Toggle snapping."
msgstr "Skift snapping mode"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5205,11 +5314,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5222,6 +5326,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5438,16 +5547,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5768,14 +5867,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5860,19 +5951,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't contain geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6216,7 +6311,6 @@ msgid "Grid Settings"
msgstr "Editor Indstillinger"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6325,12 +6419,7 @@ msgstr "Error loading skrifttype."
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "Fejl - kunne ikke oprette script i filsystem."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "Fejl - kunne ikke oprette script i filsystem."
#: editor/plugins/script_editor_plugin.cpp
@@ -6360,7 +6449,7 @@ msgstr "Fejl i flytning:\n"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "Opret mappe..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6446,6 +6535,11 @@ msgid "Open..."
msgstr "Ã…ben"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Ã…ben script"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6486,13 +6580,13 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Luk alt"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr ""
@@ -6581,6 +6675,11 @@ msgstr ""
msgid "Search Results"
msgstr "Søg i Hjælp"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Ryd Seneste Scener"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6653,6 +6752,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6689,26 +6789,6 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Skift/Toggle Breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Gå Til Næste Trin"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Skift/Toggle Breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Fjern Alt"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Fold/Unfold Line"
msgstr "Fold Line"
@@ -6729,6 +6809,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Skalér Valgte"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6747,32 +6832,37 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Skift/Toggle Breakpoint"
+msgid "Find Previous"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Filtrer filer..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "Gå Til Næste Trin"
+msgid "Toggle Bookmark"
+msgstr "Skift/Toggle Breakpoint"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "Skift/Toggle Breakpoint"
+msgid "Go to Next Bookmark"
+msgstr "Gå Til Næste Trin"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Skift/Toggle Breakpoint"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Filtrer filer..."
+msgid "Remove All Bookmarks"
+msgstr "Fjern Alt"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6785,9 +6875,24 @@ msgid "Go to Line..."
msgstr "GÃ¥ til linje"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Skift/Toggle Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Gå Til Næste Trin"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Skift/Toggle Breakpoint"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -7028,8 +7133,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Ændret Lokalfilter"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7083,9 +7189,8 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Select Mode (Q)"
-msgstr "Vælg Mode (Q)\n"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7095,31 +7200,10 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap Mode (%s)"
-msgstr "Vælg Mode (Q)\n"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr ""
@@ -7160,22 +7244,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Vælg værktøj"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -7230,8 +7298,9 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
-msgstr ""
+#, fuzzy
+msgid "Settings..."
+msgstr "Tester"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7539,10 +7608,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7631,11 +7696,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7759,8 +7824,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8076,6 +8141,10 @@ msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Tilføj punkt"
@@ -8165,6 +8234,11 @@ msgid "Duplicate Nodes"
msgstr "Dublikér nøgle(r)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Indsæt Node"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Vælg Node"
@@ -8174,10 +8248,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -8192,6 +8262,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Opret Mappe"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Opret Mappe"
@@ -8556,7 +8631,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8565,7 +8640,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8729,6 +8804,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8754,7 +8833,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8763,7 +8842,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8772,14 +8851,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8824,6 +8903,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9039,6 +9125,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Organiser Eksport Skabeloner"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9191,6 +9281,15 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "Projekt"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "Kan ikke åbne projekt"
@@ -9264,8 +9363,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9285,8 +9384,9 @@ msgid "Project Manager"
msgstr "Projektleder"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "Projekt"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9310,10 +9410,6 @@ msgid "Templates"
msgstr "Skabeloner"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9657,6 +9753,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9709,14 +9809,6 @@ msgstr "Vælg Virtual Method"
msgid "Select Method"
msgstr "Vælg Method"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10017,6 +10109,11 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Ændre Argument navn"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10146,19 +10243,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10256,6 +10353,10 @@ msgid "Error loading script from %s"
msgstr "Fejl ved load af script fra %s"
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10455,6 +10556,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Editor Indstillinger"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10880,10 +10985,32 @@ msgid "Set Variable Type"
msgstr "Sæt Variabel Type"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr ""
+"Ugyldigt navn. Det må ikke være i konflikt med eksisterende built-in type "
+"navn."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Opret Ny %s"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Variable:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Opret Ny %s"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Opret Poly"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Navnet er ikke et gyldigt id:"
@@ -11073,10 +11200,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Indsæt Node"
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "Medlemmer"
@@ -11890,22 +12013,6 @@ msgstr ""
"den kan opnå en størrelse. Ellers gør den til en RenderTarget og tildel dens "
"indre textur til en node så den kan vises."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Fejl under initialisering af FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Ukendt skrifttypeformat."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Error loading skrifttype."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Ugyldig skriftstørrelse."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11941,6 +12048,41 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Kan ikke skrive til file_type_cache.cch. Gemmer ikke fil type cache!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "Kan ikke navigere til '%s' da det ikke blev fundet i filsystemet!"
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "Fejl - kunne ikke oprette script i filsystem."
+
+#, fuzzy
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Vælg Mode (Q)\n"
+
+#, fuzzy
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Vælg Mode (Q)\n"
+
+#~ msgid "Tool Select"
+#~ msgstr "Vælg værktøj"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Fejl under initialisering af FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Ukendt skrifttypeformat."
+
+#~ msgid "Error loading font."
+#~ msgstr "Error loading skrifttype."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Ugyldig skriftstørrelse."
+
#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "Forrige fane"
@@ -11973,10 +12115,6 @@ msgstr ""
#~ msgstr "Opret Abonnement"
#, fuzzy
-#~ msgid "Build Project"
-#~ msgstr "Projekt"
-
-#, fuzzy
#~ msgid "View log"
#~ msgstr "Vis filer"
diff --git a/editor/translations/de.po b/editor/translations/de.po
index 0816cf1a85..bc00839d04 100644
--- a/editor/translations/de.po
+++ b/editor/translations/de.po
@@ -2,7 +2,7 @@
# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
-# Alexander Mahr <alex.mahr@gmail.com>, 2016.
+# Alexander Mahr <alex.mahr@gmail.com>, 2016, 2019.
# Andreas Esau <andreasesau@gmail.com>, 2016.
# Andreas Haas <liu.gam3@gmail.com>, 2016.
# Andreas Hirschauer <andreas@hirschauer-it.de>, 2016.
@@ -13,12 +13,12 @@
# Eurocloud KnowHow <tobias.kloy@werde-volunteer.info>, 2017.
# HugeGameArt <hugegameartgd@gmail.com>, 2018.
# hyperglow <greensoma@web.de>, 2016.
-# Jan Groß <jan@grossit.de>, 2016.
+# Jan Groß <jan@grossit.de>, 2016, 2019.
# Kim <github@aggsol.de>, 2017.
# Metin Celik <metincelik88@gmail.com>, 2018.
# Neicul <neicul@gmx.de>, 2018.
# nimradium <nimra242001@gmail.com>, 2018.
-# Oliver Ruehl <oliver@ruehldesign.co>, 2016-2017.
+# Oliver Ruehl <oliver@ruehldesign.co>, 2016-2017, 2019.
# Paul-Vincent Roll <paviro@me.com>, 2016.
# Peter Friedland <peter_friedland@gmx.de>, 2016.
# No need for a name <endoplasmatik@gmx.net>, 2016.
@@ -44,12 +44,14 @@
# datenbauer <d-vaupel@web.de>, 2019.
# Alexander Hausmann <alexander-hausmann+weblate@posteo.de>, 2019.
# Nicolas Mohr <81moni1bif@hft-stuttgart.de>, 2019.
+# Linux User <no-ads@mail.de>, 2019.
+# David May <wasser@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-21 11:06+0000\n"
-"Last-Translator: Nicolas Mohr <81moni1bif@hft-stuttgart.de>\n"
+"PO-Revision-Date: 2019-08-18 10:23+0000\n"
+"Last-Translator: Linux User <no-ads@mail.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/godot-engine/"
"godot/de/>\n"
"Language: de\n"
@@ -57,7 +59,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.8\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -101,7 +103,6 @@ msgid "On call to '%s':"
msgstr "Im Aufruf von ‚%s‘:"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Kostenlos"
@@ -170,29 +171,24 @@ msgid "Anim Change Call"
msgstr "Aufruf ändern"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Schlüsselbildzeit ändern"
+msgstr "Anim-Multi-Change Schlüsselbildzeit"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Übergang bearbeiten"
+msgstr "Anim-Multi-Change Übergang"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Transformation bearbeiten"
+msgstr "Anim-Multi-Change Transform"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Schlüsselbildwert ändern"
+msgstr "Anim-Multi-Change Schlüsselbildwert"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "Aufruf ändern"
+msgstr "Anim-Multi-Change Methodenaufruf"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -577,7 +573,7 @@ msgstr "Auswahl duplizieren"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr "Transponierte duplizieren"
+msgstr "Umgesetztes duplizieren"
#: editor/animation_track_editor.cpp
msgid "Delete Selection"
@@ -697,16 +693,18 @@ msgid "Line Number:"
msgstr "Zeilennummer:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "%d Übereinstimmung(en) gefunden."
+msgid "Replaced %d occurrence(s)."
+msgstr "Suchbegriff wurde %d mal ersetzt."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Keine Übereinstimmungen"
+#, fuzzy
+msgid "%d match."
+msgstr "%d Übereinstimmung(en) gefunden."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Suchbegriff wurde %d mal ersetzt."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "%d Übereinstimmung(en) gefunden."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -857,7 +855,7 @@ msgstr "Verbinden"
#: editor/connections_dialog.cpp
msgid "Signal:"
-msgstr "Signal:"
+msgstr "Signale:"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
@@ -865,11 +863,11 @@ msgstr "Verbinde ‚%s‘ mit ‚%s‘"
#: editor/connections_dialog.cpp
msgid "Disconnect '%s' from '%s'"
-msgstr "'%s' von '%s' trennen"
+msgstr "Trenne '%s' von '%s'"
#: editor/connections_dialog.cpp
msgid "Disconnect all from signal: '%s'"
-msgstr "Alle Verbindungen des Signal trennen: ‚%s‘"
+msgstr "Alle Verbindungen des Signals trennen: ‚%s‘"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -933,8 +931,7 @@ msgstr "Favoriten:"
msgid "Recent:"
msgstr "Kürzlich:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1037,7 +1034,7 @@ msgstr ""
"funktionieren.\n"
"Trotzdem entfernen? (Kann nicht rückgängig gemacht werden)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Kann nicht entfernt werden:"
@@ -1074,7 +1071,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr "Abhängigkeiten aufzeigen"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Unbenutzte Dateien ansehen"
@@ -1163,14 +1160,16 @@ msgid "License"
msgstr "Lizenz"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Drittpartei-Lizenz"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Die Godot-Engine baut auf vielen freien und quelloffenen Bibliotheken von "
@@ -1192,7 +1191,8 @@ msgid "Licenses"
msgstr "Lizenzen"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Fehler beim Öffnen der Paketdatei, kein ZIP-Format."
#: editor/editor_asset_installer.cpp
@@ -1686,12 +1686,11 @@ msgid "New"
msgstr "Neu"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Import"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Exportieren"
@@ -1828,30 +1827,26 @@ msgid "Move Favorite Down"
msgstr "Favorit nach unten schieben"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Gehe zu übergeordnetem Ordner."
+msgstr "Gehe zum vorherigen Ordner."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Gehe zu übergeordnetem Ordner."
+msgstr "Gehe zum nächsten Ordner."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "Gehe zu übergeordnetem Ordner."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Dateien suchen"
+msgstr "Dateien neu lesen."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "Gegenwärtigen Ordner (de)favorisieren."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
msgstr "Versteckte Dateien ein- oder ausblenden."
@@ -2094,6 +2089,11 @@ msgstr "Löschen"
msgid "Clear Output"
msgstr "Ausgabe löschen"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "Fenster"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Projekt-Export ist fehlgeschlagen mit Fehlercode %d."
@@ -2421,6 +2421,15 @@ msgid "Pick a Main Scene"
msgstr "Wähle eine Hauptszene"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Szene schließen"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Szene schließen"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Erweiterung lässt sich nicht aktivieren: ‚%‘ Parsen der Konfiguration "
@@ -2540,6 +2549,11 @@ msgstr "Diese Szene abspielen"
msgid "Close Tab"
msgstr "Tab schließen"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Tab schließen"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Andere Tabs schließen"
@@ -2624,6 +2638,10 @@ msgstr "Neue geerbte Szene..."
msgid "Open Scene..."
msgstr "Szene öffnen..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Zuletzt benutzte Szenen"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Szene speichern"
@@ -2633,14 +2651,6 @@ msgid "Save All Scenes"
msgstr "Alle Szenen speichern"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Szene schließen"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Zuletzt benutzte Szenen"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Umwandeln zu..."
@@ -2670,25 +2680,36 @@ msgstr "Szene zurücksetzen"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Sonstiges Projekt oder szenenübergreifende Werkzeuge."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Projekt"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Projekteinstellungen"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Werkzeuge"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr "Exportieren..."
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Android-Build-Vorlage installieren"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Projektdatenordner öffnen"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Werkzeuge"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Android-Build-Vorlage installieren"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Unbenutzte Dateien ansehen"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2787,12 +2808,13 @@ msgstr ""
"Sollte dies beim Abspielen auf externen Geräten genutzt werden, ist es am "
"effizientesten das Netzwerk-Dateisystem zu nutzen."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Editor"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Editoreinstellungen"
#: editor/editor_node.cpp
@@ -2829,14 +2851,16 @@ msgid "Open Editor Settings Folder"
msgstr "Editoreinstellungenordner öffnen"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "Editorfunktionen verwalten"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Verwalte Exportvorlagen"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Hilfe"
@@ -2844,12 +2868,13 @@ msgstr "Hilfe"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Suchen"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Internetdokumentation"
@@ -2863,7 +2888,7 @@ msgstr "Problem-Melder"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
-msgstr "Gemeinschaft"
+msgstr "Community (Gemeinschaft)"
#: editor/editor_node.cpp
msgid "About"
@@ -3130,9 +3155,8 @@ msgid "Calls"
msgstr "Aufrufe"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Thema bearbeiten"
+msgstr "Text bearbeiten:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3306,7 +3330,8 @@ msgid "Import From Node:"
msgstr "Aus Node importieren:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Erneut herunterladen"
#: editor/export_template_manager.cpp
@@ -3323,6 +3348,10 @@ msgid "Download"
msgstr "Herunterladen"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Fehlend)"
@@ -3386,12 +3415,10 @@ msgid "No response."
msgstr "Keine Antwort."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Anfrage fehlgeschlagen."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Weiterleitungsschleife."
@@ -3405,15 +3432,22 @@ msgid "Download Complete."
msgstr "Download abgeschlossen."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Kann Motiv nicht speichern in Datei:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Template-Installation fehlgeschlagen. Des problematische Template-Archiv "
"befindet sich hier: ‚%s‘."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Fehler beim Abrufen der URL: "
#: editor/export_template_manager.cpp
@@ -3498,23 +3532,11 @@ msgstr "Lade Template herunter"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Mirror aus Liste auswählen: (Umsch-Klick: In Browser öffnen)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Die Datei 'file_type_cache.cch' konnte nicht zum schreiben geöffnet werden. "
-"Der Dateityp-Cache wird nicht gespeichert!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Favoriten"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"Kann nicht zu '%s' navigierien, da es sich nicht im Dateisystem gefunden "
-"wurde!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Status: Dateiimport fehlgeschlagen. Manuelle Reparatur und Neuimport nötig."
@@ -3548,14 +3570,14 @@ msgid "Provided name contains invalid characters."
msgstr "Angegebener Name enthält ungültige Zeichen."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Name enthält ungültige Zeichen."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Es existiert bereits eine Datei oder ein Ordner mit diesem Namen."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Name enthält ungültige Zeichen."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Benenne Datei um:"
@@ -3611,6 +3633,11 @@ msgstr "Duplizieren..."
msgid "Move To..."
msgstr "Verschiebe zu..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Neue Szene"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Neues Skript..."
@@ -3678,6 +3705,11 @@ msgstr ""
msgid "Overwrite"
msgstr "Überschreiben"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Von Szene erstellen"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Erstelle Skript"
@@ -3740,6 +3772,14 @@ msgid "Search complete"
msgstr "Suche abgeschlossen"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Zu Gruppe hinzufügen"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Aus Gruppe entfernen"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Gruppenname existiert bereits."
@@ -3747,12 +3787,23 @@ msgstr "Gruppenname existiert bereits."
msgid "Invalid group name."
msgstr "Ungültiger Gruppenname."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Gruppen verwalten"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Lösche Bildergruppe"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Gruppen"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Nodes nicht in der Gruppe"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3765,12 +3816,13 @@ msgid "Nodes in Group"
msgstr "Nodes in der Gruppe"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Zu Gruppe hinzufügen"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Aus Gruppe entfernen"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Skripteditor"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3980,7 +4032,8 @@ msgid "MultiNode Set"
msgstr "MultiNode setzen"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Node auswählen um Signale und Gruppen zu bearbeiten."
#: editor/plugin_config_dialog.cpp
@@ -4336,7 +4389,7 @@ msgstr "Animation umbenennen"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Next Changed"
-msgstr "Überblende nächste Änderung"
+msgstr "Blende über in nächste Geänderte"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Blend Time"
@@ -4534,7 +4587,7 @@ msgstr "Am Ende"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr "Fortlaufend"
+msgstr "Reisen"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
@@ -4665,11 +4718,11 @@ msgstr "Eingang hinzufügen"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Clear Auto-Advance"
-msgstr "Lösche Auto-Fortschritt"
+msgstr "Stoppe automatischen Vorsprung"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Set Auto-Advance"
-msgstr "Setze Auto-Fortschritt"
+msgstr "Starte automatisches Weitergehen"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Delete Input"
@@ -4740,10 +4793,6 @@ msgid "View Files"
msgstr "Dateien anzeigen"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Kann Hostnamen nicht auflösen:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Verbindungsfehler, bitte erneut versuchen."
@@ -4756,14 +4805,47 @@ msgid "No response from host:"
msgstr "Keine Antwort von Host:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Kann Hostnamen nicht auflösen:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Anfrage fehlgeschlagen: Rückgabewert:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Anfrage fehlgeschlagen."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Kann Motiv nicht speichern in Datei:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Anfrage fehlgeschlagen, zu viele Weiterleitungen"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Weiterleitungsschleife."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Anfrage fehlgeschlagen: Rückgabewert:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Zeit"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Falsche Download-Prüfsumme, Datei könnte manipuliert worden sein."
@@ -4804,9 +4886,8 @@ msgid "Idle"
msgstr "Leerlauf"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "Installieren"
+msgstr "Installieren..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -4841,8 +4922,13 @@ msgid "All"
msgstr "Alle"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Neuimport..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Erweiterungen"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4850,9 +4936,8 @@ msgid "Sort:"
msgstr "Sortiere:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Reverse sorting."
-msgstr "Frage an..."
+msgstr "Sortierung umkehren."
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
@@ -4864,7 +4949,8 @@ msgid "Site:"
msgstr "Seite:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Stabilität..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4876,6 +4962,11 @@ msgid "Testing"
msgstr "Testphase"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Lade..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Nutzerinhalte als ZIP-Datei"
@@ -4934,37 +5025,30 @@ msgid "Rotation Step:"
msgstr "Rotationsabstand:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Vertical Guide"
msgstr "Vertikale Hilfslinie verschieben"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Vertical Guide"
-msgstr "Neue vertikale Hilfslinie erstellen"
+msgstr "Vertikale Hilfslinie erstellen"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Vertical Guide"
msgstr "Vertikale Hilfslinie löschen"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Horizontal Guide"
msgstr "Horizontale Hilfslinie verschieben"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal Guide"
-msgstr "Neue horizontale Hilfslinie erstellen"
+msgstr "Horizontale Hilfslinie erstellen"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Horizontal Guide"
msgstr "Horizontale Hilfslinie löschen"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal and Vertical Guides"
msgstr "Neue horizontale und vertikale Hilfslinien erstellen"
@@ -5049,6 +5133,11 @@ msgid "Paste Pose"
msgstr "Pose einfügen"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Knochen löschen"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Erstelle eigenständige(n) Knochen aus Node(s)"
@@ -5079,6 +5168,7 @@ msgid "Zoom Reset"
msgstr "Zoom Zurücksetzen"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Auswahlmodus"
@@ -5101,14 +5191,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+Rechtsklick: Listenauswahl nach Tiefe"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Bewegungsmodus"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Rotationsmodus"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Skalierungsmodus"
@@ -5135,6 +5228,7 @@ msgid "Toggle snapping."
msgstr "Einrasten umschalten."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Einrasten aktivieren"
@@ -5151,11 +5245,6 @@ msgid "Use Rotation Snap"
msgstr "Rotationsraster benutzen"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Einrasten konfigurieren..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Relatives Einrasten benutzen"
@@ -5168,6 +5257,11 @@ msgid "Smart Snapping"
msgstr "Intelligentes Einrasten"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Einrasten konfigurieren..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "An Elternobjekt einrasten"
@@ -5210,7 +5304,7 @@ msgstr "Verhindert das Auswählen von Unterobjekten dieses Nodes."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Restores the object's children's ability to be selected."
-msgstr "Macht Unterobjekte dieses Objekts wieder auswählbar."
+msgstr "Stellt die Auswählbarkeit aller Unterobjekte wieder her."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Skeleton Options"
@@ -5383,16 +5477,6 @@ msgstr "Wähle Griff"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Fehler beim Laden des Bilds:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Keine Pixel mit einer Transparenz > 128 im Bild..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Emissionsmaske laden"
@@ -5705,14 +5789,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Quelle für Oberfläche ist ungültig (keine Faces)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "Elternelement hat keine soliden Faces zu besetzen."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Bereich konnte nicht abgebildet werden."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Quell-Mesh auswählen:"
@@ -5798,20 +5874,27 @@ msgid "Generation Time (sec):"
msgstr "Erzeugungszeit (s):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Flächen enthalten keinen Bereich!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Keine Flächen!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Knoten enthält keine Geometrie (Flächen)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Knoten enthält keine Geometrie."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Knoten enthält keine Geometrie (Flächen)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Knoten enthält keine Geometrie."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6144,7 +6227,6 @@ msgid "Grid Settings"
msgstr "Gittereinstellungen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Einrasten"
@@ -6251,12 +6333,9 @@ msgid "Error writing TextFile:"
msgstr "Fehler beim Schreiben von Textdatei:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Fehler: Datei konnte nicht geladen werden."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "Fehler: Datei konnte nicht geladen werden."
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "Konnte Kachel nicht finden:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6279,7 +6358,8 @@ msgid "Error Importing"
msgstr "Fehler beim Importieren"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Neue Textdatei..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6360,6 +6440,11 @@ msgid "Open..."
msgstr "Öffnen..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Skript öffnen"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Alle speichern"
@@ -6397,13 +6482,13 @@ msgid "Save Theme"
msgstr "Motiv speichern"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Dokumentation schließen"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Alle schließen"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Dokumentation schließen"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Ausführen"
@@ -6492,6 +6577,11 @@ msgstr "Debugger"
msgid "Search Results"
msgstr "Suchergebnisse"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Verlauf leeren"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "Verbindungen mit Methode:"
@@ -6559,6 +6649,7 @@ msgid "Syntax Highlighter"
msgstr "Syntaxhervorhebung"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr "Springe zu"
@@ -6593,22 +6684,6 @@ msgid "Toggle Comment"
msgstr "Kommentar umschalten"
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr "Lesezeichen umschalten"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "Springe zum nächsten Lesezeichen"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr "Springe zum vorigen Lesezeichen"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "Alle Lesezeichen entfernen"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Zeile ein/aufklappen"
@@ -6629,6 +6704,11 @@ msgid "Complete Symbol"
msgstr "Symbol vervollständigen"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Auswahl skalieren"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Kürze Leerraum am Zeilenende"
@@ -6645,29 +6725,32 @@ msgid "Auto Indent"
msgstr "Automatische Einrückung"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Haltepunkt umschalten"
+msgid "Find Previous"
+msgstr "Finde Vorheriges"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Lösche alle Haltepunkte"
+msgid "Find in Files..."
+msgstr "In Dateien suchen..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Springe zum nächsten Haltepunkt"
+msgid "Contextual Help"
+msgstr "Kontexthilfe"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Springe zum vorigen Haltepunkt"
+msgid "Toggle Bookmark"
+msgstr "Lesezeichen umschalten"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Finde Vorheriges"
+msgid "Go to Next Bookmark"
+msgstr "Springe zum nächsten Lesezeichen"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "In Dateien suchen..."
+msgid "Go to Previous Bookmark"
+msgstr "Springe zum vorigen Lesezeichen"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Alle Lesezeichen entfernen"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6678,8 +6761,21 @@ msgid "Go to Line..."
msgstr "Springe zu Zeile..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Kontexthilfe"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Haltepunkt umschalten"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Lösche alle Haltepunkte"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Springe zum nächsten Haltepunkt"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Springe zum vorigen Haltepunkt"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -6860,14 +6956,12 @@ msgid "Rear"
msgstr "Hinten"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Transform with View"
-msgstr "Mit Sicht ausrichten"
+msgstr "Transform auf Sicht ausrichten"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Rotation with View"
-msgstr "Auswahl auf Ansicht ausrichten"
+msgstr "Rotation auf Sicht ausrichten"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -6923,8 +7017,9 @@ msgid "Audio Listener"
msgstr "Audiosenke"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Dopplereffekt aktivieren"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Filtern aktivieren"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6979,8 +7074,8 @@ msgid "Snap Nodes To Floor"
msgstr "Nodes am Boden einrasten"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Auswahlmodus (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6993,30 +7088,11 @@ msgstr ""
"Alt+RMT: Tiefenauswahl"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Bewegungsmodus (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Rotationsmodus (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Skalierungsmodus (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Lokale Koordinaten"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Lokalkoordinatenmodus (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Einrastmodus (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Sicht von unten"
@@ -7057,22 +7133,6 @@ msgid "Focus Selection"
msgstr "Auswahl fokussieren"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Werkzeugauswahl"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Werkzeug Verschieben"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Werkzeug Drehen"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Werkzeug Skalieren"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Freie Kamera umschalten"
@@ -7127,7 +7187,8 @@ msgstr "Zeige Gitter"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Einstellungen"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7422,10 +7483,6 @@ msgid "TextureRegion"
msgstr "Texturbereich"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "Kann Motiv nicht speichern in Datei:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Alle Elemente hinzufügen"
@@ -7503,18 +7560,20 @@ msgstr "Markiertes Element der Auswahl"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Named Sep."
-msgstr "Ben. Trenner"
+msgstr "Ben. Trenner."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Submenu"
msgstr "Untermenü"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+#, fuzzy
+msgid "Subitem 1"
msgstr "Element 1"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+#, fuzzy
+msgid "Subitem 2"
msgstr "Element 2"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7631,9 +7690,10 @@ msgid "Paint Tile"
msgstr "Kachel zeichnen"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Umsch+RMT: Linie zeichnen\n"
"Umsch+Strg+RMT: Rechteck einfärben"
@@ -7914,7 +7974,7 @@ msgstr "Kachelpriorität bearbeiten"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Z Index"
-msgstr "Kachel-Z-Index bearbeiten"
+msgstr "bearbeite Kachel Z Index"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Collision Polygon"
@@ -7933,6 +7993,10 @@ msgid "TileSet"
msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(Nur GLES3)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr "Eingang hinzufügen +"
@@ -8009,6 +8073,11 @@ msgid "Duplicate Nodes"
msgstr "Nodes duplizieren"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Nodes einfügen"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "Nodes löschen"
@@ -8017,10 +8086,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "Visual-Shader-Eingabetyp geändert"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "Vertex"
@@ -8033,6 +8098,11 @@ msgid "Light"
msgstr "Licht"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Shader-Node erzeugen"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr "Shader-Node erzeugen"
@@ -8105,21 +8175,20 @@ msgid "Color uniform."
msgstr "Farb-Uniform."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the boolean result of the %s comparison between two parameters."
-msgstr "Gibt die inverse Quadratwurzel des Parameters zurück."
+msgstr "Gibt den Wahrheitswert des %s-Vergleiches der beiden Parameter zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Equal (==)"
-msgstr ""
+msgstr "Gleichheit (==)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than (>)"
-msgstr ""
+msgstr "Größer als (>)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than or Equal (>=)"
-msgstr ""
+msgstr "Größergleich (>=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8134,24 +8203,28 @@ msgid ""
"Returns the boolean result of the comparison between INF and a scalar "
"parameter."
msgstr ""
+"Gibt den Wahrheitswert zwischen dem Vergleich von Unendlich und einem "
+"skalaren Parameter zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between NaN and a scalar "
"parameter."
msgstr ""
+"Gibt den Wahrheitswert zwischen dem Vergleich von NaN und einem skalaren "
+"Parameter zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
-msgstr ""
+msgstr "Kleiner als (<)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than or Equal (<=)"
-msgstr ""
+msgstr "Kleiner gleich (<=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Not Equal (!=)"
-msgstr ""
+msgstr "Ungleich (!=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8161,15 +8234,16 @@ msgstr ""
"oder falsch ist."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the boolean result of the comparison between two parameters."
-msgstr "Gibt den Tangens des Parameters zurück."
+msgstr "Gibt den Wahrheitswert des Vergleiches zweier Parameter zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF (or NaN) and a "
"scalar parameter."
msgstr ""
+"Gibt den Wahrheitswert zwischen dem Vergleich von Unendlich (oder NaN) und "
+"einem skalaren Parameter zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean constant."
@@ -8260,20 +8334,16 @@ msgid "Returns the arc-cosine of the parameter."
msgstr "Gibt den Arkuskosinus des Parameters zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr ""
-"(Nur GLES3) Gibt den inversen hyperbolischen Kosinus des Parameters zurück."
+msgstr "Gibt den inversen hyperbolischen Kosinus des Parameters zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-sine of the parameter."
msgstr "Gibt den Arkussinus des Parameters zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the inverse hyperbolic sine of the parameter."
-msgstr ""
-"(Nur GLES3) Gibt den inversen hyperbolischen Sinus des Parameters zurück."
+msgstr "Gibt den inversen hyperbolischen Sinus des Parameters zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameter."
@@ -8284,10 +8354,8 @@ msgid "Returns the arc-tangent of the parameters."
msgstr "Gibt den Arkuskosinus2 der Parameter zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the inverse hyperbolic tangent of the parameter."
-msgstr ""
-"(Nur GLES3) Gibt den inversen hyperbolischen Tangens des Parameters zurück."
+msgstr "Gibt den inversen hyperbolischen Tangens des Parameters zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8303,9 +8371,8 @@ msgid "Returns the cosine of the parameter."
msgstr "Gibt den Kosinus des Parameters zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr "(Nur GLES3) Gibt den hyperbolischen Kosinus des Parameters zurück."
+msgstr "Gibt den hyperbolischen Kosinus des Parameters zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
@@ -8373,14 +8440,12 @@ msgid "1.0 / scalar"
msgstr "1.0 / Skalar"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Finds the nearest integer to the parameter."
-msgstr "(nur GLES3) Gibt die nächste Ganzzahl vom Parameter zurück."
+msgstr "Gibt die nächste Ganzzahl vom Parameter zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Finds the nearest even integer to the parameter."
-msgstr "(nur GLES3) Gibt die nächste gerade Ganzzahl vom Parameter zurück."
+msgstr "Gibt die nächste gerade Ganzzahl vom Parameter zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
@@ -8395,19 +8460,19 @@ msgid "Returns the sine of the parameter."
msgstr "Gibt den Sinus des Parameters zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the hyperbolic sine of the parameter."
-msgstr "(nur GLES3) Gibt den hyperbolischen Sinus des Parameters zurück."
+msgstr "Gibt den hyperbolischen Sinus des Parameters zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the square root of the parameter."
msgstr "Gibt die Quadratwurzel des Parameters zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8418,10 +8483,11 @@ msgstr ""
"Wert zwischen 0.0 und 1.0 zurück gegeben."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Schrittfunktion ( Skalar(Kante), Skalar(x) ).\n"
"\n"
@@ -8432,14 +8498,12 @@ msgid "Returns the tangent of the parameter."
msgstr "Gibt den Tangens des Parameters zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the hyperbolic tangent of the parameter."
-msgstr "(nur GLES3) Gibt den hyperbolischen Tangens des Parameters zurück."
+msgstr "Gibt den hyperbolischen Tangens des Parameters zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Finds the truncated value of the parameter."
-msgstr "(Nur GLES3) Gibt den abgeschnittenen Wert des Parameters zurück."
+msgstr "Gibt den abgeschnittenen Wert des Parameters zurück."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds scalar to scalar."
@@ -8478,26 +8542,22 @@ msgid "Perform the texture lookup."
msgstr "Texturfinden ausführen."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Cubic texture uniform lookup."
-msgstr "Kubisches Textur-Uniform."
+msgstr "Kubisches Textur-Uniform-Lookup."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "2D texture uniform lookup."
-msgstr "2D-Textur-Uniform."
+msgstr "2D-Textur-Uniform-Lookup."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "2D texture uniform lookup with triplanar."
-msgstr "2D-Textur-Uniform."
+msgstr "2D-Textur-Uniform-Lookup mit triplanar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform function."
msgstr "Transformierungsfunktion."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Calculate the outer product of a pair of vectors.\n"
"\n"
@@ -8507,7 +8567,7 @@ msgid ""
"whose number of rows is the number of components in 'c' and whose number of "
"columns is the number of components in 'r'."
msgstr ""
-"(nur GLES3) Berechnet das äußere Produkt zweier Vektoren.\n"
+"Berechnet das äußere Produkt zweier Vektoren.\n"
"\n"
"Führt eine Matrixmultiplikation des ersten Parameters ‚c‘ (interpretiert als "
"Spaltenvektor = Matrix aus einer Spalte) mit dem zweiten Parameter "
@@ -8524,19 +8584,16 @@ msgid "Decomposes transform to four vectors."
msgstr "Extrahiert vier Vektoren aus Transform."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Calculates the determinant of a transform."
-msgstr "(nur GLES3) Berechnet die Determinante eines Transforms."
+msgstr "Berechnet die Determinante eines Transforms."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Calculates the inverse of a transform."
-msgstr "(nur GLES3) Invertiert ein Transform."
+msgstr "Invertiert ein Transform."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Calculates the transpose of a transform."
-msgstr "(nur GLES3) Transponiert ein Transform."
+msgstr "Transponiert ein Transform."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies transform by transform."
@@ -8583,18 +8640,16 @@ msgid "Calculates the dot product of two vectors."
msgstr "Berechnet das Skalarprodukt aus zwei Vektoren."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Returns the vector that points in the same direction as a reference vector. "
"The function has three vector parameters : N, the vector to orient, I, the "
"incident vector, and Nref, the reference vector. If the dot product of I and "
"Nref is smaller than zero the return value is N. Otherwise -N is returned."
msgstr ""
-"Gibt einen Vektor zurück der in die gleiche Richtung wie ein Referenzvektor "
-"zeigt. Die Funktion benötigt drei Vektorparameter: N, der auszurichtende "
-"Vektor, E, der Einfallsvektor und Nref, der Referenzvektor. Ist das "
-"Skalarprodukt aus E und Nref kleiner als null wird N zurückgegeben, "
-"ansonsten -N."
+"Gibt einen Vektor mit möglicherweise geändertem Vorzeichen zurück. Die "
+"Funktion benötigt drei Vektorparameter: N, der auszurichtende Vektor, E, der "
+"Einfallsvektor und Nref, der Referenzvektor. Ist das Skalarprodukt aus E und "
+"Nref kleiner als null wird N zurückgegeben, ansonsten -N."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the length of a vector."
@@ -8605,6 +8660,11 @@ msgid "Linear interpolation between two vectors."
msgstr "Lineare Interpolation zwischen zwei Vektoren."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Lineare Interpolation zwischen zwei Vektoren."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr "Berechnet den normierten Vektor."
@@ -8617,24 +8677,23 @@ msgid "1.0 / vector"
msgstr "1.0 / Vektor"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Returns the vector that points in the direction of reflection ( a : incident "
"vector, b : normal vector )."
msgstr ""
-"Berechnet den Vektor der in die Richtung einer Reflektion zeigt (a: "
+"Gibt den Vektor zurück der in Richtung der Reflektion zeigt (a: "
"Einfallsvektor, b: Normalenvektor)."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the vector that points in the direction of refraction."
-msgstr "Berechnet den Vektor der in Richtung einer Brechung zeigt."
+msgstr "Gibt den Vektor zurück der in Richtung der Brechung zeigt."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8645,10 +8704,11 @@ msgstr ""
"interpolierter Wert zwischen 0.0 und 1.0 zurückgegeben."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8659,20 +8719,22 @@ msgstr ""
"interpolierter Wert zwischen 0.0 und 1.0 zurückgegeben."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Stufenfunktion ( Vektor(Kante), Vektor(x) ).\n"
"\n"
"Gibt 0.0 zurück falls ‚x‘ kleiner als ‚Kante‘, ansonsten 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Stufenfunktion ( Skalar(Kante), Vektor(x) ).\n"
"\n"
@@ -8727,70 +8789,67 @@ msgstr ""
"Eingänge müssen übergeben werden)."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "(Fragment/Light mode only) Scalar derivative function."
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
msgstr ""
-"(nur GLES3) (nur für Fragment-/Light-Modus) Skalare Ableitungsfunktion."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
+msgid "(Fragment/Light mode only) Scalar derivative function."
+msgstr "(nur für Fragment-/Light-Modus) Skalare Ableitungsfunktion."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Vector derivative function."
-msgstr ""
-"(nur GLES3) (nur für Fragment-/Light-Modus) Vektorielle Ableitungsfunktion."
+msgstr "(nur für Fragment-/Light-Modus) Vektorielle Ableitungsfunktion."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
"differencing."
msgstr ""
-"(nur GLES3) (nur für Fragment-/Light-Modus) (Vektor) Lokale differenzielle "
-"Ableitung in ‚x‘-Richtung."
+"(nur für Fragment-/Light-Modus) (Vektor) Lokale differenzielle Ableitung in "
+"‚x‘-Richtung."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
"differencing."
msgstr ""
-"(nur GLES3) (nur für Fragment-/Light-Modus) (Skalar) Lokale differenzielle "
-"Ableitung in ‚x‘-Richtung."
+"(nur für Fragment-/Light-Modus) (Skalar) Lokale differenzielle Ableitung in "
+"‚x‘-Richtung."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
"differencing."
msgstr ""
-"(nur GLES3) (nur für Fragment-/Light-Modus) (Vektor) Lokale differenzielle "
-"Ableitung in ‚y‘-Richtung."
+"(nur für Fragment-/Light-Modus) (Vektor) Lokale differenzielle Ableitung in "
+"‚y‘-Richtung."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
"differencing."
msgstr ""
-"(nur GLES3) (nur für Fragment-/Light-Modus) (Skalar) Lokale differenzielle "
-"Ableitung in ‚y‘-Richtung."
+"(nur für Fragment-/Light-Modus) (Skalar) Lokale differenzielle Ableitung in "
+"‚y‘-Richtung."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
-"(nur GLES3) (nur für Fragment-/Light-Modus) (Vektor) Summe der absoluten "
-"Ableitungen in ‚x‘- und ‚y‘-Richtung."
+"(nur für Fragment-/Light-Modus) (Vektor) Summe der absoluten Ableitungen in "
+"‚x‘- und ‚y‘-Richtung."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
-"(nur GLES3) (nur für Fragment-/Light-Modus) (Skalar) Summe der absoluten "
-"Ableitungen in ‚x‘- und ‚y‘-Richtung."
+"(nur für Fragment-/Light-Modus) (Skalar) Summe der absoluten Ableitungen in "
+"‚x‘- und ‚y‘-Richtung."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "VisualShader"
@@ -8942,7 +9001,7 @@ msgstr "Verschlüsselt (Schlüssel unten angeben)"
#: editor/project_export.cpp
msgid "Invalid Encryption Key (must be 64 characters long)"
-msgstr "Ungültiger Schlüssel (muss 64 Zeichen lang sein)"
+msgstr "Ungültiger Schlüssel für Verschlüsselung (muss 64 Zeichen lang sein)"
#: editor/project_export.cpp
msgid "Script Encryption Key (256-bits as hex):"
@@ -8965,6 +9024,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Export-Templates für diese Systeme fehlen:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Verwalte Exportvorlagen"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "Exportiere mit Debuginformationen"
@@ -9124,6 +9187,15 @@ msgid "Unnamed Project"
msgstr "Unbenanntes Projekt"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Existierendes Projekt importieren"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "Projekt in ‚%s‘ kann nicht geöffnet werden."
@@ -9222,12 +9294,13 @@ msgstr ""
"Inhalte des Projektordners werden nicht geändert."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
-"Alle fehlenden Projekte aus der Liste entfernen? (Dateisysteminhalte werden "
-"nicht geändert)"
+"%d Projekte aus der Liste entfernen?\n"
+"Inhalte der Projektordner werden nicht geändert."
#: editor/project_manager.cpp
msgid ""
@@ -9251,8 +9324,9 @@ msgid "Project Manager"
msgstr "Projektverwaltung"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Projektliste"
+#, fuzzy
+msgid "Projects"
+msgstr "Projekt"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9275,10 +9349,6 @@ msgid "Templates"
msgstr "Vorlagen"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Verlassen"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Jetzt Neustarten"
@@ -9425,7 +9495,7 @@ msgstr "Ereignis hinzufügen"
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr "Taste"
+msgstr "Taste, Knopf (Button)"
#: editor/project_settings_editor.cpp
msgid "Left Button."
@@ -9501,23 +9571,23 @@ msgstr "Übersetzung entfernen"
#: editor/project_settings_editor.cpp
msgid "Add Remapped Path"
-msgstr "Remap-Pfad hinzufügen"
+msgstr "Umgeleiteten Pfad hinzufügen"
#: editor/project_settings_editor.cpp
msgid "Resource Remap Add Remap"
-msgstr "Ressourcen-Remap hinzufügen"
+msgstr "Ressourcen-Umleitung hinzufügen"
#: editor/project_settings_editor.cpp
msgid "Change Resource Remap Language"
-msgstr "Ändere Zielsprache des Ressourcen-Remaps"
+msgstr "Ändere Zielsprache der Ressourcen-Umleitung"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap"
-msgstr "Ressourcen-Remap entfernen"
+msgstr "Ressourcen-Umleitung entfernen"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap Option"
-msgstr "Ressourcen-Remap-Option entfernen"
+msgstr "Ressourcen-Umleitungsoption entfernen"
#: editor/project_settings_editor.cpp
msgid "Changed Locale Filter"
@@ -9590,7 +9660,7 @@ msgstr "Ressourcen:"
#: editor/project_settings_editor.cpp
msgid "Remaps by Locale:"
-msgstr "Remaps nach Lokalisierung:"
+msgstr "Umleitungen nach Lokalisierung:"
#: editor/project_settings_editor.cpp
msgid "Locale"
@@ -9620,6 +9690,10 @@ msgstr "Sprachen:"
msgid "AutoLoad"
msgstr "Autoload"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Erweiterungen"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Null"
@@ -9672,15 +9746,6 @@ msgstr "Virtuelle Methode auswählen"
msgid "Select Method"
msgstr "Methode auswählen"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "Konnte PVRTC-Werkzeug nicht ausführen:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-"Umgewandeltes Bild kann mittels PVRTC-Werkzeug nicht zurück geladen werden:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "Stapelweise Umbenennung"
@@ -9978,6 +10043,11 @@ msgid "Remove Node(s)"
msgstr "Entferne Node(s)"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Ausgangsschnittstellenname ändern"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10022,9 +10092,8 @@ msgid "Extend Script"
msgstr "Skript erweitern"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
-msgstr "Node umhängen"
+msgstr "Node unter neues Node hängen"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -10099,24 +10168,27 @@ msgid "Node configuration warning:"
msgstr "Node-Konfigurationswarnung:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"Node hat Verbindungen und Gruppen.\n"
"Klicken um Signalverwaltung aufzurufen."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"Node hat Verbindungen.\n"
"Hier klicken zur Signalverwaltung."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"Node ist in Gruppe(n).\n"
@@ -10216,6 +10288,11 @@ msgid "Error loading script from %s"
msgstr "Fehler beim Laden des Skripts von %s"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Überschreiben"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "Nicht verfügbar"
@@ -10244,9 +10321,8 @@ msgid "Script is valid."
msgstr "Skript ist gültig."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr "Erlaubt: a-z, A-Z, 0-9 und _"
+msgstr "Erlaubt: a-z, A-Z, 0-9, _ und ."
#: editor/script_create_dialog.cpp
msgid "Built-in script (into scene file)."
@@ -10405,6 +10481,10 @@ msgid "Change Shortcut"
msgstr "Tastenkürzel ändern"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Editoreinstellungen"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Tastenkürzel"
@@ -10825,10 +10905,30 @@ msgid "Set Variable Type"
msgstr "Variablentyp festlegen"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Darf nicht mit existierenden eingebauten Typnamen übereinstimmen."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Neues Rechteck erstellen."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Variablen:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Neues Rechteck erstellen."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Neues Polygon erstellen."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Name ist kein gültiger Bezeichner:"
@@ -11018,10 +11118,6 @@ msgid "Cut Nodes"
msgstr "Nodes trennen"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Nodes einfügen"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "Mitglied bearbeiten"
@@ -11926,22 +12022,6 @@ msgstr ""
"Eigenschaft ‚Render Target‘ des Viewports aktiviert und seine Textur "
"irgendeinem Node zum Anzeigen zugewiesen werden."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Fehler beim initialisieren von FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Unbekanntes Schriftformat."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Fehler beim Laden der Schriftart."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Ungültige Schriftgröße."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Eingang"
@@ -11955,9 +12035,8 @@ msgid "Invalid source for shader."
msgstr "Ungültige Quelle für Shader."
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid comparison function for that type."
-msgstr "Ungültige Quelle für Shader."
+msgstr "Ungültige Vergleichsfunktion für diesen Typ."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
@@ -11975,6 +12054,110 @@ msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden."
msgid "Constants cannot be modified."
msgstr "Konstanten können nicht verändert werden."
+#~ msgid "No Matches"
+#~ msgstr "Keine Übereinstimmungen"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Die Datei 'file_type_cache.cch' konnte nicht zum schreiben geöffnet "
+#~ "werden. Der Dateityp-Cache wird nicht gespeichert!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "Kann nicht zu '%s' navigierien, da es sich nicht im Dateisystem gefunden "
+#~ "wurde!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Fehler beim Laden des Bilds:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Keine Pixel mit einer Transparenz > 128 im Bild..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Elternelement hat keine soliden Faces zu besetzen."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Bereich konnte nicht abgebildet werden."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Flächen enthalten keinen Bereich!"
+
+#~ msgid "No faces!"
+#~ msgstr "Keine Flächen!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Fehler: Datei konnte nicht geladen werden."
+
+#~ msgid "Error could not load file."
+#~ msgstr "Fehler: Datei konnte nicht geladen werden."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Dopplereffekt aktivieren"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Auswahlmodus (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Bewegungsmodus (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Rotationsmodus (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Skalierungsmodus (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Lokale Koordinaten"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Einrastmodus (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Werkzeugauswahl"
+
+#~ msgid "Tool Move"
+#~ msgstr "Werkzeug Verschieben"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Werkzeug Drehen"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Werkzeug Skalieren"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "Alle fehlenden Projekte aus der Liste entfernen? (Dateisysteminhalte "
+#~ "werden nicht geändert)"
+
+#~ msgid "Project List"
+#~ msgstr "Projektliste"
+
+#~ msgid "Exit"
+#~ msgstr "Verlassen"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "Konnte PVRTC-Werkzeug nicht ausführen:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr ""
+#~ "Umgewandeltes Bild kann mittels PVRTC-Werkzeug nicht zurück geladen "
+#~ "werden:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Fehler beim initialisieren von FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Unbekanntes Schriftformat."
+
+#~ msgid "Error loading font."
+#~ msgstr "Fehler beim Laden der Schriftart."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Ungültige Schriftgröße."
+
#~ msgid "Previous Folder"
#~ msgstr "Vorheriger Ordner"
@@ -12747,9 +12930,6 @@ msgstr "Konstanten können nicht verändert werden."
#~ msgid "Erase selection"
#~ msgstr "Lösche Auswahl"
-#~ msgid "Could not find tile:"
-#~ msgstr "Konnte Kachel nicht finden:"
-
#~ msgid "Item name or ID:"
#~ msgstr "Elementname oder ID:"
@@ -13017,9 +13197,6 @@ msgstr "Konstanten können nicht verändert werden."
#~ msgid "Info"
#~ msgstr "Info"
-#~ msgid "Re-Import..."
-#~ msgstr "Neuimport..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "Keine Bitmasken zu importieren!"
@@ -13412,9 +13589,6 @@ msgstr "Konstanten können nicht verändert werden."
#~ msgid "Stereo"
#~ msgstr "Stereo"
-#~ msgid "Window"
-#~ msgstr "Fenster"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Skaliere auf %s%%."
@@ -13644,9 +13818,6 @@ msgstr "Konstanten können nicht verändert werden."
#~ msgid "Add Image Group"
#~ msgstr "Füge Bildergruppe hinzu"
-#~ msgid "Delete Image Group"
-#~ msgstr "Lösche Bildergruppe"
-
#~ msgid "Project Export Settings"
#~ msgstr "Projektexporteinstellungen"
@@ -13732,9 +13903,6 @@ msgstr "Konstanten können nicht verändert werden."
#~ msgid "Export Project PCK"
#~ msgstr "Exportiere Projekt-PCK"
-#~ msgid "Export..."
-#~ msgstr "Exportieren..."
-
#~ msgid "Project Export"
#~ msgstr "Projekt exportieren"
diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po
index 9b3fdf7b02..ad007f96c5 100644
--- a/editor/translations/de_CH.po
+++ b/editor/translations/de_CH.po
@@ -60,7 +60,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr ""
@@ -662,15 +661,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -906,8 +905,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1001,7 +999,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -1038,7 +1036,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1130,14 +1128,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1154,7 +1152,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1652,12 +1650,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2070,6 +2067,10 @@ msgstr ""
msgid "Clear Output"
msgstr "Script hinzufügen"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2376,6 +2377,15 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Datei(en) öffnen"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2472,6 +2482,10 @@ msgstr "Szene starten"
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2558,6 +2572,10 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr ""
@@ -2568,14 +2586,6 @@ msgid "Save All Scenes"
msgstr "Neue Szene speichern als..."
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr ""
@@ -2605,17 +2615,23 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr "Verschiedene Projekte oder Szenenweite Werkzeuge."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
#, fuzzy
msgid "Project"
msgstr "Projektname:"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Projekteinstellungen"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Projekt exportieren"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
@@ -2623,8 +2639,12 @@ msgstr ""
msgid "Open Project Data Folder"
msgstr "Projekt exportieren"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2707,13 +2727,14 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
-msgstr ""
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
+msgstr "Connections editieren"
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2748,14 +2769,15 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
-msgstr ""
-
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+msgid "Manage Editor Features..."
msgstr ""
#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
+msgstr "Ungültige Bilder löschen"
+
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2763,12 +2785,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3218,7 +3241,7 @@ msgid "Import From Node:"
msgstr "Importiere von folgendem Node:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3235,6 +3258,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3297,12 +3324,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3316,14 +3341,18 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
#, fuzzy
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr "Szene kann nicht gespeichert werden."
#: editor/export_template_manager.cpp
@@ -3416,19 +3445,11 @@ msgstr "Ungültige Bilder löschen"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3464,11 +3485,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3535,6 +3556,11 @@ msgstr "Node(s) duplizieren"
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Neue Szene speichern als..."
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3601,6 +3627,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Node erstellen"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3664,6 +3695,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3672,12 +3711,22 @@ msgstr ""
msgid "Invalid group name."
msgstr "Projektname:"
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Neues Projekt erstellen"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Node(s) löschen"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3691,12 +3740,13 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
+#, fuzzy
+msgid "Group Editor"
+msgstr "Verzeichnis öffnen"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3907,7 +3957,7 @@ msgstr "MultiNode Set"
#: editor/node_dock.cpp
#, fuzzy
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr "Selektiere ein Node um deren Signale und Gruppen zu ändern."
#: editor/plugin_config_dialog.cpp
@@ -4700,10 +4750,6 @@ msgid "View Files"
msgstr "Datei(en) öffnen"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4717,14 +4763,42 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4802,8 +4876,12 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Importierte Projekte"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4824,7 +4902,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4836,6 +4914,11 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Connections editieren"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -5002,6 +5085,11 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "Spiele angepasste Szene"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Spiele angepasste Szene"
@@ -5031,6 +5119,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -5051,16 +5140,19 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Move Mode"
msgstr "Bild bewegen/einfügen"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Rotate Mode"
msgstr "Node erstellen"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "TimeScale-Node"
@@ -5085,6 +5177,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5101,11 +5194,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5118,6 +5206,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5334,16 +5427,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Emissions-Maske laden"
@@ -5667,14 +5750,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Oberflächen Quelle is invalid (kein Face)"
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5759,19 +5834,26 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Flächen enthalten keinen Bereich!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Keine Flächen!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Node enthält keine Geometrie (Flächen)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
+msgstr "Node enthält keine Geometrie (Flächen)."
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
msgstr "Node enthält keine Geometrie (Flächen)."
#: editor/plugins/particles_editor_plugin.cpp
@@ -6115,7 +6197,6 @@ msgid "Grid Settings"
msgstr "Projekteinstellungen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6222,12 +6303,9 @@ msgid "Error writing TextFile:"
msgstr "Szene kann nicht gespeichert werden."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr ""
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "Neues Projekt erstellen"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6255,8 +6333,9 @@ msgid "Error Importing"
msgstr "Szene kann nicht gespeichert werden."
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
-msgstr ""
+#, fuzzy
+msgid "New Text File..."
+msgstr "Datei(en) öffnen"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6341,6 +6420,11 @@ msgid "Open..."
msgstr "Öffnen"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Script hinzufügen"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6378,11 +6462,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6471,6 +6555,11 @@ msgstr ""
msgid "Search Results"
msgstr "Ungültige Bilder löschen"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Script hinzufügen"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6539,6 +6628,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6576,24 +6666,6 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Autoplay Umschalten"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Fold/Unfold Line"
msgstr "Bild einfügen"
@@ -6614,6 +6686,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Script hinzufügen"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6632,31 +6709,36 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr ""
+#, fuzzy
+msgid "Toggle Bookmark"
+msgstr "Autoplay Umschalten"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Remove All Bookmarks"
+msgstr "Ungültige Bilder löschen"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
msgstr ""
@@ -6665,7 +6747,20 @@ msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6909,8 +7004,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Typ ändern"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6963,9 +7059,8 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Select Mode (Q)"
-msgstr "Selektiere Node(s) zum Importieren aus"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6975,31 +7070,10 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap Mode (%s)"
-msgstr "Selektiere Node(s) zum Importieren aus"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr ""
@@ -7041,22 +7115,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -7111,8 +7169,9 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
-msgstr ""
+#, fuzzy
+msgid "Settings..."
+msgstr "Projekteinstellungen"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7420,10 +7479,6 @@ msgid "TextureRegion"
msgstr "2D-Textur"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7513,11 +7568,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7638,8 +7693,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7956,6 +8011,10 @@ msgid "TileSet"
msgstr "Datei(en) öffnen"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Script hinzufügen"
@@ -8043,6 +8102,12 @@ msgid "Duplicate Nodes"
msgstr "Node(s) duplizieren"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "Node erstellen"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Node(s) löschen"
@@ -8052,10 +8117,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -8069,6 +8130,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Node erstellen"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Node erstellen"
@@ -8428,7 +8494,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8437,7 +8503,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8599,6 +8665,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8624,7 +8694,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8633,7 +8703,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8642,14 +8712,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8694,6 +8764,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8910,6 +8987,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9067,6 +9148,15 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "Existierendes Projekt importieren"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "Neues Projekt erstellen"
@@ -9136,8 +9226,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9157,8 +9247,9 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "Projektname:"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9183,10 +9274,6 @@ msgid "Templates"
msgstr "Ungültige Bilder löschen"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9527,6 +9614,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9581,14 +9672,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9885,6 +9968,11 @@ msgid "Remove Node(s)"
msgstr "Node(s) entfernen"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Typ ändern"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10009,19 +10097,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10117,6 +10205,10 @@ msgid "Error loading script from %s"
msgstr "Fehler beim Instanzieren der %s Szene"
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10313,6 +10405,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10732,10 +10828,29 @@ msgid "Set Variable Type"
msgstr "Ungültige Bilder löschen"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Node erstellen"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Node erstellen"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Node erstellen"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10940,11 +11055,6 @@ msgstr "Node erstellen"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
-msgid "Paste Nodes"
-msgstr "Node erstellen"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
msgstr "Node Filter editieren"
@@ -11711,23 +11821,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-#, fuzzy
-msgid "Error initializing FreeType."
-msgstr "Fehler bei der FreeType Inizialisierung."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11760,6 +11853,24 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "Faces contain no area!"
+#~ msgstr "Flächen enthalten keinen Bereich!"
+
+#~ msgid "No faces!"
+#~ msgstr "Keine Flächen!"
+
+#, fuzzy
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Selektiere Node(s) zum Importieren aus"
+
+#, fuzzy
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Selektiere Node(s) zum Importieren aus"
+
+#, fuzzy
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Fehler bei der FreeType Inizialisierung."
+
#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "Node(s) löschen"
@@ -11822,10 +11933,6 @@ msgstr ""
#~ msgstr "Node"
#, fuzzy
-#~ msgid "New TextFile"
-#~ msgstr "Datei(en) öffnen"
-
-#, fuzzy
#~ msgid "Show current scene file."
#~ msgstr "Node(s) löschen"
diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot
index d239d252ac..e27bfdfe87 100644
--- a/editor/translations/editor.pot
+++ b/editor/translations/editor.pot
@@ -52,7 +52,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr ""
@@ -625,15 +624,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -857,8 +856,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -952,7 +950,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -988,7 +986,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1077,14 +1075,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1101,7 +1099,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1584,12 +1582,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -1979,6 +1976,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2275,6 +2276,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2368,6 +2377,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2452,20 +2465,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2498,24 +2507,32 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2595,12 +2612,12 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
msgstr ""
#: editor/editor_node.cpp
@@ -2636,14 +2653,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2651,12 +2668,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3093,7 +3111,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3110,6 +3128,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3171,12 +3193,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3190,13 +3210,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3281,19 +3305,11 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3326,11 +3342,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3389,6 +3405,10 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3452,6 +3472,10 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "Create Scene"
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3512,6 +3536,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3519,12 +3551,20 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Delete Group"
+msgstr ""
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3537,11 +3577,11 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
+msgid "Group Editor"
msgstr ""
#: editor/groups_editor.cpp
@@ -3748,7 +3788,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4490,10 +4530,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4506,14 +4542,42 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4590,8 +4654,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4612,7 +4679,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4624,6 +4691,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4778,6 +4849,10 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4806,6 +4881,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4826,14 +4902,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -4857,6 +4936,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4873,11 +4953,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4890,6 +4965,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5097,16 +5177,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5417,14 +5487,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5508,19 +5570,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5847,7 +5913,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -5953,11 +6018,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5981,7 +6042,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6062,6 +6123,10 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6099,11 +6164,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6191,6 +6256,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6257,6 +6326,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6291,92 +6361,96 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
+msgid "Fold/Unfold Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
+msgid "Fold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
+msgid "Unfold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
+msgid "Clone Down"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
+msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
+msgid "Evaluate Selection"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
+msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
+msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6614,7 +6688,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6668,7 +6742,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6679,27 +6753,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6743,22 +6797,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6813,7 +6851,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7106,10 +7144,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7194,11 +7228,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7316,8 +7350,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7596,6 +7630,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7672,15 +7710,16 @@ msgid "Duplicate Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Delete Nodes"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Visual Shader Input Type Changed"
+msgid "Delete Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
+msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7696,6 +7735,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8054,7 +8097,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8063,7 +8106,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8222,6 +8265,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8247,7 +8294,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8256,7 +8303,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8265,14 +8312,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8317,6 +8364,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8524,6 +8578,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8670,6 +8728,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8739,8 +8805,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8760,7 +8826,7 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
+msgid "Projects"
msgstr ""
#: editor/project_manager.cpp
@@ -8784,10 +8850,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9121,6 +9183,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9173,14 +9239,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9466,6 +9524,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9583,19 +9645,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9686,6 +9748,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -9874,6 +9940,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10284,10 +10354,26 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10472,10 +10558,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11205,22 +11287,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
diff --git a/editor/translations/el.po b/editor/translations/el.po
index e0be979450..8b5b93ec94 100644
--- a/editor/translations/el.po
+++ b/editor/translations/el.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-15 13:10+0000\n"
+"PO-Revision-Date: 2019-08-21 15:57+0000\n"
"Last-Translator: George Tsiamasiotis <gtsiam@windowslive.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/"
"el/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -62,7 +62,6 @@ msgid "On call to '%s':"
msgstr "Στην κλήση στο '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "ΕλεÏθεÏο"
@@ -104,56 +103,51 @@ msgstr "Μετακίνηση σημείου Bezier"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr "Anim ΑναπαÏαγωγή Κλειδιών"
+msgstr "ΑναπαÏαγωγή Κλειδιών Κίνησης"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr "Anim ΔιαγÏαφή κλειδιών"
+msgstr "ΔιαγÏαφή Κλειδιών Κίνησης"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
-msgstr "Anim Αλλαγή χÏόνου στιγμιοτÏπου"
+msgstr "Αλλαγή ΧÏόνου ÎšÎ»ÎµÎ¹Î´Î¹Î¿Ï ÎšÎ¯Î½Î·ÏƒÎ·Ï‚"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
-msgstr "Anim Αλλαγή μετάβασης"
+msgstr "Αλλαγή Μετάβασης Κίνησης"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
-msgstr "Anim Αλλαγή μετασχηματισμοÏ"
+msgstr "Αλλαγή ÎœÎµÏ„Î±ÏƒÏ‡Î·Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï ÎšÎ¯Î½Î·ÏƒÎ·Ï‚"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
-msgstr "Anim Αλλαγή τιμής στιγμιοτÏπου"
+msgstr "Αλλαγή Τιμής ÎšÎ»ÎµÎ¹Î´Î¹Î¿Ï ÎšÎ¯Î½Î·ÏƒÎ·Ï‚"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
-msgstr "Anim Αλλαγή κλήσης"
+msgstr "Αλλαγή Κλήσης Κίνησης"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Anim Αλλαγή χÏόνου στιγμιοτÏπου"
+msgstr "Αλλαγή ΧÏόνων Κλειδιών Κίνησης"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Anim Αλλαγή μετάβασης"
+msgstr "Αλλαγή Μεταβάσεων Κίνησης"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Anim Αλλαγή μετασχηματισμοÏ"
+msgstr "Αλλαγή Μετασχηματισμών Κίνησης"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Anim Αλλαγή τιμής στιγμιοτÏπου"
+msgstr "Αλλαγή Τιμών Κλειδιών Κίνησης"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "Anim Αλλαγή κλήσης"
+msgstr "Αλλαγή Κλήσεων Κίνησης"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -215,7 +209,7 @@ msgstr "Αποσπάσματα ήχου:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr "Αποσπάσματα κίνησης:"
+msgstr "Αποσπάσματα Κίνησης:"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
@@ -313,7 +307,7 @@ msgstr "Αλλαγή λειτουÏγίας επανάληψης κίνησης"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
-msgstr "Anim ΑφαίÏεση κομματιοÏ"
+msgstr "ΑφαίÏεση ÎšÎ¿Î¼Î¼Î±Ï„Î¹Î¿Ï ÎšÎ¯Î½Î·ÏƒÎ·Ï‚"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
@@ -336,7 +330,7 @@ msgstr "ΔημιουÏγία"
#: editor/animation_track_editor.cpp
msgid "Anim Insert"
-msgstr "Anim Εισαγωγή"
+msgstr "Εισαγωγή Κίνησης"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
@@ -344,15 +338,15 @@ msgstr "Ένα AnimationPlayer δεν μποÏεί να κινήσει τον ε
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
-msgstr "Anim ΔημιουÏγία & Εισαγωγή"
+msgstr "ΔημιουÏγία & Εισαγωγή Κίνησης"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
-msgstr "Anim Εισαγωγή ÎºÎ¿Î¼Î¼Î±Ï„Î¹Î¿Ï & κλειδιοÏ"
+msgstr "Εισαγωγή ÎšÎ¿Î¼Î¼Î±Ï„Î¹Î¿Ï & ÎšÎ»ÎµÎ¹Î´Î¹Î¿Ï ÎšÎ¯Î½Î·ÏƒÎ·Ï‚"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
-msgstr "Anim εισαγωγή κλειδιοÏ"
+msgstr "Εισαγωγή ÎšÎ»ÎµÎ¹Î´Î¹Î¿Ï ÎšÎ¯Î½Î·ÏƒÎ·Ï‚"
#: editor/animation_track_editor.cpp
msgid "Change Animation Step"
@@ -427,7 +421,7 @@ msgstr "Δεν βÏέθηκε η μέθοδος στο αντικείμενο: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr "Anim Μετακίνηση κελιδιών"
+msgstr "Μετακίνηση Κλειδιών Κίνησης"
#: editor/animation_track_editor.cpp
msgid "Clipboard is empty"
@@ -439,7 +433,7 @@ msgstr "Επικόλληση κομματιών"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
-msgstr "Anim Μεγέθυνση κλειδιών"
+msgstr "Κλιμάκωση Κλειδιών Κίνησης"
#: editor/animation_track_editor.cpp
msgid ""
@@ -658,16 +652,18 @@ msgid "Line Number:"
msgstr "ΑÏ. γÏαμμής:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "Î’Ïέθηκαν %d αποτελέσματα."
+msgid "Replaced %d occurrence(s)."
+msgstr "Αντικαταστάθηκαν %d εμφανίσεις."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Δεν υπάÏχουν αντιστοιχίες"
+#, fuzzy
+msgid "%d match."
+msgstr "Î’Ïέθηκαν %d αποτελέσματα."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Αντικαταστάθηκαν %d εμφανίσεις."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Î’Ïέθηκαν %d αποτελέσματα."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -728,7 +724,7 @@ msgid ""
"target node."
msgstr ""
"Η στοχευμένη συνάÏτηση δεν βÏέθηκε. ΟÏίστε μία έγκυÏη μέθοδο ή συνδέστε μία "
-"δεσμή ενεÏγειών στον στοχευμένο κόμβο."
+"δέσμη ενεÏγειών στον στοχευμένο κόμβο."
#: editor/connections_dialog.cpp
msgid "Connect to Node:"
@@ -736,7 +732,7 @@ msgstr "ΣÏνδεση σε Κόμβο:"
#: editor/connections_dialog.cpp
msgid "Connect to Script:"
-msgstr "ΣÏνδεση σε Δεσμή ΕνεÏγειών:"
+msgstr "ΣÏνδεση σε Δέσμη ΕνεÏγειών:"
#: editor/connections_dialog.cpp
msgid "From Signal:"
@@ -744,7 +740,7 @@ msgstr "Από Σήμα:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
-msgstr "Η σκηνή δεν πεÏιέχει δεσμή ενεÏγειών."
+msgstr "Η σκηνή δεν πεÏιέχει δέσμη ενεÏγειών."
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
@@ -896,8 +892,7 @@ msgstr "Αγαπημένα:"
msgid "Recent:"
msgstr "ΠÏόσφατα:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -997,7 +992,7 @@ msgstr ""
"Τα αÏχεία που αφαιÏοÏνται απαιτοÏνται από άλλους πόÏους για να δουλέψουν.\n"
"Îα αφαιÏεθοÏν; (ΑδÏνατη η αναίÏεση)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "ΑδÏνατη η αφαίÏεση:"
@@ -1033,7 +1028,7 @@ msgstr "Μόνιμη διαγÏαφή %d αντικειμένων; (ΑδÏνατ
msgid "Show Dependencies"
msgstr "Εμφάνιση ΕξαÏτήσεων"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "ΕξεÏευνητής αχÏησιμοποίητων πόÏων"
@@ -1122,14 +1117,16 @@ msgid "License"
msgstr "Άδεια"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Άδεια Ï„Ïίτων ομάδων"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Η μηχανή Godot βασίζεται σε μια σειÏά από δωÏεάν και Î±Î½Î¿Î¹Ï‡Ï„Î¿Ï ÎºÏŽÎ´Î¹ÎºÎ± "
@@ -1151,7 +1148,8 @@ msgid "Licenses"
msgstr "Άδειες"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Σφάλμα κατά το άνοιγμα του πακέτου, δεν είναι αÏχείο zip."
#: editor/editor_asset_installer.cpp
@@ -1645,12 +1643,11 @@ msgid "New"
msgstr "Îέο"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Εισαγωγή"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Εξαγωγή"
@@ -1787,32 +1784,28 @@ msgid "Move Favorite Down"
msgstr "Μετακίνηση αγαπημένου κάτω"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Πήγαινε στον γονικό φάκελο."
+msgstr "Πήγαινε στον Ï€ÏοηγοÏμενο φάκελο."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Πήγαινε στον γονικό φάκελο."
+msgstr "Πήγαινε στον επόμενο φάκελο."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "Πήγαινε στον γονικό φάκελο."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Αναζήτηση αÏχείων"
+msgstr "Ανανέωση αÏχείων."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "Εναλλαγή αγαπημένου Ï„Ïέχοντος φακέλου."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "Εναλλαγή οÏατότητας κÏυμένων αÏχείων."
+msgstr "Εναλλαγή οÏατότητας κÏυφών αÏχείων."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
@@ -2053,6 +2046,11 @@ msgstr "ΕκκαθάÏιση"
msgid "Clear Output"
msgstr "ΕκκαθάÏιση εξόδου"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "ΠαÏάθυÏο"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Η εξαγωγή του έÏγου απέτυχε με κωδικό %d."
@@ -2266,7 +2264,7 @@ msgstr "ΓÏήγοÏο άνοιγμα σκηνής..."
#: editor/editor_node.cpp
msgid "Quick Open Script..."
-msgstr "ΓÏήγοÏη άνοιγμα δεσμής ενεÏγειών..."
+msgstr "ΓÏήγοÏη άνοιγμα δέσμης ενεÏγειών..."
#: editor/editor_node.cpp
msgid "Save & Close"
@@ -2382,6 +2380,15 @@ msgid "Pick a Main Scene"
msgstr "Επιλογή κÏÏιας σκηνής"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Κλείσιμο σκηνής"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Κλείσιμο σκηνής"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"ΑδÏνατη η ενεÏγοποίηση Ï€Ïόσθετης επέκτασης στο: '%s'. Απέτυχε η ανάλυση του "
@@ -2395,7 +2402,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s'."
-msgstr "ΑδÏνατη η φόÏτωση δεσμής ενεÏγειών Ï€Ïοσθέτου από τη διαδÏομή: '%s'."
+msgstr "ΑδÏνατη η φόÏτωση δέσμης ενεÏγειών Ï€Ïοσθέτου από τη διαδÏομή: '%s'."
#: editor/editor_node.cpp
msgid ""
@@ -2409,13 +2416,13 @@ msgstr ""
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
-"ΑδÏνατη η φόÏτωση δεσμής ενεÏγειών Ï€Ïοσθέτου από τη διαδÏομή: '%s'. Ο "
+"ΑδÏνατη η φόÏτωση δέσμης ενεÏγειών Ï€Ïοσθέτου από τη διαδÏομή: '%s'. Ο "
"βασικός Ï„Ïπος δεν είναι το EditorPlugin."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
msgstr ""
-"ΑδÏνατη η φόÏτωση δεσμής ενεÏγειών Ï€Ïοσθέτου από τη διαδÏομή: '%s'. Δεν "
+"ΑδÏνατη η φόÏτωση δέσμης ενεÏγειών Ï€Ïοσθέτου από τη διαδÏομή: '%s'. Δεν "
"είναι σε λειτουÏγία tool."
#: editor/editor_node.cpp
@@ -2501,6 +2508,11 @@ msgstr "ΑναπαÏαγωγή σκηνής"
msgid "Close Tab"
msgstr "Κλείσιμο καÏτέλας"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Κλείσιμο καÏτέλας"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Κλείσιμο άλλον καÏτελών"
@@ -2554,9 +2566,8 @@ msgid "Go to previously opened scene."
msgstr "ΕπιστÏοφή στην Ï€Ïοηγουμένως ανοιγμένη σκηνή."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "ΑντιγÏαφή διαδÏομής"
+msgstr "ΑντιγÏαφή Κειμένου"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2586,6 +2597,10 @@ msgstr "Îέα κληÏονομημένη σκηνή..."
msgid "Open Scene..."
msgstr "Άνοιγμα σκηνής..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Άνοιγμα Ï€Ïόσφατων"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "ΑποθηκεÏσετε σκηνής"
@@ -2595,14 +2610,6 @@ msgid "Save All Scenes"
msgstr "Αποθήκευση Ολων των Σκηνών"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Κλείσιμο σκηνής"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Άνοιγμα Ï€Ïόσφατων"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "ΜετατÏοπή σε..."
@@ -2632,25 +2639,37 @@ msgstr "ΕπαναφοÏά σκηνής"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Λοιπά έÏγα ή εÏγαλεία για όλη τη σκηνή."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "ΈÏγο"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Ρυθμίσεις έÏγου"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "ΕÏγαλεία"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Εξαγωγή"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Εγκατάσταση ΠÏοτÏπου Χτισίματος Android"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Άνοιγμα φακέλου δεδομένων έÏγου"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "ΕÏγαλεία"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Εγκατάσταση ΠÏοτÏπου Χτισίματος Android"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "ΕξεÏευνητής αχÏησιμοποίητων πόÏων"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2744,17 +2763,18 @@ msgid ""
"When used remotely on a device, this is more efficient with network "
"filesystem."
msgstr ""
-"Όταν αυτή η επιλογή είναι ενεÏγοποιημένη, όποια δεσμή ενεÏγειών αποθηκευτεί "
+"Όταν αυτή η επιλογή είναι ενεÏγοποιημένη, όποια δέσμη ενεÏγειών αποθηκευτεί "
"θα επαναφοÏτωθεί στο παιχνίδι.\n"
"Όταν χÏησιμοποιηθεί απομακÏυσμένα σε μία συσκευή, αυτό είναι ποιο "
"αποτελεσματικό με δικτυωμένο σÏστημα αÏχείων."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "ΕπεξεÏγαστής"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Ρυθμίσεις επεξεÏγαστή"
#: editor/editor_node.cpp
@@ -2792,14 +2812,16 @@ msgid "Open Editor Settings Folder"
msgstr "Άνοιγμα φακέλου Ïυθμίσεων επεξεÏγαστή"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "ΔιαχείÏιση Δυνατοτήτων ΕπεξεÏγαστή"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "ΔιαχείÏιση Ï€ÏοτÏπων εξαγωγής"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Βοήθεια"
@@ -2807,12 +2829,13 @@ msgstr "Βοήθεια"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Αναζήτηση"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "ΗλεκτÏονική τεκμηÏίωση"
@@ -2972,7 +2995,7 @@ msgstr "Κωδικός:"
#: editor/editor_node.cpp
msgid "Open & Run a Script"
-msgstr "Άνοιξε & ΤÏέξε μία δεσμή ενεÏγειών"
+msgstr "Άνοιξε & ΤÏέξε μία δέσμη ενεÏγειών"
#: editor/editor_node.cpp
msgid "New Inherited"
@@ -2996,7 +3019,7 @@ msgstr "Άνοιγμα 3D επεξεÏγαστή"
#: editor/editor_node.cpp
msgid "Open Script Editor"
-msgstr "Άνοιγμα επεξεÏγαστή δεσμής ενεÏγειών"
+msgstr "Άνοιγμα ΕπεξεÏγαστή Δεσμών ΕνεÏγειών"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
@@ -3093,9 +3116,8 @@ msgid "Calls"
msgstr "Κλήσεις"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "ΕπεξεÏγασία Θέματος"
+msgstr "ΕπεξεÏγασία Κειμένου:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3155,7 +3177,7 @@ msgstr "Επιλέξτε ένα Viewport"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
-msgstr "Îεα δεσμή ενεÏγειών"
+msgstr "Îέα Δέσμη ΕνεÏγειών"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
@@ -3177,7 +3199,7 @@ msgstr "Κάνε μοναδικό"
#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
-msgstr "Επικόληση"
+msgstr "Επικόλληση"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Convert To %s"
@@ -3237,7 +3259,7 @@ msgstr "ΥπάÏχει ήδη μία σκηνή για επεξεÏγασία."
#: editor/editor_run_script.cpp
msgid "Couldn't instance script:"
-msgstr "ΑδÏνατη η δημιουÏγία στιγμιοτÏπου δεσμής ενεÏγειών:"
+msgstr "Αδυναμία κλωνοποίησης δέσμης ενεÏγειών:"
#: editor/editor_run_script.cpp
msgid "Did you forget the 'tool' keyword?"
@@ -3245,7 +3267,7 @@ msgstr "Μήπως ξεχάσατε τη λέξη-κλειδί \"tool\"?"
#: editor/editor_run_script.cpp
msgid "Couldn't run script:"
-msgstr "ΑδÏνατη η εκτέλεση της δεσμής ενεÏγειών:"
+msgstr "Αδυναμία εκτέλεσης δέσμης ενεÏγειών:"
#: editor/editor_run_script.cpp
msgid "Did you forget the '_run' method?"
@@ -3268,7 +3290,8 @@ msgid "Import From Node:"
msgstr "Εισαγωγή σκηνής από κόμβο:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Εκ νέου λήψη"
#: editor/export_template_manager.cpp
@@ -3285,6 +3308,10 @@ msgid "Download"
msgstr "Λήψη"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Λείπει)"
@@ -3348,12 +3375,10 @@ msgid "No response."
msgstr "Δεν λήφθηκε απόκÏιση."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Το αίτημα απέτυχε."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Î’Ïόχος ανακατευθήνσεων."
@@ -3367,15 +3392,22 @@ msgid "Download Complete."
msgstr "Η λήψη ολοκληÏώθηκε."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Δεν ήταν δυνατή η αποθήκευση θέματος σε αÏχείο:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Αποτυχία εγκατάστασης Ï€ÏοτÏπων. Οι Ï€Ïοβληματικές αÏχειοθήκες μποÏοÏν να "
"βÏεθοÏν στο '%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Σφάλμα κατά Ï„o αίτημα για διεÏθηνση url: "
#: editor/export_template_manager.cpp
@@ -3462,22 +3494,11 @@ msgstr ""
"Επιλέξτε έναν διακομιστή κατοπτÏισμοÏ: (Shift+Click για άνοιγμα στο "
"Ï€ÏόγÏαμμα πεÏιήγησης)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"ΑδÏνατο το άνοιγμα του αÏχείου file_type_cache.cch για εγγÏαφή, παÏάλειψη "
-"αποθήκευσης cache Ï„Ïπου αÏχείου!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Αγαπημένα"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"Δεν ήταν δυνατή η πλοήγηση στο '%s', καθώς δεν βÏέθηκε στο σÏστημα αÏχείων!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Κατάσταση: Η εισαγωγή απέτυχε. ΠαÏακαλοÏμε διοÏθώστε το αÏχείο και "
@@ -3512,14 +3533,14 @@ msgid "Provided name contains invalid characters."
msgstr "Το δοσμένο όνομα πεÏιέχει άκυÏους χαÏακτήÏες."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Το όνομα πεÏιέχει άκυÏους χαÏακτήÏες."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "ΥπάÏχει ήδη ένα αÏχείο ή φάκελος με αυτό το όνομα."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Το όνομα πεÏιέχει άκυÏους χαÏακτήÏες."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Μετονομασία αÏχείου:"
@@ -3575,9 +3596,14 @@ msgstr "ΑναπαÏαγωγή..."
msgid "Move To..."
msgstr "Μετακίνηση σε..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Îέα σκηνή"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Îεα δεσμή ενεÏγειών..."
+msgstr "Îέα Δέσμη ΕνεÏγειών..."
#: editor/filesystem_dock.cpp
msgid "New Resource..."
@@ -3591,7 +3617,7 @@ msgstr "Ανάπτυξη Όλων"
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
msgid "Collapse All"
-msgstr "ΣÏμπτηξη Όλων"
+msgstr "ΣÏμπτυξη Όλων"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3640,9 +3666,14 @@ msgstr "ΥπάÏχει ήδη αÏχείο ή φάκελος με το ίδιο
msgid "Overwrite"
msgstr "Αντικατάσταση"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "ΔημιουÏγία από σκηνή"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
-msgstr "ΔημιουÏγία δεσμής ενεÏγειών"
+msgstr "ΔημιουÏγία δέσμης ΕνεÏγειών"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
msgid "Find in Files"
@@ -3702,6 +3733,14 @@ msgid "Search complete"
msgstr "ΟλοκλήÏωση αναζήτησης"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "ΠÏοσθήκη σε Ομάδα"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "ΚατάÏγηση από την ομάδα"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "ΥπαÏκτό όνομα ομάδας."
@@ -3709,12 +3748,23 @@ msgstr "ΥπαÏκτό όνομα ομάδας."
msgid "Invalid group name."
msgstr "ΆκυÏο όνομα ομάδας."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "ΔιαχείÏηση ομάδων"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "ΔιαγÏαφή διάταξης"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Ομάδες"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Κόμβοι εκτός ομάδας"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3727,12 +3777,13 @@ msgid "Nodes in Group"
msgstr "Κόμβοι σε ομάδα"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "ΠÏοσθήκη σε Ομάδα"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "ΚατάÏγηση από την ομάδα"
+#, fuzzy
+msgid "Group Editor"
+msgstr "ΕπεξεÏγαστής Δεσμών ΕνεÏγειών"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3797,21 +3848,21 @@ msgstr "ΔημιουÏία για πλέγμα: "
#: editor/import/resource_importer_scene.cpp
msgid "Running Custom Script..."
-msgstr "Εκτέλεση Ï€ÏοσαÏμοσμένης δέσμης ενεÏγειών..."
+msgstr "Εκτέλεση ΠÏοσαÏμοσμένης Δέσμης ΕνεÏγειών..."
#: editor/import/resource_importer_scene.cpp
msgid "Couldn't load post-import script:"
-msgstr "Δεν ήταν δυνατή η φόÏτωση της δεσμής ενεÏγειών για μετά την εισαγωγή:"
+msgstr "Δεν ήταν δυνατή η φόÏτωση της δέσμης ενεÏγειών για μετά την εισαγωγή:"
#: editor/import/resource_importer_scene.cpp
msgid "Invalid/broken script for post-import (check console):"
msgstr ""
-"ΆκυÏη / χαλασμένη δεσμή ενεÏγειών για την διαδικασία της μετ-εισαγωγής "
-"(ελέγξτε την κονσόλα):"
+"ΆκυÏη/χαλασμένη δέσμη ενεÏγειών για την διαδικασία της μετεισαγωγής (ελέγξτε "
+"την κονσόλα):"
#: editor/import/resource_importer_scene.cpp
msgid "Error running post-import script:"
-msgstr "Σφάλμα κατά την εκτέλεση της δέσμης ενεÏγειών μετ-εισαγωγής:"
+msgstr "Σφάλμα κατά την εκτέλεση της δέσμης ενεÏγειών μετεισαγωγής:"
#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
@@ -3865,7 +3916,7 @@ msgstr "Ανάπτυξη Όλων των Ιδιοτήτων"
#: editor/inspector_dock.cpp
msgid "Collapse All Properties"
-msgstr "ΣÏμπτηξη Όλων των Ιδιοτήτων"
+msgstr "ΣÏμπτυξη Όλων των Ιδιοτήτων"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3941,7 +3992,8 @@ msgid "MultiNode Set"
msgstr "Σετ πολλαπλών κόμβων"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Επιλέξτε ένα κόμβο για να επεξεÏγαστείτε τα σήματα και τις ομάδες."
#: editor/plugin_config_dialog.cpp
@@ -3966,7 +4018,7 @@ msgstr "Γλώσσα:"
#: editor/plugin_config_dialog.cpp
msgid "Script Name:"
-msgstr "Όνομα δεσμής ενεÏγειών:"
+msgstr "Όνομα Δέσμης ΕνεÏγειών:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
@@ -4702,10 +4754,6 @@ msgid "View Files"
msgstr "ΠÏοβολή αÏχείων"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Δεν είναι δυνατή η επίλυση του ονόματος του κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î®:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Σφάλμα σÏνδεσης, παÏακαλώ ξαναπÏοσπαθήστε."
@@ -4718,14 +4766,47 @@ msgid "No response from host:"
msgstr "Δεν λήφθηκε απόκÏιση από τον κεντÏικό υπολογιστή:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Δεν είναι δυνατή η επίλυση του ονόματος του κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î®:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Το αίτημα απέτυχε, κώδικας επιστÏοφής:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Το αίτημα απέτυχε."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Δεν ήταν δυνατή η αποθήκευση θέματος σε αÏχείο:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Το αίτημα απέτυχε, πάÏα πολλές ανακατευθήνσεις"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Î’Ïόχος ανακατευθήνσεων."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Το αίτημα απέτυχε, κώδικας επιστÏοφής:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "ΧÏόνος"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
"Εσφαλμένος κωδικός κατακεÏματισμοÏ, θα θεωÏηθεί ότι το αÏχείο έχει αλοιωθεί."
@@ -4767,9 +4848,8 @@ msgid "Idle"
msgstr "ΑνενεÏγό"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "Εγκατάσταση"
+msgstr "Εγκατάσταση..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -4804,8 +4884,13 @@ msgid "All"
msgstr "Όλα"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Εκ νέου εισαγωγή..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "ΠÏόσθετα"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4813,9 +4898,8 @@ msgid "Sort:"
msgstr "Ταξινόμηση:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Reverse sorting."
-msgstr "Γίνεται αίτημα..."
+msgstr "ΑντιστÏοφή ταξινόμησης."
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
@@ -4827,7 +4911,8 @@ msgid "Site:"
msgstr "ΔιεÏθυνση:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "ΥποστήÏιξη..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4839,6 +4924,11 @@ msgid "Testing"
msgstr "Δοκιμιμαστικά"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "ΦόÏτωσε..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "ΑÏχείο ZIP των Asset"
@@ -4897,39 +4987,32 @@ msgid "Rotation Step:"
msgstr "Βήμα πεÏιστÏοφής:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Vertical Guide"
-msgstr "Μετακίνηση κάθετου οδηγοÏ"
+msgstr "Μετακίνηση Κάθετου ΟδηγοÏ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Vertical Guide"
-msgstr "ΔημιουÏγία νέου κάθετου οδηγοÏ"
+msgstr "ΔημιουÏγία Κάθετου ΟδηγοÏ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Vertical Guide"
-msgstr "ΑφαίÏεση κάθετου οδηγοÏ"
+msgstr "ΑφαίÏεση Κάθετου ΟδηγοÏ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Horizontal Guide"
-msgstr "Μετακίνηση οÏιζόντιου οδηγοÏ"
+msgstr "Μετακίνηση ΟÏιζόντιου ΟδηγοÏ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal Guide"
-msgstr "ΔημιουÏγία νέου οÏιζόντιου οδηγοÏ"
+msgstr "ΔημιουÏγία ΟÏιζόντιου ΟδηγοÏ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Horizontal Guide"
-msgstr "ΑφαίÏεση οÏιζόντιου οδηγοÏ"
+msgstr "ΑφαίÏεση ΟÏιζόντιου ΟδηγοÏ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal and Vertical Guides"
-msgstr "ΔημιουÏγία νέων οÏιζοντίων και κάθετων οδηγών"
+msgstr "ΔημιουÏγία ΟÏιζοντίων και Καθέτων Οδηγών"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move pivot"
@@ -5012,6 +5095,11 @@ msgid "Paste Pose"
msgstr "Επικόληση στάσης"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "ΕκκαθάÏιση Οστών"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "ΔημιουÏγία ΠÏοσαÏμοσμένων Οστών από Κόμβους"
@@ -5042,6 +5130,7 @@ msgid "Zoom Reset"
msgstr "ΕπαναφοÏά Μεγέθυνσης"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Επιλογή λειτουÏγίας"
@@ -5063,14 +5152,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+Δεξί κλικ: Επιλογή λίστας βάθους"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "ΛειτουÏγία μετακίνησης"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "ΛειτουÏγία πεÏιστÏοφής"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "ΛειτουÏγία Κλιμάκωσης"
@@ -5097,6 +5189,7 @@ msgid "Toggle snapping."
msgstr "Εναλλαγή κουμπώματος."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "ΧÏήση κουμπώματος"
@@ -5113,11 +5206,6 @@ msgid "Use Rotation Snap"
msgstr "ΧÏήση κουμπώματος πεÏιστÏοφής"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "ΔιαμόÏφωση κουμπώματος..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Σχετικό κοÏμπωμα"
@@ -5130,6 +5218,11 @@ msgid "Smart Snapping"
msgstr "Έξυπνο ΚοÏμπωμα"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "ΔιαμόÏφωση κουμπώματος..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "ΚοÏμπωμα στον Γονέα"
@@ -5344,16 +5437,6 @@ msgstr "ΟÏισμός λαβής"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Σφάλμα κατά την φόÏτωση εικόνας:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Δεν υπάÏχουν εικονοστοιχεία με διαφάνεια >128 στην εικόνα..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "ΦόÏτωση μάσκας εκπομπής"
@@ -5666,14 +5749,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Η πηγαία επιφάνεια δεν είναι έγκυÏη (Δεν υπάÏχουν επιφάνειες)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "Ο γονέας δεν έχει συμπαγείς επιφάνειες για να συμπληÏωθοÏν."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Δεν ήταν δυνατή η χαÏτογÏάφηση της πεÏιοχής."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Έπιλέξτε ένα πηγαίο πλέγμα:"
@@ -5759,20 +5834,27 @@ msgid "Generation Time (sec):"
msgstr "ΧÏόνος παÏαγωγής (sec):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Οι επιφάνειες έχουν μηδενικό εμβαδόν!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Ο κόμβος δεν πεÏιέχει γεωμετÏία (Επιφάνειες)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Δεν υπάÏχουν επιφάνειες!"
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Ο κόμβος δεν πεÏιέχει γεωμετÏία."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Ο κόμβος δεν πεÏιέχει γεωμετÏία (Επιφάνειες)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Ο κόμβος δεν πεÏιέχει γεωμετÏία."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6106,7 +6188,6 @@ msgid "Grid Settings"
msgstr "Ρυθμίσεις Πλέγματος"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "ΚοÏμπωμα"
@@ -6212,12 +6293,9 @@ msgid "Error writing TextFile:"
msgstr "Σφάλμα εγγÏαφής TextFile:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Σφάλμα φόÏτωσης αÏχείου."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "Σφάλμα φόÏτωσης αÏχείου."
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "Δεν ήταν δυνατή η εÏÏεση πλακιδίου:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6240,7 +6318,8 @@ msgid "Error Importing"
msgstr "Σφάλμα εισαγωγής"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Îέο TextFile..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6306,11 +6385,11 @@ msgstr "Μετακίνηση κάτω"
#: editor/plugins/script_editor_plugin.cpp
msgid "Next script"
-msgstr "Επόμενη δεσμή ενεÏγειών"
+msgstr "Επόμενη Δέμη ΕνεÏγειών"
#: editor/plugins/script_editor_plugin.cpp
msgid "Previous script"
-msgstr "ΠÏοηγοÏμενη δεσμή ενεÏγειών"
+msgstr "ΠÏοηγοÏμενη Δέσμη ΕνεÏγειών"
#: editor/plugins/script_editor_plugin.cpp
msgid "File"
@@ -6321,16 +6400,21 @@ msgid "Open..."
msgstr "Άνοιγμα..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Άνοιγμα Δέσμης ΕνεÏγειών"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Αποθήκευση όλων"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
-msgstr "Απλή επαναφόÏτωση δεσμής ενεÏγειών"
+msgstr "Απλή ΕπαναφόÏτωση Δέσμης ΕνεÏγειών"
#: editor/plugins/script_editor_plugin.cpp
msgid "Copy Script Path"
-msgstr "ΑντιγÏαφή διαδÏομής δεσμής ενεÏγειών"
+msgstr "ΑντιγÏαφή ΔιαδÏομής Δέσμης ΕνεÏγειών"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Previous"
@@ -6358,13 +6442,13 @@ msgid "Save Theme"
msgstr "Αποθήκευση θέματος"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Κλείσιμο τεκμηÏίωσης"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Κλείσιμο όλων"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Κλείσιμο τεκμηÏίωσης"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Εκτέλεση"
@@ -6452,6 +6536,11 @@ msgstr "Αποσφαλματωτής"
msgid "Search Results"
msgstr "Αποτελέσματα Αναζήτησης"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "ΕκκαθάÏιση Ï€Ïόσφατων σκηνών"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "ΣÏνδεση σε μέθοδο:"
@@ -6520,6 +6609,7 @@ msgid "Syntax Highlighter"
msgstr "Επισημαντής ΣÏνταξης"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr "Πήγαινε Σε"
@@ -6554,22 +6644,6 @@ msgid "Toggle Comment"
msgstr "Εναλλαγή σχολιασμοÏ"
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr "Εναλλαγή Αγαπημένου"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "Πήγαινε στο Επόμενο Αγαπημένο"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr "Πήγαινε στο ΠÏοηγοÏμενο Αγαπημένο"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "ΑφαίÏεση Όλων των Αγαπημένων"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Δίπλωμα/Ξεδίπλωμα γÏαμμής"
@@ -6590,6 +6664,11 @@ msgid "Complete Symbol"
msgstr "ΣυμπλήÏωση συμβόλου"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Μεγέθυνση επιλογής"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "ΠεÏικοπή ÎºÎ±Ï„Î±Î»Î·ÎºÏ„Î¹ÎºÎ¿Ï ÎºÎµÎ½Î¿Ï Î´Î¹Î±ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚"
@@ -6606,29 +6685,32 @@ msgid "Auto Indent"
msgstr "Αυτόματη στοιχειοθέτηση"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Εναλλαγή σημείου διακοπής"
+msgid "Find Previous"
+msgstr "ΈυÏεση Ï€ÏοηγοÏμενου"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "ΑφαίÏεση όλων των σημείων διακοπής"
+msgid "Find in Files..."
+msgstr "ΕÏÏεση σε ΑÏχεία..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Πήγαινε στο επόμενο σημείο διακοπής"
+msgid "Contextual Help"
+msgstr "Βοήθεια ανάλογα με τα συμφÏαζόμενα"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "ΕπιστÏοφή στο Ï€ÏοηγοÏμενο σημείο διακοπής"
+msgid "Toggle Bookmark"
+msgstr "Εναλλαγή Αγαπημένου"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "ΈυÏεση Ï€ÏοηγοÏμενου"
+msgid "Go to Next Bookmark"
+msgstr "Πήγαινε στο Επόμενο Αγαπημένο"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "ΕÏÏεση σε ΑÏχεία..."
+msgid "Go to Previous Bookmark"
+msgstr "Πήγαινε στο ΠÏοηγοÏμενο Αγαπημένο"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "ΑφαίÏεση Όλων των Αγαπημένων"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6639,8 +6721,21 @@ msgid "Go to Line..."
msgstr "Πήγαινε σε γÏαμμή..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Βοήθεια ανάλογα με τα συμφÏαζόμενα"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Εναλλαγή σημείου διακοπής"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "ΑφαίÏεση όλων των σημείων διακοπής"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Πήγαινε στο επόμενο σημείο διακοπής"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "ΕπιστÏοφή στο Ï€ÏοηγοÏμενο σημείο διακοπής"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -6821,14 +6916,12 @@ msgid "Rear"
msgstr "Πίσω"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Transform with View"
-msgstr "Στοίχιση με ΠÏοβολή"
+msgstr "Στοίχιση ÎœÎµÏ„Î±ÏƒÏ‡Î·Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Î¼Îµ ΠÏοβολή"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Rotation with View"
-msgstr "Στοίχηση επιλογής με την Ï€Ïοβολή"
+msgstr "Στοίχιση ΠεÏιστÏοφής με ΠÏοβολή"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -6884,8 +6977,9 @@ msgid "Audio Listener"
msgstr "ΑκÏοατής ήχου"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Φαινόμενο ÎτόπλεÏ"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "ΕνεÏγοποίηση ΦίλτÏου"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6941,8 +7035,8 @@ msgid "Snap Nodes To Floor"
msgstr "ΚοÏμπωμα Κόμβων στο Δάπεδο"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Επιλογή λειτουÏγίας (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6955,30 +7049,11 @@ msgstr ""
"Alt + Δεξί κλικ: Επιλογή λίστας βάθους"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "ΛειτουÏγία μετακίνησης (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "ΛειτουÏγία πεÏιστÏοφής (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "ΛειτουÏγία κλιμάκωσης (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Τοπικές συντεταγμένες"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "ΛειτουÏγία Ï„Î¿Ï€Î¹ÎºÎ¿Ï Ï‡ÏŽÏου (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "ΛειτουÏγία κουμπώματος (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Κάτω όψη"
@@ -7019,22 +7094,6 @@ msgid "Focus Selection"
msgstr "Εστίαση στην επιλογή"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "ΕÏγαλείο επιλογής"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "ΕÏγαλείο μετακίνησης"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "ΕÏγαλείο πεÏιστÏοφής"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "ΕÏγαλείο κλιμάκωσης"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Εναλλαγή ελεÏθεÏης κάμεÏας"
@@ -7089,7 +7148,8 @@ msgstr "ΠÏοβολή πλέγματος"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Ρυθμίσεις"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7382,10 +7442,6 @@ msgid "TextureRegion"
msgstr "TextureRegion"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "Δεν ήταν δυνατή η αποθήκευση θέματος σε αÏχείο:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "ΠÏοσθήκη όλων των στοιχείων"
@@ -7470,11 +7526,13 @@ msgid "Submenu"
msgstr "Υπό-ΜενοÏ"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+#, fuzzy
+msgid "Subitem 1"
msgstr "Στοιχείο 1"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+#, fuzzy
+msgid "Subitem 2"
msgstr "Στοιχείο 2"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7591,9 +7649,10 @@ msgid "Paint Tile"
msgstr "Βάψιμο πλακιδίου"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Shift+Δεξί Κλικ: ΖωγÏάφισμα ΓÏαμμής\n"
"Shift+Ctrl+Δεξί Κλικ: ΖωγÏάφισμα ΟÏθογωνίου"
@@ -7891,6 +7950,10 @@ msgid "TileSet"
msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(Μόνο GLES3)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr "ΠÏοσθήκη εισόδου +"
@@ -7967,6 +8030,11 @@ msgid "Duplicate Nodes"
msgstr "ΑναπαÏαγωγή Κόμβων"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Επικόλληση κόμβων"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "ΔιαγÏαφή Κόμβων"
@@ -7975,10 +8043,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "Αλλαγή ΤÏπου Εισόδου ÎŸÏ€Ï„Î¹ÎºÎ¿Ï Î ÏογÏάμματος Σκίασης"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "ΚοÏυφή"
@@ -7991,6 +8055,11 @@ msgid "Light"
msgstr "Φως"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Show resulted shader code."
+msgstr "ΔημιουÏγία Κόμβου Σκίασης"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr "ΔημιουÏγία Κόμβου Σκίασης"
@@ -8063,21 +8132,20 @@ msgid "Color uniform."
msgstr "Ενιαία μεταβλητή χÏώματος."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the boolean result of the %s comparison between two parameters."
-msgstr "ΕπιστÏέφει το αντίστÏοφο της τετÏαγωνικής Ïίζας της παÏαμέτÏου."
+msgstr "ΕπιστÏέφει το λογικό αποτέλεσμα της σÏγκÏισης για %s δÏο παÏαμέτÏων."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Equal (==)"
-msgstr ""
+msgstr "Ίσο (==)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than (>)"
-msgstr ""
+msgstr "ΜεγαλÏτεÏο (>)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than or Equal (>=)"
-msgstr ""
+msgstr "ΜεγαλÏτεÏο ή Ίσο (>=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8092,24 +8160,26 @@ msgid ""
"Returns the boolean result of the comparison between INF and a scalar "
"parameter."
msgstr ""
+"ΕπιστÏέφει το λογικό αποτέλεσμα της σÏγκÏισης του INF με βαθμωτή παÏάμετÏο."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between NaN and a scalar "
"parameter."
msgstr ""
+"ΕπιστÏέφει το λογικό αποτέλεσμα της σÏγκÏισης του NaN με βαθμωτή παÏάμετÏο."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
-msgstr ""
+msgstr "ΜικÏότεÏο (<)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than or Equal (<=)"
-msgstr ""
+msgstr "ΜικÏότεÏο ή Ίσο (<=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Not Equal (!=)"
-msgstr ""
+msgstr "Άνισο (!=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8118,15 +8188,16 @@ msgstr ""
"ΕπιστÏέφει ένα συσχετισμένο διάνυσμα εάν η λογική τιμή είναι αληθής ή ψευδής."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the boolean result of the comparison between two parameters."
-msgstr "ΕπιστÏέφει την εφαπτομένη της παÏαμέτÏου."
+msgstr "ΕπιστÏέφει το λογικό αποτέλεσμα της σÏγκÏισης δÏο παÏαμέτÏων."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF (or NaN) and a "
"scalar parameter."
msgstr ""
+"ΕπιστÏέφει το λογικό αποτέλεσμα της σÏγκÏισης του INF (ή NaN) με μια βαθμωτή "
+"παÏάμετÏο."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean constant."
@@ -8217,20 +8288,16 @@ msgid "Returns the arc-cosine of the parameter."
msgstr "ΕπιστÏέφει το τόξο συνημιτόνου της παÏαμέτÏου."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr ""
-"(Μόνο GLES3) ΕπιστÏέφει το αντίστÏοφο υπεÏβολικό συνημίτονο της παÏαμέτÏου."
+msgstr "ΕπιστÏέφει το αντίστÏοφο υπεÏβολικό συνημίτονο της παÏαμέτÏου."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-sine of the parameter."
msgstr "ΕπιστÏέφει το τόξο ημιτόνου της παÏαμέτÏου."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the inverse hyperbolic sine of the parameter."
-msgstr ""
-"(Μόνο GLES3) ΕπιστÏέφει το αντίστÏοφο υπεÏβολικό ημίτονο της παÏαμέτÏου."
+msgstr "ΕπιστÏέφει το αντίστÏοφο υπεÏβολικό ημίτονο της παÏαμέτÏου."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameter."
@@ -8241,10 +8308,8 @@ msgid "Returns the arc-tangent of the parameters."
msgstr "ΕπιστÏέφει το τόξο εφαπτομένης των παÏαμέτÏων."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the inverse hyperbolic tangent of the parameter."
-msgstr ""
-"(Μόνο GLES3) ΕπιστÏέφει την αντίστÏοφη υπεÏβολική εφαπτομένη της παÏαμέτÏου."
+msgstr "ΕπιστÏέφει την αντίστÏοφη υπεÏβολική εφαπτομένη της παÏαμέτÏου."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8260,9 +8325,8 @@ msgid "Returns the cosine of the parameter."
msgstr "ΕπιστÏέφει το συνημίτονο της παÏαμέτÏου."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr "(Μόνο GLES3) ΕπιστÏέφει το υπεÏβολικό συνημίτονο της παÏαμέτÏου."
+msgstr "ΕπιστÏέφει το υπεÏβολικό συνημίτονο της παÏαμέτÏου."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
@@ -8331,14 +8395,12 @@ msgid "1.0 / scalar"
msgstr "1.0 / βαθμωτό μέγεθος"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Finds the nearest integer to the parameter."
-msgstr "(Μόνο GLES3) Î’Ïίσκει τον κοντινότεÏο ακέÏαιο στην παÏάμετÏο."
+msgstr "Î’Ïίσκει τον κοντινότεÏο ακέÏαιο στην παÏάμετÏο."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Finds the nearest even integer to the parameter."
-msgstr "(Μόνο GLES3) Î’Ïίσκει τον κοντινότεÏο άÏτιο ακέÏαιο στην παÏάμετÏο."
+msgstr "Î’Ïίσκει τον κοντινότεÏο άÏτιο ακέÏαιο στην παÏάμετÏο."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
@@ -8353,19 +8415,19 @@ msgid "Returns the sine of the parameter."
msgstr "ΕπιστÏέφει το ημίτονο της παÏαμέτÏου."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the hyperbolic sine of the parameter."
-msgstr "(Μόνο GLES3) ΕπιστÏέφει το υπεÏβολικό ημίτονο της παÏαμέτÏου."
+msgstr "ΕπιστÏέφει το υπεÏβολικό ημίτονο της παÏαμέτÏου."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the square root of the parameter."
msgstr "ΕπιστÏέφει την τετÏαγωνική Ïίζα της παÏαμέτÏου."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8376,10 +8438,11 @@ msgstr ""
"Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"ΣυνάÏτηση Step( βαθμωτό(ÏŒÏιο), βαθμωτό(x) ).\n"
"\n"
@@ -8390,14 +8453,12 @@ msgid "Returns the tangent of the parameter."
msgstr "ΕπιστÏέφει την εφαπτομένη της παÏαμέτÏου."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the hyperbolic tangent of the parameter."
-msgstr "(Μόνο GLES3) ΕπιστÏέφει την υπεÏβολική εφαπτομένη της παÏαμέτÏου."
+msgstr "ΕπιστÏέφει την υπεÏβολική εφαπτομένη της παÏαμέτÏου."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Finds the truncated value of the parameter."
-msgstr "(Μόνο GLES3) Î’Ïίσκει την πεÏικομμένη τιμή της παÏαμέτÏου."
+msgstr "Î’Ïίσκει την πεÏικομμένη τιμή της παÏαμέτÏου."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds scalar to scalar."
@@ -8436,26 +8497,22 @@ msgid "Perform the texture lookup."
msgstr "Εκτέλεση αντιστοιχίας υφής."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Cubic texture uniform lookup."
-msgstr "Ενιαία μεταβλητή κυβικής υφής."
+msgstr "Αναζήτηση ενιαίας μεταβλητής κυβικής υφής."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "2D texture uniform lookup."
-msgstr "Ενιαία μεταβλητή 2D υφής."
+msgstr "Αναζήτηση ενιαίας μεταβλητής 2D υφής."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "2D texture uniform lookup with triplanar."
-msgstr "Ενιαία μεταβλητή 2D υφής."
+msgstr "ΤÏιεπίπεδη αναζήτηση ενιαίας μεταβλητής 2D υφής."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform function."
msgstr "ΣυνάÏτηση μετασχηματισμοÏ."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Calculate the outer product of a pair of vectors.\n"
"\n"
@@ -8465,7 +8522,7 @@ msgid ""
"whose number of rows is the number of components in 'c' and whose number of "
"columns is the number of components in 'r'."
msgstr ""
-"(Μόνο GLES3) Υπολογισμός Ï„Î±Î½Ï…ÏƒÏ„Î¹ÎºÎ¿Ï Î³Î¹Î½Î¿Î¼Î­Î½Î¿Ï… δÏο διανυσμάτων.\n"
+"Υπολογισμός Ï„Î±Î½Ï…ÏƒÏ„Î¹ÎºÎ¿Ï Î³Î¹Î½Î¿Î¼Î­Î½Î¿Ï… δÏο διανυσμάτων.\n"
"\n"
"Το OuterProduct αντιμετωπίζει την Ï€Ïώτη παÏάμετÏο «c» σαν διάνυσμα στήλης "
"και την δεÏτεÏη παÏάμετÏο «r» σαν διάνυσμα γÏαμμής και κάνει τον αλγεβÏικό "
@@ -8481,19 +8538,16 @@ msgid "Decomposes transform to four vectors."
msgstr "Αποσυνθέτει μετασχηματισμό σε τέσσεÏα διανÏσματα."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Calculates the determinant of a transform."
-msgstr "(Μόνο GLES3) Υπολογίζει την οÏίζουσα ενός μετασχηματισμοÏ."
+msgstr "Υπολογίζει την οÏίζουσα ενός μετασχηματισμοÏ."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Calculates the inverse of a transform."
-msgstr "(Μόνο GLES3) Υπολογίζει το αντίστÏοφο ενός μετασχηματισμοÏ."
+msgstr "Υπολογίζει το αντίστÏοφο ενός μετασχηματισμοÏ."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Calculates the transpose of a transform."
-msgstr "(Μόνο GLES3) Υπολογίζει το ανάστÏοφο ενός μετασχηματισμοÏ."
+msgstr "Υπολογίζει το ανάστÏοφο ενός μετασχηματισμοÏ."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies transform by transform."
@@ -8540,7 +8594,6 @@ msgid "Calculates the dot product of two vectors."
msgstr "Υπολογίζει το εσωτεÏικό γινόμενο 2 διανυσμάτων."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Returns the vector that points in the same direction as a reference vector. "
"The function has three vector parameters : N, the vector to orient, I, the "
@@ -8562,6 +8615,11 @@ msgid "Linear interpolation between two vectors."
msgstr "ΓÏαμμική παÏεμβολή Î¼ÎµÏ„Î±Î¾Ï 2 διανυσμάτων."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "ΓÏαμμική παÏεμβολή Î¼ÎµÏ„Î±Î¾Ï 2 διανυσμάτων."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr "Κανονικοποιεί ένα διάνυσμα."
@@ -8574,24 +8632,23 @@ msgid "1.0 / vector"
msgstr "1.0 / διάνυσμα"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Returns the vector that points in the direction of reflection ( a : incident "
"vector, b : normal vector )."
msgstr ""
-"ΕπιστÏέφει ένα διάνυσμα που δείχνει Ï€Ïος την κατεÏθυνση αντανάκλασης ( a : "
+"ΕπιστÏέφει το διάνυσμα που δείχνει Ï€Ïος την κατεÏθυνση ανάκλασης ( a : "
"διάνυσμα συμβάντος, b : κανονικό διάνυσμα )."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the vector that points in the direction of refraction."
-msgstr "ΕπιστÏέφει ένα διάνυσμα που δείχνει Ï€Ïος την κατεÏθυνση διάθλασης."
+msgstr "ΕπιστÏέφει το διάνυσμα που δείχνει Ï€Ïος την κατεÏθυνση διάθλασης."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8602,10 +8659,11 @@ msgstr ""
"Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8616,20 +8674,22 @@ msgstr ""
"Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"ΣυνάÏτηση Step( διάνυσμα(ÏŒÏιο), διάνυσμα(x) ).\n"
"\n"
"ΕπιστÏέφει 0.0 αν x < ÏŒÏιο αλλιώς 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"ΣυνάÏτηση Step( βαθμωτό(ÏŒÏιο), διάνυσμα(x) ).\n"
"\n"
@@ -8682,68 +8742,67 @@ msgstr ""
"και της κατεÏθυνσης της κάμεÏας (δώστε τις σχετικές εισόδους)."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
-msgstr "(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) Βαθμωτή παÏάγωγη συνάÏτηση."
+msgstr "(Μόνο σε σκίαση Τμήματος/Φωτός) Βαθμωτή παÏάγωγη συνάÏτηση."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "(Fragment/Light mode only) Vector derivative function."
-msgstr "(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) Διανυσματική παÏάγωγη συνάÏτηση."
+msgstr "(Μόνο σε σκίαση Τμήματος/Φωτός) Διανυσματική παÏάγωγη συνάÏτηση."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
"differencing."
msgstr ""
-"(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) (Διανυσματικά) ΠαÏάγωγος στο «x» με "
-"τοπική διαφόÏιση."
+"(Μόνο σε σκίαση Τμήματος/Φωτός) (Διανυσματικά) ΠαÏάγωγος στο «x» με τοπική "
+"διαφόÏιση."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
"differencing."
msgstr ""
-"(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) (Βαθμωτά) ΠαÏάγωγος στο «x» με τοπική "
+"(Μόνο σε σκίαση Τμήματος/Φωτός) (Βαθμωτά) ΠαÏάγωγος στο «x» με τοπική "
"διαφόÏιση."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
"differencing."
msgstr ""
-"(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) (Διανυσματικά) ΠαÏάγωγος στο «y» με "
-"τοπική διαφόÏιση."
+"(Μόνο σε σκίαση Τμήματος/Φωτός) (Διανυσματικά) ΠαÏάγωγος στο «y» με τοπική "
+"διαφόÏιση."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
"differencing."
msgstr ""
-"(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) (Βαθμωτά) ΠαÏάγωγος στο «y» με τοπική "
+"(Μόνο σε σκίαση Τμήματος/Φωτός) (Βαθμωτά) ΠαÏάγωγος στο «y» με τοπική "
"διαφόÏιση."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
-"(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) (Διανυσματικά) ΆθÏοισμα απόλυτης "
-"παÏαγώγου σε «x» και «y»."
+"(Μόνο σε σκίαση Τμήματος/Φωτός) (Διανυσματικά) ΆθÏοισμα απόλυτης παÏαγώγου "
+"σε «x» και «y»."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
-"(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) (Βαθμωτά) ΆθÏοισμα απόλυτης παÏαγώγου "
-"σε «x» και «y»."
+"(Μόνο σε σκίαση Τμήματος/Φωτός) (Βαθμωτά) ΆθÏοισμα απόλυτης παÏαγώγου σε «x» "
+"και «y»."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "VisualShader"
@@ -8919,6 +8978,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Τα Ï€Ïότυπα εξαγωγής για αυτή την πλατφόÏτμα λείπουν:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "ΔιαχείÏιση Ï€ÏοτÏπων εξαγωγής"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "Εξαγωγή με αποσφαλμάτωση"
@@ -9078,6 +9141,15 @@ msgid "Unnamed Project"
msgstr "Ανώνυμο έÏγο"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Εισαγωγή υπαÏÎºÏ„Î¿Ï Î­Ïγου"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "Αδυνατό το άνοιγμα του έÏγου στο «%s»."
@@ -9176,37 +9248,37 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
-"ΑφαίÏεση έÏγου από την λίστα; (Τα πεÏιεχόμενα το φακέλου δεν θα "
-"Ï„ÏοποποιηθοÏν)"
+"ΑφαίÏεση %d έÏγων από την λίστα;\n"
+"Τα πεÏιεχόμενα των καταλόγων των έÏγων δεν θα Ï„ÏοποποιηθοÏν."
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Language changed.\n"
"The interface will update after restarting the editor or project manager."
msgstr ""
"Η γλώσσα άλλαξε.\n"
-"Το πεÏιβάλλον θα αλλάξει την επόμενη φοÏά που θα ξεκινήσει ο επεξεÏγαστής ή "
-"ο διαχειÏιστής έÏγων."
+"Το πεÏιβάλλον θα αλλάξει μετά από επανεκκίνηση του επεξεÏγαστή ή του "
+"διαχειÏιστή έÏγων."
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Are you sure to scan %s folders for existing Godot projects?\n"
"This could take a while."
msgstr ""
-"Είστε έτοιμοι να σαÏώσετε %s φακέλους για υπαÏκτά έÏγα Godot. Είστε σίγουÏοι;"
+"Θέλετε να σαÏώσετε %s φακέλους για υπαÏκτά έÏγα Godot;\n"
+"Αυτό μποÏεί να πάÏει κάποια ÏŽÏα."
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "ΔιαχειÏιστής"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Λίστα έÏγων"
+#, fuzzy
+msgid "Projects"
+msgstr "ΈÏγο"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9221,19 +9293,14 @@ msgid "New Project"
msgstr "Îέο έÏγο"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Remove Missing"
-msgstr "ΑφαίÏεση σημείου"
+msgstr "ΑφαίÏεση Απόντων"
#: editor/project_manager.cpp
msgid "Templates"
msgstr "ΠÏότυπα"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Έξοδος"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Επανεκκίνηση τώÏα"
@@ -9242,13 +9309,12 @@ msgid "Can't run project"
msgstr "Δεν είναι δυνατή η εκτέλεση του έÏγου"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"You currently don't have any projects.\n"
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
"Δεν έχετε κανένα έÏγο.\n"
-"Θέλετε να εξεÏευνήσετε μεÏικά παÏαδείγματα στην βιβλιοθήκη πόÏων;"
+"Θέλετε να εξεÏευνήσετε μεÏικά επίσημα παÏαδείγματα στην βιβλιοθήκη πόÏων;"
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -9267,36 +9333,32 @@ msgid "Mouse Button"
msgstr "Κουμπί ποντικιοÏ"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
-"ΆκυÏο όνομα ενέÏγειας. Δεν μποÏεί να είναι άδειο ή να πεÏιέχει '/', ':', "
-"'=', '\\' ή '\"'."
+"ΆκυÏο όνομα ενέÏγειας. Δεν μποÏεί να είναι άδειο ή να πεÏιέχει «/», «:», "
+"«=», «\\» ή «\"»"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "Η ενέÏγεια '%s' υπάÏχει ήδη!"
+msgstr "ΥπάÏχει ήδη ενέÏγεια με το όνομα «%s»."
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
msgstr "Μετονομασία συμβάντος εισόδου"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Αλλαγή ονόματος κίνησης:"
+msgstr "Αλλαγή ÎεκÏής Ζώνης ΕνέÏγειας"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "ΠÏοσθήκη συμβάντος εισόδου"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "Συσκευή"
+msgstr "Όλες οι Συσκευές"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -9343,24 +9405,20 @@ msgid "Wheel Down Button"
msgstr "Ροδέλα κάτω"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "Ροδέλα πάνω"
+msgstr "ΑÏιστεÏÏŒ Κουμπί Ροδέλας"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "Δεξί κουμπί"
+msgstr "Δεξί Κουμπί Ροδέλας"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Κουμπί 6"
+msgstr "Κουμπί Χ 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Κουμπί 6"
+msgstr "Κουμπί Χ 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -9504,7 +9562,7 @@ msgstr "ΠαÏάκαμψη για..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "The editor must be restarted for changes to take effect."
-msgstr ""
+msgstr "Ο επεξεÏγαστής Ï€Ïέπει να επανεκκινηθεί για να εφαÏμοστοÏν οι αλλαγές."
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -9520,7 +9578,7 @@ msgstr "ΕνέÏγεια"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "ÎεκÏή Ζώνη"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -9563,14 +9621,12 @@ msgid "Locales Filter"
msgstr "ΦίλτÏο τοπικών Ïυθμίσεων"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show All Locales"
-msgstr "Εμφάνιση όλων των τοπικών Ïυθμίσεων"
+msgstr "Εμφάνιση Όλων των Τοπικών Ρυθμίσεων"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show Selected Locales Only"
-msgstr "Εμφάνιση μόνο επιλεγμένων τοπικών Ïυθμίσεων"
+msgstr "Εμφάνιση Μόνο Επιλεγμένων Τοπικών Ρυθμίσεων"
#: editor/project_settings_editor.cpp
msgid "Filter mode:"
@@ -9584,6 +9640,10 @@ msgstr "ΠεÏιοχές:"
msgid "AutoLoad"
msgstr "Αυτόματη φόÏτωση"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "ΠÏόσθετα"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Μηδέν"
@@ -9636,139 +9696,121 @@ msgstr "Επιλογή εικονικής μεθόδου"
msgid "Select Method"
msgstr "Επιλογή μεθόδου"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "Δεν ήταν δυνατή η εκτέλεση του εÏγαλείου PVRTC:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-"Δεν ήταν δυνατή η επαναφόÏτωση της εικόνας που έχει μετατÏαπεί με το "
-"εÏγαλείο PVRTC:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "Μετονομασία"
+msgstr "Ομαδική Μετονομασία"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "ΠÏόθεμα"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "Επίθεμα"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced Options"
-msgstr "Επιλογές κουμπώματος"
+msgstr "ΠÏοχωÏημένες Επιλογές"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "Αντικατάσταση"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Όνομα κόμβου:"
+msgstr "Όνομα κόμβου"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Όνομα Î³Î¿Î½Î¹ÎºÎ¿Ï ÎºÏŒÎ¼Î²Î¿Ï…, εάν είναι διαθέσιμο"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "ΕÏÏεση είδους κόμβου"
+msgstr "Είδος Κόμβου"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "ΤÏέχουσα σκηνή"
+msgstr "Όνομα Ï„Ïέχουσας σκηνής"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Όνομα ÏÎ¹Î¶Î¹ÎºÎ¿Ï ÎºÏŒÎ¼Î²Î¿Ï…:"
+msgstr "Όνομα ÏÎ¹Î¶Î¹ÎºÎ¿Ï ÎºÏŒÎ¼Î²Î¿Ï…"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"ΑκέÏαιος μετÏητής.\n"
+"ΣÏγκÏιση επιλογών μετÏητή."
#: editor/rename_dialog.cpp
msgid "Per Level counter"
-msgstr ""
+msgstr "ΜετÏητής Ανά Επίπεδο"
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+msgstr "Εάν ο μετÏητής επανεκκινείται για κάθε ομάδα παιδικών κόμβων"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "ΑÏχική τιμή μετÏητή"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Βήμα:"
+msgstr "Βήμα"
#: editor/rename_dialog.cpp
msgid "Amount by which counter is incremented for each node"
-msgstr ""
+msgstr "Τιμή κατά την οποία αυξάνεται ο μετÏητής ανά κόμβο"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "ΑναπλήÏωση"
#: editor/rename_dialog.cpp
msgid ""
"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Ελάχιστος αÏιθμός ψηφίων μετÏητή.\n"
+"Τα εναπομείναντα ψηφία συμπληÏώνονται με μπÏοστινά μηδενικά."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "Αλλαγή έκφÏασης"
+msgstr "Κανονικές ΕκφÏάσεις"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Post-Process"
-msgstr "Δεσμή ενεÏγειών μετ-επεξεÏγασίας:"
+msgstr "ΜετεπεξεÏγασία"
#: editor/rename_dialog.cpp
msgid "Keep"
-msgstr ""
+msgstr "ΔιατήÏηση"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "CamelCase σε under_scored"
#: editor/rename_dialog.cpp
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "under_scored σε CamelCase"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "ΧαÏακτήÏες"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "Πεζά"
+msgstr "Κάνε Πεζά"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "Κεφαλαία"
+msgstr "Κάνε Κεφαλαία"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "ΕπαναφοÏά μεγέθυνσης"
+msgstr "ΕπαναφοÏά"
#: editor/rename_dialog.cpp
msgid "Error"
@@ -9836,7 +9878,7 @@ msgstr "ΑÏχικοποίηση σκηνής ως παιδί"
#: editor/scene_tree_dock.cpp
msgid "Clear Script"
-msgstr "ΕκκαθάÏιση δεσμής ενεÏγειών"
+msgstr "ΕκκαθάÏιση Δέσμης ΕνεÏγειών"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -9857,19 +9899,21 @@ msgstr "ΑναπαÏαγωγή Κόμβων"
#: editor/scene_tree_dock.cpp
msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
msgstr ""
+"Αδυναμία επαναπÏοσδιοÏÎ¹ÏƒÎ¼Î¿Ï Î³Î¿Î½Î­Ï‰Î½ σε κληÏονομημένες σκηνές, δεν μποÏεί να "
+"αλλάξει η σειÏά των κόμβων."
#: editor/scene_tree_dock.cpp
msgid "Node must belong to the edited scene to become root."
msgstr ""
+"Ο κόμβος Ï€Ïέπει να ανήκει στην επεξεÏγαζόμενη σκηνή για να γίνει Ïιζικός."
#: editor/scene_tree_dock.cpp
msgid "Instantiated scenes can't become root"
-msgstr ""
+msgstr "Η Ïίζα δεν μποÏεί να είναι κλωνοποιημένη σκηνή"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make node as Root"
-msgstr "Βγάζει νόημα!"
+msgstr "Κάνε κόμβο Ïίζα"
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)?"
@@ -9882,8 +9926,8 @@ msgstr "Δεν είναι δυνατή η εκτέλεση με τον πηγαÎ
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on instanced scenes."
msgstr ""
-"Αυτή η λειτουÏγία δεν μποÏεί να γίνει σε σκηνές από τις οποίες έχουν "
-"δημιουÏγηθεί στιγμιότυπα."
+"Αυτή η λειτουÏγία δεν μποÏεί να γίνει σε κλωνοποιημένες σκηνές από τις "
+"οποίες έχουν δημιουÏγηθεί στιγμιότυπα."
#: editor/scene_tree_dock.cpp
msgid "Save New Scene As..."
@@ -9894,6 +9938,8 @@ msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
msgstr ""
+"Η απενεÏγοποίηση του «editable_instance» θα επαναφέÏει όλες τις ιδιότητες "
+"του κόμβου στις Ï€Ïοεπιλογές τους."
#: editor/scene_tree_dock.cpp
msgid "Editable Children"
@@ -9908,34 +9954,28 @@ msgid "Make Local"
msgstr "Κάνε τοπικό"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "New Scene Root"
-msgstr "Βγάζει νόημα!"
+msgstr "Îέα Ρίζα Σκηνής"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "ΔημιουÏγία κόμβου"
+msgstr "ΔημιουÏγία Î¡Î¹Î¶Î¹ÎºÎ¿Ï ÎšÏŒÎ¼Î²Î¿Ï…:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Σκηνή"
+msgstr "2D Σκηνή"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Σκηνή"
+msgstr "3D Σκηνή"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "ΕκκαθάÏιση κληÏονομικότητας"
+msgstr "ΠεÏιβάλλον χÏήστη"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Other Node"
-msgstr "ΔιαγÏαφή Κόμβου"
+msgstr "Άλλος Κόμβος"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -9949,13 +9989,18 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
-msgstr "ΣÏνδεση δεσμής ενεÏγειών"
+msgstr "ΣÏνδεση Δέσμης ΕνεÏγειών"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
msgstr "ΑφαίÏεση κόμβων"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Αλλαγή ονόματος θÏÏας εξόδου"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9980,37 +10025,32 @@ msgid "Clear Inheritance"
msgstr "ΕκκαθάÏιση κληÏονομικότητας"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open Documentation"
-msgstr "Άνοιγμα ηλεκτÏονικής τεκμηÏίωσης της Godot"
+msgstr "Άνοιγμα ΤεκμηÏίωσης"
#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "ΠÏοσθήκη κόμβου ως παιδί"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Expand/Collapse All"
-msgstr "ΣÏμπτηξη Όλων"
+msgstr "ΣÏμπτυξη Όλων"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Αλλαγή Ï„Ïπου"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "Άνοιγμα δεσμής ενεÏγειών"
+msgstr "Επέκταση Δέσμης ΕνεÏγειών"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
-msgstr "ΕπαναπÏοσδιοÏισμός γονέα κόμβου"
+msgstr "ΕπαναπÏοσδιοÏισμός Γονέα"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Scene Root"
-msgstr "Βγάζει νόημα!"
+msgstr "Κάνε Ρίζα Σκηνής"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -10029,9 +10069,8 @@ msgid "Delete (No Confirm)"
msgstr "ΔιαγÏαφή (ΧωÏίς επιβεβαίωση)"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Add/Create a New Node."
-msgstr "ΠÏοσθήκη/ΔημιουÏγία κόμβου"
+msgstr "ΠÏοσθήκη/ΔημιουÏγία Κόμβου."
#: editor/scene_tree_dock.cpp
msgid ""
@@ -10043,11 +10082,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Attach a new or existing script for the selected node."
-msgstr "ΣÏνδεση νέας ή υπαÏκτής δεσμής ενεÏγειών για τον επιλεγμένο κόμβο."
+msgstr "ΣÏνδεση νέας ή υπαÏκτής δέσμης ενεÏγειών για τον επιλεγμένο κόμβο."
#: editor/scene_tree_dock.cpp
msgid "Clear a script for the selected node."
-msgstr "ΕκκαθάÏιση δεσμής ενεÏγειών για τον επιλεγμένο κόμβο."
+msgstr "ΕκκαθάÏιση δέσμης ενεÏγειών για τον επιλεγμένο κόμβο."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10062,24 +10101,20 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "ΕκκαθάÏιση κληÏονομικότητας; (Δεν γίνεται ανέÏαιση!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
-msgstr "Εναλλαγή οÏατότητας"
+msgstr "Εναλλαγή ΟÏατότητας"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Unlock Node"
-msgstr "Επιλογή κόμβου"
+msgstr "Ξεκλείδωμα Κόμβου"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Button Group"
-msgstr "Κουμπί 7"
+msgstr "Ομαδοποίηση Κουμπιών"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "(Connecting From)"
-msgstr "Σφάλμα σÏνδεσης"
+msgstr "(Πηγή ΣÏνδεση)"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
@@ -10088,50 +10123,49 @@ msgstr "ΠÏοειδοποίηση διαμόÏφωσης κόμβου:"
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
-"Ο κόμβος έχει συνδέσεις και ομάδες\n"
+"Ο κόμβος έχει συνδέσεις και ομάδες.\n"
"Πατήστε για να δείξετε την πλατφόÏμα σημάτων."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"Ο κόμβος έχει συνδέσεις\n"
"Πατήστε για να δείξετε την πλατφόÏμα σημάτων."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"Ο κόμβος έχει και ομάδες\n"
"Πατήστε για να δείξετε την πλατφόÏμα σημάτων."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Open Script:"
-msgstr "Άνοιγμα δεσμής ενεÏγειών"
+msgstr "Άνοιγμα Δέσμης ΕνεÏγειών:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
-"Ο κόμβος είναι κλειδομένος.\n"
-"Πατήστε για ξεκλείδωμα"
+"Ο κόμβος είναι κλειδωμένος.\n"
+"Πατήστε για ξεκλείδωμα."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
"Τα παιδιά δεν είναι επιλέξιμα.\n"
-"Πατήστε για να τα κάνετε επιλέξιμα"
+"Πατήστε για να τα κάνετε επιλέξιμα."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -10142,6 +10176,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"Το AnimationPlayer είναι καÏφωμένο.\n"
+"Πατήστε για ξεκάÏφωμα."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -10164,39 +10200,32 @@ msgid "Select a Node"
msgstr "Επιλέξτε έναν κόμβο"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is empty."
-msgstr "Η διαδÏομή είναι άδεια"
+msgstr "Άδεια διαδÏομή."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty."
-msgstr "Η διαδÏομή αποθήκευσης είναι άδεια!"
+msgstr "Άδειο όνομα αÏχείου."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is not local."
-msgstr "Η διαδÏομή δεν είναι τοπική"
+msgstr "Μη τοπική διαδÏομή."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid base path."
-msgstr "Μη έγκυÏη βασική διαδÏομή"
+msgstr "ΆκυÏη βασική διαδÏομή."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "A directory with the same name exists."
-msgstr "ΥπάÏχει ήδη ένας κατάλογος με το ίδιο όνομα"
+msgstr "ΥπαÏκτός ομώνυμος κατάλογος."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid extension."
-msgstr "Μη έγκυÏη επέκταση"
+msgstr "ΆκυÏη επέκταση."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Wrong extension chosen."
-msgstr "Επιλέχθηκε εσφαλμένη επέκταση"
+msgstr "Επιλέχθηκε εσφαλμένη επέκταση."
#: editor/script_create_dialog.cpp
msgid "Error loading template '%s'"
@@ -10204,66 +10233,60 @@ msgstr "Σφάλμα κατά την φόÏτωση Ï€ÏοτÏπου '%s'"
#: editor/script_create_dialog.cpp
msgid "Error - Could not create script in filesystem."
-msgstr ""
-"Σφάλμα - Δεν ήταν δυνατή η δημιουÏγία δεσμής ενεÏγειών στο σÏστημα αÏχείων."
+msgstr "Σφάλμα - Αδυναμία δημιουÏγίας δέσμης ενεÏγειών στο σÏστημα αÏχείων."
#: editor/script_create_dialog.cpp
msgid "Error loading script from %s"
-msgstr "Σφάλμα κατά την φόÏτωση δεσμής ενεÏγειών από %s"
+msgstr "Σφάλμα κατά την φόÏτωση δέσμής ενεÏγειών από %s"
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Αντικατάσταση"
#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "Δ/Υ"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script / Choose Location"
-msgstr "Άνοιγμα επεξεÏγαστή δεσμής ενεÏγειών"
+msgstr "Άνοιγμα Δέσμης ΕνεÏγειών / Επιλογή Θέσης"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
-msgstr "Άνοιγμα δεσμής ενεÏγειών"
+msgstr "Άνοιγμα Δέσμης ΕνεÏγειών"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "File exists, it will be reused."
-msgstr "Το αÏχείο υπάÏχει, θα επαναχÏησιμοποιηθεί"
+msgstr "ΥπαÏκτό αÏχείο, θα επαναχÏησιμοποιηθεί."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid class name."
-msgstr "Μη έγκυÏο όνομα κλάσης"
+msgstr "ΆκυÏο όνομα κλάσης."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid inherited parent name or path."
-msgstr "Μη έγκυÏο κληÏονομημένο όνομα ή διαδÏομή γονέα"
+msgstr "ΆκυÏο όνομα κληÏονομημένου γονέα ή διαδÏομή."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script is valid."
-msgstr "ΈγκυÏη δεσμή ενεÏγειών"
+msgstr "ΈγκυÏη δέσμη ενεÏγειών."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr "ΕπιτÏεπόμενα: a-z, A-Z, 0-9 και _"
+msgstr "ΕπιτÏεπόμενα: a-z, A-Z, 0-9, _ και ."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in script (into scene file)."
-msgstr "Ενσωμάτωση (στο αÏχείο σκηνής)"
+msgstr "Ενσωμάτωση (στο αÏχείο σκηνής)."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will create a new script file."
-msgstr "ΔημιουÏγία νέου αÏχείου δεσμής ενεÏγειών"
+msgstr "Θα δημιουÏγήσει νέο αÏχείο δέσμης ενεÏγειών."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will load an existing script file."
-msgstr "ΦόÏτωση υπαÏÎºÏ„Î¿Ï Î±Ïχείου δεσμής ενεÏγειών"
+msgstr "Θα φοÏτώσει υπαÏκτό αÏχείο δέσμης ενεÏγειών."
#: editor/script_create_dialog.cpp
msgid "Language"
@@ -10287,7 +10310,7 @@ msgstr "Ενσωμάτωση"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
-msgstr "ΣÏνδεση δεσμής ενεÏγειών κόμβου"
+msgstr "ΣÏνδεση Δέσμης ΕνεÏγειών Κόμβου"
#: editor/script_editor_debugger.cpp
msgid "Remote "
@@ -10298,9 +10321,8 @@ msgid "Bytes:"
msgstr "Ψηφιολέξεις:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Stack Trace"
-msgstr "Στοίβαξη καÏέ"
+msgstr "Ίχνος Στοίβας"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -10398,7 +10420,7 @@ msgstr "ΟÏισμός από το δέντÏο"
#: editor/script_editor_debugger.cpp
msgid "Export measures as CSV"
-msgstr ""
+msgstr "Εξαγωγή μετÏικών ως CSV"
#: editor/settings_config_dialog.cpp
#, fuzzy
@@ -10416,6 +10438,10 @@ msgid "Change Shortcut"
msgstr "Αλλαγή αγκυÏών"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Ρυθμίσεις επεξεÏγαστή"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "ΣυντομεÏσεις"
@@ -10570,11 +10596,11 @@ msgstr "Η παÏάμετÏος step είναι μηδέν!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
-msgstr "Δεν είναι δεσμή ενεÏγειών με στιγμιότυπο"
+msgstr "Δεν είναι δέσμη ενεÏγειών με στιγμιότυπο"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not based on a script"
-msgstr "Δεν είναι βασισμένο σε δεσμή ενεÏγειών"
+msgstr "Δεν είναι βασισμένο σε δέσμη ενεÏγειών"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not based on a resource file"
@@ -10587,12 +10613,12 @@ msgstr "ΆκυÏη μοÏφή Î»ÎµÎ¾Î¹ÎºÎ¿Ï ÏƒÏ„Î¹Î³Î¼Î¹Î¿Ï„Ïπων (λείπÎ
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary format (can't load script at @path)"
msgstr ""
-"ΆκυÏη μοÏφή Î»ÎµÎ¾Î¹ÎºÎ¿Ï ÏƒÏ„Î¹Î³Î¼Î¹Î¿Ï„Ïπων (αδÏνατη η φόÏτωση της δεσμής ενεÏγειών στο "
+"ΆκυÏη μοÏφή Î»ÎµÎ¾Î¹ÎºÎ¿Ï ÏƒÏ„Î¹Î³Î¼Î¹Î¿Ï„Ïπων (αδÏνατη η φόÏτωση της δέσμης ενεÏγειών στο "
"@path)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary format (invalid script at @path)"
-msgstr "ΆκυÏη μοÏφή Î»ÎµÎ¾Î¹ÎºÎ¿Ï ÏƒÏ„Î¹Î³Î¼Î¹Î¿Ï„Ïπων (Μη έγκυÏη δεσμή ενεÏγειών στο @path)"
+msgstr "ΆκυÏη μοÏφή Î»ÎµÎ¾Î¹ÎºÎ¿Ï ÏƒÏ„Î¹Î³Î¼Î¹Î¿Ï„Ïπων (Μη έγκυÏη δέσμη ενεÏγειών στο @path)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary (invalid subclasses)"
@@ -10847,10 +10873,30 @@ msgid "Set Variable Type"
msgstr "ΟÏισμός Ï„Ïπου μεταβλητής"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Δεν μποÏεί να συγχέεται με υπαÏκτό ενσωματωμένο όνομα Ï„Ïπου."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "ΔημιουÏγία νέου οÏθογωνίου."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Μεταβλητές:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "ΔημιουÏγία νέου οÏθογωνίου."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "ΔημιουÏγία νέου πολυγώνου."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Το όνομα δεν είναι έγκυÏο αναγνωÏιστικό:"
@@ -10968,7 +11014,7 @@ msgstr "ΣÏνδεση κόμβων"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
-msgstr "Η δεσμή ενεÏγειών έχει ήδη συνάÏτηση '%s'"
+msgstr "Η δέσμη ενεÏγειών έχει ήδη συνάÏτηση «%s»"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Input Value"
@@ -11045,10 +11091,6 @@ msgid "Cut Nodes"
msgstr "Αποκοπή κόμβων"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Επικόλληση κόμβων"
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "Μέλη"
@@ -11091,11 +11133,11 @@ msgstr ": ΆκυÏοι παÏάμετÏοι: "
#: modules/visual_script/visual_script_nodes.cpp
msgid "VariableGet not found in script: "
-msgstr "Το VariableGet δεν βÏέθηκε στη δεσμή ενεÏγειών: "
+msgstr "Το VariableGet δεν βÏέθηκε στη δέσμη ενεÏγειών: "
#: modules/visual_script/visual_script_nodes.cpp
msgid "VariableSet not found in script: "
-msgstr "Το VariableSet δεν βÏέθηκε στη δεσμή ενεÏγειών: "
+msgstr "Το VariableSet δεν βÏέθηκε στη δέσμη ενεÏγειών: "
#: modules/visual_script/visual_script_nodes.cpp
msgid "Custom node has no _step() method, can't process graph."
@@ -11340,8 +11382,8 @@ msgid ""
"scenes). The first created one will work, while the rest will be ignored."
msgstr ""
"Μόνο ένα οÏατό CanvasModulate επιτÏέπεται σε κάθε σκηνή (ή σÏνολο "
-"στιγμιότυπων σκηνών). Το Ï€Ïώτο που δημιουÏγήθηκε θα δουλέψει, ενώ τα άλλα θα "
-"αγνοηθοÏν."
+"κλωνοποιημένων σκηνών). Το Ï€Ïώτο που δημιουÏγήθηκε θα δουλέψει, ενώ τα άλλα "
+"θα αγνοηθοÏν."
#: scene/2d/collision_object_2d.cpp
#, fuzzy
@@ -11760,7 +11802,7 @@ msgstr ""
msgid ""
"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
msgstr ""
-"Μόνο ένα WorldEnvironment επιτÏέπεται σε κάθε σκηνή (ή σÏνολο στιγμιοτÏπων "
+"Μόνο ένα WorldEnvironment επιτÏέπεται σε κάθε σκηνή (ή σÏνολο κλωνοποιημένων "
"σκηνών)."
#: scene/3d/world_environment.cpp
@@ -11916,22 +11958,6 @@ msgstr ""
"μέγεθος. Αλλιώς, κάντε το ένα RenderTarget και οÏίστε το internal texture σε "
"έναν κόμβο για απεικόνιση."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Σφάλμα κατά την αÏχικοποίηση του FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Άγνωστη μοÏφή γÏαμματοσειÏάς."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Σφάλμα κατά την φόÏτωση της γÏαμματοσειÏάς."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Μη έγκυÏο μέγεθος γÏαμματοσειÏάς."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Είσοδος"
@@ -11967,6 +11993,110 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "No Matches"
+#~ msgstr "Δεν υπάÏχουν αντιστοιχίες"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "ΑδÏνατο το άνοιγμα του αÏχείου file_type_cache.cch για εγγÏαφή, παÏάλειψη "
+#~ "αποθήκευσης cache Ï„Ïπου αÏχείου!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "Δεν ήταν δυνατή η πλοήγηση στο '%s', καθώς δεν βÏέθηκε στο σÏστημα "
+#~ "αÏχείων!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Σφάλμα κατά την φόÏτωση εικόνας:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Δεν υπάÏχουν εικονοστοιχεία με διαφάνεια >128 στην εικόνα..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Ο γονέας δεν έχει συμπαγείς επιφάνειες για να συμπληÏωθοÏν."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Δεν ήταν δυνατή η χαÏτογÏάφηση της πεÏιοχής."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Οι επιφάνειες έχουν μηδενικό εμβαδόν!"
+
+#~ msgid "No faces!"
+#~ msgstr "Δεν υπάÏχουν επιφάνειες!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Σφάλμα φόÏτωσης αÏχείου."
+
+#~ msgid "Error could not load file."
+#~ msgstr "Σφάλμα φόÏτωσης αÏχείου."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Φαινόμενο ÎτόπλεÏ"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Επιλογή λειτουÏγίας (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "ΛειτουÏγία μετακίνησης (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "ΛειτουÏγία πεÏιστÏοφής (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "ΛειτουÏγία κλιμάκωσης (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Τοπικές συντεταγμένες"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "ΛειτουÏγία κουμπώματος (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "ΕÏγαλείο επιλογής"
+
+#~ msgid "Tool Move"
+#~ msgstr "ΕÏγαλείο μετακίνησης"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "ΕÏγαλείο πεÏιστÏοφής"
+
+#~ msgid "Tool Scale"
+#~ msgstr "ΕÏγαλείο κλιμάκωσης"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "ΑφαίÏεση όλων των απόντων έÏγων από την λίστα; (Τα πεÏιεχόμενα το φακέλου "
+#~ "δεν θα Ï„ÏοποποιηθοÏν)"
+
+#~ msgid "Project List"
+#~ msgstr "Λίστα έÏγων"
+
+#~ msgid "Exit"
+#~ msgstr "Έξοδος"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "Δεν ήταν δυνατή η εκτέλεση του εÏγαλείου PVRTC:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr ""
+#~ "Δεν ήταν δυνατή η επαναφόÏτωση της εικόνας που έχει μετατÏαπεί με το "
+#~ "εÏγαλείο PVRTC:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Σφάλμα κατά την αÏχικοποίηση του FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Άγνωστη μοÏφή γÏαμματοσειÏάς."
+
+#~ msgid "Error loading font."
+#~ msgstr "Σφάλμα κατά την φόÏτωση της γÏαμματοσειÏάς."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Μη έγκυÏο μέγεθος γÏαμματοσειÏάς."
+
#~ msgid "Previous Folder"
#~ msgstr "ΠÏοηγοÏμενος φάκελος"
@@ -12738,9 +12868,6 @@ msgstr ""
#~ msgid "Erase selection"
#~ msgstr "ΔιαγÏαφή επιλογής"
-#~ msgid "Could not find tile:"
-#~ msgstr "Δεν ήταν δυνατή η εÏÏεση πλακιδίου:"
-
#~ msgid "Item name or ID:"
#~ msgstr "Όνομα στοιχείου ή αναγνωÏιστικοÏ:"
@@ -13003,9 +13130,6 @@ msgstr ""
#~ msgid "Info"
#~ msgstr "ΠληÏοφοÏίες"
-#~ msgid "Re-Import..."
-#~ msgstr "Εκ νέου εισαγωγή..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "Δεν υπάÏχουν μάσκες bit για εισαγωγή!"
@@ -13394,9 +13518,6 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "ΣτεÏεοφωνικό"
-#~ msgid "Window"
-#~ msgstr "ΠαÏάθυÏο"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Κλιμάκωση to %s%%."
diff --git a/editor/translations/eo.po b/editor/translations/eo.po
index c3b755c31e..7434ca1246 100644
--- a/editor/translations/eo.po
+++ b/editor/translations/eo.po
@@ -4,18 +4,19 @@
# This file is distributed under the same license as the Godot source code.
# Scott Starkey <yekrats@gmail.com>, 2019.
# AlexHoratio <yukithetupper@gmail.com>, 2019.
+# Teashrock <kajitsu22@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2019-07-02 10:48+0000\n"
-"Last-Translator: AlexHoratio <yukithetupper@gmail.com>\n"
+"PO-Revision-Date: 2019-08-29 13:34+0000\n"
+"Last-Translator: Teashrock <kajitsu22@gmail.com>\n"
"Language-Team: Esperanto <https://hosted.weblate.org/projects/godot-engine/"
"godot/eo/>\n"
"Language: eo\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8-bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -57,7 +58,6 @@ msgid "On call to '%s':"
msgstr "En voko al '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Libera"
@@ -468,12 +468,11 @@ msgstr "Averto: Redaktanti importis animadon"
#: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Select All"
-msgstr ""
+msgstr "Elektaro ĉiuj"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select None"
-msgstr "Nur Elektaro"
+msgstr "Elektaro nur"
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
@@ -650,16 +649,18 @@ msgid "Line Number:"
msgstr "Lineo-Numeron:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr ""
+msgid "Replaced %d occurrence(s)."
+msgstr "AnstataÅ­igis %d apero(j)n."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Ne Rezultoj"
+#, fuzzy
+msgid "%d match."
+msgstr "Trovis %d matĉo(j)n."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "AnstataÅ­igis %d apero(j)n."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Trovis %d matĉo(j)n."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -712,21 +713,24 @@ msgstr "Lineoj kaj kolumnoj numeroj."
#: editor/connections_dialog.cpp
msgid "Method in target node must be specified."
-msgstr ""
+msgstr "Metodo en celo nodo devas esti specifita."
#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
msgstr ""
+"Celo metodo maltrovita. Indiku ekzistanta metodo aÅ­ ligu la skripto al celo "
+"nodo."
#: editor/connections_dialog.cpp
msgid "Connect to Node:"
-msgstr ""
+msgstr "Konektu al nodo:"
#: editor/connections_dialog.cpp
msgid "Connect to Script:"
-msgstr ""
+msgstr "Konektu al skripto:"
#: editor/connections_dialog.cpp
msgid "From Signal:"
@@ -734,13 +738,13 @@ msgstr ""
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
-msgstr ""
+msgstr "La sceno ne enhavas ajnan skriptojn."
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
msgid "Add"
-msgstr ""
+msgstr "Aldonu"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/editor_feature_profile.cpp editor/groups_editor.cpp
@@ -751,15 +755,15 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
-msgstr ""
+msgstr "Forigu"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr ""
+msgstr "Aldonu alvoko argumento:"
#: editor/connections_dialog.cpp
msgid "Extra Call Arguments:"
-msgstr ""
+msgstr "Aldona argumentoj de alvoko:"
#: editor/connections_dialog.cpp
msgid "Advanced"
@@ -767,7 +771,7 @@ msgstr "Altnivela"
#: editor/connections_dialog.cpp
msgid "Deferred"
-msgstr ""
+msgstr "Diferita"
#: editor/connections_dialog.cpp
msgid ""
@@ -776,15 +780,15 @@ msgstr ""
#: editor/connections_dialog.cpp
msgid "Oneshot"
-msgstr ""
+msgstr "Unu pafo"
#: editor/connections_dialog.cpp
msgid "Disconnects the signal after its first emission."
-msgstr ""
+msgstr "Malkonektas la signalo post Äia unua emisio."
#: editor/connections_dialog.cpp
msgid "Cannot connect signal"
-msgstr ""
+msgstr "Ne povas konekti signalo"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
@@ -798,27 +802,27 @@ msgstr ""
#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Close"
-msgstr ""
+msgstr "FermiÄu"
#: editor/connections_dialog.cpp
msgid "Connect"
-msgstr ""
+msgstr "Konektu"
#: editor/connections_dialog.cpp
msgid "Signal:"
-msgstr ""
+msgstr "Signalo:"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
-msgstr ""
+msgstr "Konektu '%s' al '%s'"
#: editor/connections_dialog.cpp
msgid "Disconnect '%s' from '%s'"
-msgstr ""
+msgstr "Malkonektu '%s' de '%s'"
#: editor/connections_dialog.cpp
msgid "Disconnect all from signal: '%s'"
-msgstr ""
+msgstr "Malkonektu ĉiuj de signalo: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -827,11 +831,11 @@ msgstr ""
#: editor/connections_dialog.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Disconnect"
-msgstr ""
+msgstr "Malkonektu"
#: editor/connections_dialog.cpp
msgid "Connect a Signal to a Method"
-msgstr ""
+msgstr "Konektu la signalo al metodo"
#: editor/connections_dialog.cpp
msgid "Edit Connection:"
@@ -843,7 +847,7 @@ msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
-msgstr ""
+msgstr "Signaloj"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
@@ -851,56 +855,55 @@ msgstr ""
#: editor/connections_dialog.cpp
msgid "Disconnect All"
-msgstr ""
+msgstr "Malkonektu ĉiuj"
#: editor/connections_dialog.cpp
msgid "Edit..."
-msgstr ""
+msgstr "Redaktu..."
#: editor/connections_dialog.cpp
msgid "Go To Method"
-msgstr ""
+msgstr "Iru al metodo"
#: editor/create_dialog.cpp
msgid "Change %s Type"
-msgstr ""
+msgstr "ÅœanÄu la tipon de %s"
#: editor/create_dialog.cpp editor/project_settings_editor.cpp
msgid "Change"
-msgstr ""
+msgstr "ÅœanÄu"
#: editor/create_dialog.cpp
msgid "Create New %s"
-msgstr ""
+msgstr "Kreu novan %s"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp
msgid "Favorites:"
-msgstr ""
+msgstr "Favoritaj:"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
-msgstr ""
+msgstr "Serĉo:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
-msgstr ""
+msgstr "Matĉoj:"
#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
-msgstr ""
+msgstr "Priskribo:"
#: editor/dependency_editor.cpp
msgid "Search Replacement For:"
@@ -925,20 +928,20 @@ msgstr ""
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Dependencies"
-msgstr ""
+msgstr "Dependecoj"
#: editor/dependency_editor.cpp
msgid "Resource"
-msgstr ""
+msgstr "Rimedo"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
-msgstr ""
+msgstr "Pado"
#: editor/dependency_editor.cpp
msgid "Dependencies:"
-msgstr ""
+msgstr "Dependecoj:"
#: editor/dependency_editor.cpp
msgid "Fix Broken"
@@ -977,7 +980,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -1013,7 +1016,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1102,14 +1105,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1126,7 +1129,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1609,12 +1612,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2006,6 +2008,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2302,6 +2308,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2395,6 +2409,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2480,20 +2498,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2526,24 +2540,33 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Redaktu..."
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2623,12 +2646,12 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
msgstr ""
#: editor/editor_node.cpp
@@ -2664,14 +2687,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2679,12 +2702,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3122,7 +3146,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3139,6 +3163,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3200,12 +3228,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3219,13 +3245,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3310,19 +3340,11 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3355,11 +3377,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3418,6 +3440,10 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3481,6 +3507,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Krei"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3541,6 +3572,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3548,12 +3587,20 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Delete Group"
+msgstr ""
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3566,11 +3613,11 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
+msgid "Group Editor"
msgstr ""
#: editor/groups_editor.cpp
@@ -3777,7 +3824,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4519,10 +4566,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4535,14 +4578,43 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Tempo:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4619,8 +4691,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4641,7 +4716,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4653,6 +4728,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4809,6 +4888,10 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4837,6 +4920,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4857,14 +4941,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -4888,6 +4975,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4904,11 +4992,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4921,6 +5004,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5128,16 +5216,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5448,14 +5526,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5539,19 +5609,24 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "La sceno ne enhavas ajnan skriptojn."
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't contain geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5878,7 +5953,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -5984,11 +6058,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6012,7 +6082,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6093,6 +6163,10 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6130,11 +6204,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6222,6 +6296,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6288,6 +6366,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6322,92 +6401,97 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
+msgid "Fold/Unfold Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
+msgid "Fold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
+msgid "Unfold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
+msgid "Clone Down"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
+msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Skali Elektaron"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
+msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6645,7 +6729,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6699,7 +6783,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6710,27 +6794,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6774,22 +6838,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6844,7 +6892,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7137,10 +7185,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7225,11 +7269,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7347,8 +7391,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7627,6 +7671,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7703,15 +7751,16 @@ msgid "Duplicate Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Delete Nodes"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Visual Shader Input Type Changed"
+msgid "Delete Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
+msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7727,6 +7776,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8085,7 +8138,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8094,7 +8147,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8253,6 +8306,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8278,7 +8335,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8287,7 +8344,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8296,14 +8353,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8348,6 +8405,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8555,6 +8619,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8701,6 +8769,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8770,8 +8846,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8791,7 +8867,7 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
+msgid "Projects"
msgstr ""
#: editor/project_manager.cpp
@@ -8815,10 +8891,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9152,6 +9224,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9204,14 +9280,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9497,6 +9565,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9614,19 +9686,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9717,6 +9789,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -9905,6 +9981,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10315,10 +10395,27 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Kreu novan %s"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10503,10 +10600,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11236,22 +11329,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Nekonata tipara formo."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Eraro dum Åargante tiparon."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Nevalida tipara grando."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Enigo"
@@ -11285,3 +11362,15 @@ msgstr ""
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
msgstr ""
+
+#~ msgid "No Matches"
+#~ msgstr "Ne Rezultoj"
+
+#~ msgid "Unknown font format."
+#~ msgstr "Nekonata tipara formo."
+
+#~ msgid "Error loading font."
+#~ msgstr "Eraro dum Åargante tiparon."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Nevalida tipara grando."
diff --git a/editor/translations/es.po b/editor/translations/es.po
index 2450229f9a..08a6012cc2 100644
--- a/editor/translations/es.po
+++ b/editor/translations/es.po
@@ -44,7 +44,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-21 11:06+0000\n"
+"PO-Revision-Date: 2019-08-22 17:23+0000\n"
"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/"
"godot/es/>\n"
@@ -53,19 +53,19 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "El argumento para convert() no es correcto, utiliza constantes TYPE_*."
+msgstr "El argumento para convert() es invalido, utiliza constantes TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
-"No hay suficientes bytes para decodificar bytes, o el formato no es válido."
+"No hay suficientes bytes para decodificar bytes, o el formato es invalido."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
@@ -96,7 +96,6 @@ msgid "On call to '%s':"
msgstr "En llamada a '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Libre"
@@ -165,29 +164,24 @@ msgid "Anim Change Call"
msgstr "Cambiar Llamada de Animación"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Cambiar Tiempo del Fotograma Clave de Animación"
+msgstr "Cambiar Tiempo de Múltiples Keyframes de Animación"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Cambiar Transición de Animación"
+msgstr "Cambiar Múltiples Transiciones de Animación"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Cambiar Transformación de la Animación"
+msgstr "Cambiar Múltiples Transforms de Animación"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Cambiar Valor de la Clave de Animación"
+msgstr "Cambiar Valor de Múltiples Keyframes de Animación"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "Cambiar Llamada de Animación"
+msgstr "Cambiar Múltiples Llamadas de Animación"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -464,7 +458,7 @@ msgstr "Método no encontrado en el objeto: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr "Mover Claves de Anim"
+msgstr "Mover Claves de Animación"
#: editor/animation_track_editor.cpp
msgid "Clipboard is empty"
@@ -695,16 +689,18 @@ msgid "Line Number:"
msgstr "Número de Línea:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "Se encontraron %d coincidencias."
+msgid "Replaced %d occurrence(s)."
+msgstr "%d ocurrencia(s) reemplazada(s)."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Sin Coincidencias"
+#, fuzzy
+msgid "%d match."
+msgstr "Se encontraron %d coincidencias."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d ocurrencia(s) reemplazada(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Se encontraron %d coincidencias."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -933,8 +929,7 @@ msgstr "Favoritos:"
msgid "Recent:"
msgstr "Recientes:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1036,7 +1031,7 @@ msgstr ""
"funcionar.\n"
"¿Eliminarlos de todos modos? (irreversible)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "No se puede eliminar:"
@@ -1072,7 +1067,7 @@ msgstr "¿Eliminar permanentemente %d ítem(s)? (¡No se puede deshacer!)"
msgid "Show Dependencies"
msgstr "Mostrar Dependencias"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Explorador de Recursos Huérfanos"
@@ -1161,14 +1156,16 @@ msgid "License"
msgstr "Licencia"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Licencia de Terceros"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine se basa en una serie de bibliotecas libres y de código abierto "
@@ -1189,7 +1186,8 @@ msgid "Licenses"
msgstr "Licencias"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Error al abrir el archivo empaquetado, no tiene formato zip."
#: editor/editor_asset_installer.cpp
@@ -1686,12 +1684,11 @@ msgid "New"
msgstr "Nuevo"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importar"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Exportar"
@@ -1828,32 +1825,28 @@ msgid "Move Favorite Down"
msgstr "Bajar Favorito"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Ir a la carpeta padre."
+msgstr "Ir a la carpeta anterior."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Ir a la carpeta padre."
+msgstr "Ir a la carpeta siguiente."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "Ir a la carpeta padre."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Buscar archivos"
+msgstr "Refrescar archivos."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "Eliminar carpeta actual de favoritos."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "Ver/Ocultar archivos ocultos."
+msgstr "Mostrar/Ocultar archivos ocultos."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
@@ -2097,6 +2090,11 @@ msgstr "Limpiar"
msgid "Clear Output"
msgstr "Limpiar Salida"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "Ventana"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "La exportación del proyecto falló con el código de error %d."
@@ -2422,6 +2420,15 @@ msgid "Pick a Main Scene"
msgstr "Selecciona una Escena Principal"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Cerrar Escena"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Cerrar Escena"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"No se pudo activar el plugin addon: Ha fallado el análisis de la "
@@ -2541,6 +2548,11 @@ msgstr "Reproducir Esta Escena"
msgid "Close Tab"
msgstr "Cerrar Pestaña"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Cerrar Pestaña"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Cerrar Otras Pestañas"
@@ -2625,6 +2637,10 @@ msgstr "Nueva Escena Heredada..."
msgid "Open Scene..."
msgstr "Abrir Escena..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Abrir Reciente"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Guardar Escena"
@@ -2634,14 +2650,6 @@ msgid "Save All Scenes"
msgstr "Guardar Todas las Escenas"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Cerrar Escena"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Abrir Reciente"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Convertir a..."
@@ -2671,25 +2679,36 @@ msgstr "Revertir Escena"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Herramientas variadas de proyecto o escena."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Proyecto"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Ajustes del proyecto"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Herramientas"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr "Exportar…"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Instalar plantilla de compilación de Android"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Abrir Carpeta de Datos del Proyecto"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Herramientas"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Instalar plantilla de compilación de Android"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Explorador de Recursos Huérfanos"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2787,12 +2806,13 @@ msgstr ""
"Cuando se use remotamente en un dispositivo, esto es mas eficiente con un "
"sistema de archivos de red."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Editor"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Configuración del Editor"
#: editor/editor_node.cpp
@@ -2830,14 +2850,16 @@ msgid "Open Editor Settings Folder"
msgstr "Abrir Carpeta de Configuración del Editor"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "Administrar Características del Editor"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Administrar Plantillas de Exportación"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Ayuda"
@@ -2845,12 +2867,13 @@ msgstr "Ayuda"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Buscar"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Documentación Online"
@@ -3131,9 +3154,8 @@ msgid "Calls"
msgstr "Llamadas"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Editar Tema"
+msgstr "Editar Texto:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3308,7 +3330,8 @@ msgid "Import From Node:"
msgstr "Importar Desde Nodo:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Volver a Descargar"
#: editor/export_template_manager.cpp
@@ -3325,6 +3348,10 @@ msgid "Download"
msgstr "Descargar"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(No encontrado)"
@@ -3388,12 +3415,10 @@ msgid "No response."
msgstr "No responde."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Petición Fallida."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Redireccionar Loop."
@@ -3407,15 +3432,22 @@ msgid "Download Complete."
msgstr "Descarga Completada."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "No se pudo guardar el tema a un archivo:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Fallo la instalación de plantillas. Las plantillas problemáticas pueden ser "
"encontradas en '%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Error al solicitar url: "
#: editor/export_template_manager.cpp
@@ -3501,23 +3533,11 @@ msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
"Seleccionar un mirror de la lista: (Shift + Clic: Abrir en el Navegador)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"No se puede abrir file_type_cache.cch para escribir, no se guardará el cache "
-"de tipos de archivo!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Favoritos"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"¡No se puede navegar a '%s' ya que no se ha encontrado en el sistema de "
-"archivos!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Estado: No se pudo importar el archivo. Por favor, arregla el archivo y "
@@ -3552,14 +3572,14 @@ msgid "Provided name contains invalid characters."
msgstr "El nombre contiene caracteres inválidos."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "El nombre contiene caracteres inválidos."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Ya existe un archivo o carpeta con este nombre."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "El nombre contiene caracteres inválidos."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Renombrar archivo:"
@@ -3615,6 +3635,11 @@ msgstr "Duplicar..."
msgid "Move To..."
msgstr "Mover a..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Nueva Escena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Nuevo Script..."
@@ -3680,6 +3705,11 @@ msgstr "Ya hay un archivo o carpeta con el mismo nombre en esta ubicación."
msgid "Overwrite"
msgstr "Sobreescribir"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Crear desde escena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Crear Script"
@@ -3742,6 +3772,14 @@ msgid "Search complete"
msgstr "Búsqueda completa"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Añadir al Grupo"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Eliminar del Grupo"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "El nombre del grupo ya existe."
@@ -3749,12 +3787,23 @@ msgstr "El nombre del grupo ya existe."
msgid "Invalid group name."
msgstr "Nombre de grupo inválido."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Administrar Grupos"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Eliminar grupo de imágenes"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupos"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Nodos fuera del Grupo"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3767,12 +3816,12 @@ msgid "Nodes in Group"
msgstr "Nodos dentro del Grupo"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Añadir al Grupo"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Eliminar del Grupo"
+msgid "Group Editor"
+msgstr "Editor de Grupos"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3981,7 +4030,8 @@ msgid "MultiNode Set"
msgstr "Establecer multinodo"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Selecciona un nodo para editar señales y grupos."
#: editor/plugin_config_dialog.cpp
@@ -4745,10 +4795,6 @@ msgid "View Files"
msgstr "Ver Archivos"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "No se ha podido resolver el nombre de dominio:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Error de conexión, por favor inténtelo otra vez."
@@ -4761,14 +4807,47 @@ msgid "No response from host:"
msgstr "No hay respuesta desde el host:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "No se ha podido resolver el nombre de dominio:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Petición fallida, código:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Petición Fallida."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "No se pudo guardar el tema a un archivo:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Petición fallida, demasiadas redirecciones"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Redireccionar Loop."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Petición fallida, código:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Tiempo"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Error de descarga, al parecer el archivo ha sido manipulado."
@@ -4845,8 +4924,13 @@ msgid "All"
msgstr "Todos"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Reimportar..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Plugins"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4867,7 +4951,8 @@ msgid "Site:"
msgstr "Sitio:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Soporte..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4879,6 +4964,11 @@ msgid "Testing"
msgstr "Prueba"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Cargar..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Archivo ZIP de elementos"
@@ -5044,6 +5134,11 @@ msgid "Paste Pose"
msgstr "Pegar Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Limpiar Huesos"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Crear Hueso(s) Personalizado(s) a partir de Nodo(s)"
@@ -5074,6 +5169,7 @@ msgid "Zoom Reset"
msgstr "Resetear el Zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Modo de Selección"
@@ -5096,14 +5192,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt + Clic Derecho: Selección en listado de solapamientos"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Modo Movimiento"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Modo Rotación"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Modo Escalado"
@@ -5130,6 +5229,7 @@ msgid "Toggle snapping."
msgstr "Act./Desact. alineado."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Usar Snap"
@@ -5146,11 +5246,6 @@ msgid "Use Rotation Snap"
msgstr "Usar Snap de Rotación"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Configurar Snap..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Snap Relativo"
@@ -5163,6 +5258,11 @@ msgid "Smart Snapping"
msgstr "Ajuste Inteligente"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Configurar Snap..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "Ajustar al Padre"
@@ -5377,16 +5477,6 @@ msgstr "Establecer Handle"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Error al cargar la imagen:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "No hay píxeles con transparencia > 128 en la imagen..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Cargar Máscara de Emisión"
@@ -5698,14 +5788,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "El origen de la superficie no es correcto (sin caras)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "La superficie padre no tiene caras solidas para poblar."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "No se pudo mapear el área."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Selecciona una Mesh de Origen:"
@@ -5790,20 +5872,27 @@ msgid "Generation Time (sec):"
msgstr "Tiempo de Generación (seg):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "¡Las caras no contienen área!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "El nodo no posee geometría (caras)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "¡Sin caras!"
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "El nodo no tiene geometría."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "El nodo no posee geometría (caras)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "El nodo no tiene geometría."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6137,7 +6226,6 @@ msgid "Grid Settings"
msgstr "Configuración del Grid"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Snap"
@@ -6243,12 +6331,9 @@ msgid "Error writing TextFile:"
msgstr "Error al escribir el TextFile:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Error: no se pudo cargar el archivo."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "Error no se pudo cargar el archivo."
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "No se pudo cargar el tile:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6271,7 +6356,8 @@ msgid "Error Importing"
msgstr "Error al Importar"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Nuevo TextFile..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6352,6 +6438,11 @@ msgid "Open..."
msgstr "Abrir..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Abrir Script"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Guardar Todo"
@@ -6389,13 +6480,13 @@ msgid "Save Theme"
msgstr "Guardar Tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Cerrar Documentación"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Cerrar Todo"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Cerrar Documentación"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Ejecutar"
@@ -6483,6 +6574,11 @@ msgstr "Depurador"
msgid "Search Results"
msgstr "Resultados de la Búsqueda"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Limpiar escenas recientes"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "Conexiones al método:"
@@ -6551,6 +6647,7 @@ msgid "Syntax Highlighter"
msgstr "Resaltador de Sintaxis"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr "Ir A"
@@ -6585,22 +6682,6 @@ msgid "Toggle Comment"
msgstr "Act./Desact. Comentario"
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr "Act./Desact. Marcador"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "Ir al Siguiente Marcador"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr "Ir al Marcador Anterior"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "Eliminar Todos los Marcadores"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Plegar/Desplegar Línea"
@@ -6621,6 +6702,11 @@ msgid "Complete Symbol"
msgstr "Completar Símbolo"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Escalar Selección"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Eliminar Espacios Sobrantes al Final"
@@ -6637,29 +6723,32 @@ msgid "Auto Indent"
msgstr "Autoindentar"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Act./Desact. Breakpoint"
+msgid "Find Previous"
+msgstr "Buscar Anterior"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Eliminar Todos los Breakpoints"
+msgid "Find in Files..."
+msgstr "Buscar en Archivos..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Ir al Siguente Breakpoint"
+msgid "Contextual Help"
+msgstr "Ayuda Contextual"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Ir al Breakpoint Anterior"
+msgid "Toggle Bookmark"
+msgstr "Act./Desact. Marcador"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Buscar Anterior"
+msgid "Go to Next Bookmark"
+msgstr "Ir al Siguiente Marcador"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Buscar en Archivos..."
+msgid "Go to Previous Bookmark"
+msgstr "Ir al Marcador Anterior"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Eliminar Todos los Marcadores"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6670,8 +6759,21 @@ msgid "Go to Line..."
msgstr "Ir a Línea..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Ayuda Contextual"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Act./Desact. Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Eliminar Todos los Breakpoints"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Ir al Siguente Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Ir al Breakpoint Anterior"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -6850,14 +6952,12 @@ msgid "Rear"
msgstr "Detrás"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Transform with View"
-msgstr "Alinear con Vista"
+msgstr "Alinear Transform con Vista"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Rotation with View"
-msgstr "Alinear Selección Con Vista"
+msgstr "Alinear Rotación con Vista"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -6912,8 +7012,9 @@ msgid "Audio Listener"
msgstr "Oyente de Audio"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Activar Doppler"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Habilitar Filtrado"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6968,8 +7069,8 @@ msgid "Snap Nodes To Floor"
msgstr "Ajustar Nodos al Suelo"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Modo de Selección (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6982,30 +7083,11 @@ msgstr ""
"Alt + Clic Derecho: Selección en la lista de superposición"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Modo Movimiento (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Modo Rotación (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Modo Escalado (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Coordenadas Locales"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Modo de Espacio Local (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Modo de Snap (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Vista Inferior"
@@ -7046,22 +7128,6 @@ msgid "Focus Selection"
msgstr "Foco en Selección"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Seleccionar Herramienta"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Herramienta Mover"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Herramienta Rotar"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Herramienta Escalar"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Act./Desact. Vista Libre"
@@ -7116,7 +7182,8 @@ msgstr "Ver Grid"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Configuración"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7409,10 +7476,6 @@ msgid "TextureRegion"
msgstr "Región de Textura"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "No se pudo guardar el tema a un archivo:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Añadir Todos los Elementos"
@@ -7497,11 +7560,13 @@ msgid "Submenu"
msgstr "Submenú"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+#, fuzzy
+msgid "Subitem 1"
msgstr "Ãtem 1"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+#, fuzzy
+msgid "Subitem 2"
msgstr "Ãtem 2"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7618,9 +7683,10 @@ msgid "Paint Tile"
msgstr "Dibujar tile"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Shift + Clic derecho: Trazar línea\n"
"Shift + Ctrl + Clic derecho: Pintar Rectángulo"
@@ -7918,6 +7984,10 @@ msgid "TileSet"
msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(Sólo GLES3)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr "Añadir entrada +"
@@ -7994,6 +8064,11 @@ msgid "Duplicate Nodes"
msgstr "Duplicar Nodos"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Pegar Nodos"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "Eliminar Nodos"
@@ -8002,10 +8077,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "Cambiar Tipo de Entrada del Visual Shader"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr "(Sólo GLES3)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "Vértice"
@@ -8018,6 +8089,11 @@ msgid "Light"
msgstr "Luz"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Crear Nodo Shader"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr "Crear Nodo Shader"
@@ -8385,10 +8461,11 @@ msgid "Returns the square root of the parameter."
msgstr "Devuelve la raíz cuadrada del parámetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8399,10 +8476,11 @@ msgstr ""
"polinomios de Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
@@ -8576,6 +8654,11 @@ msgid "Linear interpolation between two vectors."
msgstr "Interpolación lineal entre dos vectores."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Interpolación lineal entre dos vectores."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr "Calcula el producto normalizado del vector."
@@ -8600,10 +8683,11 @@ msgid "Returns the vector that points in the direction of refraction."
msgstr "Devuelve el vector que apunta en la dirección de refracción."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8614,10 +8698,11 @@ msgstr ""
"polinomios de Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8628,20 +8713,22 @@ msgstr ""
"polinomios de Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
"Devuelve 0.0 si 'x' es menor que 'edge' y 1.0 en caso contrario."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
@@ -8696,6 +8783,13 @@ msgstr ""
"esta)."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr "(Sólo modo Fragmento/Luz) Función de derivación escalar."
@@ -8923,6 +9017,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Faltan plantillas de exportación para esta plataforma:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Administrar Plantillas de Exportación"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "Exportar con depuración"
@@ -9082,6 +9180,15 @@ msgid "Unnamed Project"
msgstr "Proyecto Sin Nombre"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Importar Proyecto Existente"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "No se puede abrir el proyecto en '%s'."
@@ -9178,12 +9285,13 @@ msgstr ""
"El contenido de la carpeta de proyecto no se modificará."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
-"¿Eliminar todos los proyectos faltantes de la lista? (El contenido de las "
-"carpetas no se modificará)"
+"¿Eliminar %d proyectos de la lista?\n"
+"El contenido de las carpetas del proyecto no se modificará."
#: editor/project_manager.cpp
msgid ""
@@ -9208,8 +9316,9 @@ msgid "Project Manager"
msgstr "Administrador de Proyectos"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Listado de Proyectos"
+#, fuzzy
+msgid "Projects"
+msgstr "Proyecto"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9232,10 +9341,6 @@ msgid "Templates"
msgstr "Plantillas"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Salir"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Reiniciar Ahora"
@@ -9575,6 +9680,10 @@ msgstr "Idiomas:"
msgid "AutoLoad"
msgstr "AutoLoad"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Plugins"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Cero"
@@ -9627,15 +9736,6 @@ msgstr "Seleccionar Método Virtual"
msgid "Select Method"
msgstr "Seleccionar Método"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "No se pudo ejecutar la herramienta PVRTC:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-"No se pudo volver a cargar la imagen convertida usando la herramienta PVRTC:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "Renombrar por lote"
@@ -9931,6 +10031,11 @@ msgid "Remove Node(s)"
msgstr "Eliminar Nodo(s)"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Cambiar nombre del puerto de salida"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9975,9 +10080,8 @@ msgid "Extend Script"
msgstr "Extender Script"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
-msgstr "Reemparentar nodo"
+msgstr "Reemparentar a Nuevo Nodo"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -10052,24 +10156,27 @@ msgid "Node configuration warning:"
msgstr "Alerta de configuración de nodos:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"El nodo tiene conexión/es y grupo/s.\n"
"Clic para mostrar el panel de señales."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"El nodo tiene conexiones.\n"
"Haz clic para mostrar el panel de señales."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"El nodo está en el/los grupo(s).\n"
@@ -10169,6 +10276,11 @@ msgid "Error loading script from %s"
msgstr "Error al cargar script desde %s"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Sobreescribir"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "N/D"
@@ -10357,6 +10469,10 @@ msgid "Change Shortcut"
msgstr "Cambiar Atajo"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Configuración del Editor"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Atajos"
@@ -10779,10 +10895,30 @@ msgid "Set Variable Type"
msgstr "Establecer Tipo de la Variable"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "No debe coincidir con un nombre de tipo built-in existente."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Cree un nuevo rectángulo."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Variables:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Cree un nuevo rectángulo."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Crear un nuevo polígono."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "El nombre no es un identificador válido:"
@@ -10971,10 +11107,6 @@ msgid "Cut Nodes"
msgstr "Cortar Nodos"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Pegar Nodos"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "Editar Miembros"
@@ -11876,22 +12008,6 @@ msgstr ""
"pueda obtener un tamaño. De lo contrario, conviértelo en un RenderTarget y "
"asigna su textura interna a algún nodo para mostrarlo."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Error al arrancar FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Formato de tipografía desconocido."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Error al cargar la tipografía."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Tamaño de tipografía incorrecto."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Entrada"
@@ -11924,6 +12040,110 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice."
msgid "Constants cannot be modified."
msgstr "Las constantes no pueden modificarse."
+#~ msgid "No Matches"
+#~ msgstr "Sin Coincidencias"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "No se puede abrir file_type_cache.cch para escribir, no se guardará el "
+#~ "cache de tipos de archivo!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "¡No se puede navegar a '%s' ya que no se ha encontrado en el sistema de "
+#~ "archivos!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Error al cargar la imagen:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "No hay píxeles con transparencia > 128 en la imagen..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "La superficie padre no tiene caras solidas para poblar."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "No se pudo mapear el área."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "¡Las caras no contienen área!"
+
+#~ msgid "No faces!"
+#~ msgstr "¡Sin caras!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Error: no se pudo cargar el archivo."
+
+#~ msgid "Error could not load file."
+#~ msgstr "Error no se pudo cargar el archivo."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Activar Doppler"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Modo de Selección (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Modo Movimiento (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Modo Rotación (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Modo Escalado (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Coordenadas Locales"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Modo de Snap (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Seleccionar Herramienta"
+
+#~ msgid "Tool Move"
+#~ msgstr "Herramienta Mover"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Herramienta Rotar"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Herramienta Escalar"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "¿Eliminar todos los proyectos faltantes de la lista? (El contenido de las "
+#~ "carpetas no se modificará)"
+
+#~ msgid "Project List"
+#~ msgstr "Listado de Proyectos"
+
+#~ msgid "Exit"
+#~ msgstr "Salir"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "No se pudo ejecutar la herramienta PVRTC:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr ""
+#~ "No se pudo volver a cargar la imagen convertida usando la herramienta "
+#~ "PVRTC:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Error al arrancar FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Formato de tipografía desconocido."
+
+#~ msgid "Error loading font."
+#~ msgstr "Error al cargar la tipografía."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Tamaño de tipografía incorrecto."
+
#~ msgid "Previous Folder"
#~ msgstr "Carpeta Anterior"
@@ -12714,9 +12934,6 @@ msgstr "Las constantes no pueden modificarse."
#~ msgid "Erase selection"
#~ msgstr "Eliminar selección"
-#~ msgid "Could not find tile:"
-#~ msgstr "No se pudo cargar el tile:"
-
#~ msgid "Item name or ID:"
#~ msgstr "Nombre o ID de Item:"
@@ -12995,9 +13212,6 @@ msgstr "Las constantes no pueden modificarse."
#~ msgid "Info"
#~ msgstr "Info"
-#~ msgid "Re-Import..."
-#~ msgstr "Reimportar..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "¡Sin máscaras de bits para importar!"
@@ -13394,9 +13608,6 @@ msgstr "Las constantes no pueden modificarse."
#~ msgid "Stereo"
#~ msgstr "Estéreo"
-#~ msgid "Window"
-#~ msgstr "Ventana"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Escalando al %s%%."
@@ -13652,9 +13863,6 @@ msgstr "Las constantes no pueden modificarse."
#~ msgid "Add Image Group"
#~ msgstr "Añadir grupo de imágenes"
-#~ msgid "Delete Image Group"
-#~ msgstr "Eliminar grupo de imágenes"
-
#~ msgid "Project Export Settings"
#~ msgstr "Ajustes de exportación del proyecto"
@@ -13739,9 +13947,6 @@ msgstr "Las constantes no pueden modificarse."
#~ msgid "Export Project PCK"
#~ msgstr "Exportar PCK del proyecto"
-#~ msgid "Export..."
-#~ msgstr "Exportar…"
-
#~ msgid "Project Export"
#~ msgstr "Exportar proyecto"
@@ -13839,6 +14044,3 @@ msgstr "Las constantes no pueden modificarse."
#~ msgid "Deploy File Server Clients"
#~ msgstr "Hacer Deploy de Clientes del Servidor de Archivos"
-
-#~ msgid "Group Editor"
-#~ msgstr "Editor de Grupos"
diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po
index 0b03b5517a..9208cc669c 100644
--- a/editor/translations/es_AR.po
+++ b/editor/translations/es_AR.po
@@ -16,7 +16,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-29 19:21+0000\n"
+"PO-Revision-Date: 2019-08-11 10:24+0000\n"
"Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n"
"Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/"
"godot-engine/godot/es_AR/>\n"
@@ -68,7 +68,6 @@ msgid "On call to '%s':"
msgstr "En la llamada a '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Gratis"
@@ -137,29 +136,24 @@ msgid "Anim Change Call"
msgstr "Cambiar Call de Anim"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Cambiar Tiempo de Keyframe de Anim"
+msgstr "Cambiar Tiempo de Múltiples Keyframes de Anim"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Cambio de transición Anim"
+msgstr "Cambiar Múltiples Transiciones de Anim"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Cambiar Transform de Anim"
+msgstr "Cambiar Múltiples Transforms de Anim"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Cambiar Valor de Keyframe de Anim"
+msgstr "Cambiar Valor de Múltiples Keyframes de Anim"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "Cambiar Call de Anim"
+msgstr "Cambiar Múltiples Llamadas de Anim"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -665,16 +659,18 @@ msgid "Line Number:"
msgstr "Numero de Línea:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "Se encontraron %d coincidencias."
+msgid "Replaced %d occurrence(s)."
+msgstr "%d ocurrencia(s) Reemplazadas."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Sin Coincidencias"
+#, fuzzy
+msgid "%d match."
+msgstr "Se encontraron %d coincidencias."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d ocurrencia(s) Reemplazadas."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Se encontraron %d coincidencias."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -902,8 +898,7 @@ msgstr "Favoritos:"
msgid "Recent:"
msgstr "Recientes:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1005,7 +1000,7 @@ msgstr ""
"funcionar.\n"
"Quitarlos de todos modos? (imposible deshacer)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "No se puede remover:"
@@ -1041,7 +1036,7 @@ msgstr "Eliminar permanentemente %d item(s)? (Imposible deshacer!)"
msgid "Show Dependencies"
msgstr "Mostrar Dependencias"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Explorador de Recursos Huérfanos"
@@ -1130,14 +1125,16 @@ msgid "License"
msgstr "Licencia"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Licencia de Terceros"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine depende de un número de licencias de terceros, libres y de "
@@ -1158,7 +1155,8 @@ msgid "Licenses"
msgstr "Licencias"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Error al abrir el archivo de paquete. No está en formato zip."
#: editor/editor_asset_installer.cpp
@@ -1654,12 +1652,11 @@ msgid "New"
msgstr "Nuevo"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importar"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Exportar"
@@ -1796,32 +1793,28 @@ msgid "Move Favorite Down"
msgstr "Bajar Favorito"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Ir a la carpeta padre."
+msgstr "Ir a la carpeta anterior."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Ir a la carpeta padre."
+msgstr "Ir a la carpeta siguiente."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "Ir a la carpeta padre."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Buscar archivos"
+msgstr "Refrescar archivos."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "Quitar carpeta actual de favoritos."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "Ver/Ocultar archivos ocultos."
+msgstr "Mostrar/Ocultar archivos ocultos."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
@@ -2062,6 +2055,11 @@ msgstr "Limpiar"
msgid "Clear Output"
msgstr "Limpiar Salida"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "Ventana"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "La exportación del proyecto falló con el código de error %d."
@@ -2387,6 +2385,15 @@ msgid "Pick a Main Scene"
msgstr "Elegí una Escena Principal"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Cerrar Escena"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Cerrar Escena"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"No se pudo activar el plugin de addon en: '%s' falló el parseo de la "
@@ -2506,6 +2513,11 @@ msgstr "Reproducir Esta Escena"
msgid "Close Tab"
msgstr "Cerrar Pestaña"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Cerrar Pestaña"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Cerrar Otras Pestañas"
@@ -2590,6 +2602,10 @@ msgstr "Nueva Escena Heredada..."
msgid "Open Scene..."
msgstr "Abrir Escena..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Abrir Reciente"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Guardar Escena"
@@ -2599,14 +2615,6 @@ msgid "Save All Scenes"
msgstr "Guardar Todas las Escenas"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Cerrar Escena"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Abrir Reciente"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Convertir A..."
@@ -2636,25 +2644,36 @@ msgstr "Revertir Escena"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Herramientas misceláneas a nivel proyecto o escena."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Proyecto"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Configuración de Proyecto"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Herramientas"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr "Exportar..."
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Instalar plantilla de compilación de Android"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Abrir Carpeta de Datos del Proyecto"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Herramientas"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Instalar plantilla de compilación de Android"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Explorador de Recursos Huérfanos"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2753,12 +2772,13 @@ msgstr ""
"Cuando se use remotamente en un dispositivo, esto es más eficiente con un "
"sistema de archivos de red."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Editor"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Configuración del Editor"
#: editor/editor_node.cpp
@@ -2794,14 +2814,16 @@ msgid "Open Editor Settings Folder"
msgstr "Abrir Carpeta de Configuración del Editor"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "Administrar Características del Editor"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Gestionar Plantillas de Exportación"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Ayuda"
@@ -2809,12 +2831,13 @@ msgstr "Ayuda"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Buscar"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Documentación Online"
@@ -3096,9 +3119,8 @@ msgid "Calls"
msgstr "Llamadas"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Editar Tema"
+msgstr "Editar Texto:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3272,7 +3294,8 @@ msgid "Import From Node:"
msgstr "Importar Desde Nodo:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Volver a Descargar"
#: editor/export_template_manager.cpp
@@ -3289,6 +3312,10 @@ msgid "Download"
msgstr "Descargar"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Faltante)"
@@ -3352,12 +3379,10 @@ msgid "No response."
msgstr "Sin respuesta."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Solicitud fallida."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Bucle de redireccionamiento."
@@ -3371,15 +3396,22 @@ msgid "Download Complete."
msgstr "Descarga Completa."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "No se pudo guardar el tema a un archivo:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Fallo la instalación de plantillas. Las plantillas problemáticas pueden ser "
"encontradas en '%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Error al pedir el url: "
#: editor/export_template_manager.cpp
@@ -3465,22 +3497,11 @@ msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
"Seleccionar un mirror de la lista: (Shift+Click: Abrir en el Navegador)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"No se puede abrir file_type_cache.cch para escribir, no se guardará el cache "
-"de tipos de archivo!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Favoritos"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"No se puede navegar a '%s' ya que no se encontro en el sistema de archivos!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Estado: Falló la importación del archivo. Por favor arreglá el archivo y "
@@ -3515,14 +3536,14 @@ msgid "Provided name contains invalid characters."
msgstr "El nombre indicado contiene caracteres inválidos."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "El nombre indicado contiene caracteres inválidos."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Un archivo o carpeta con este nombre ya existe."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "El nombre indicado contiene caracteres inválidos."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Renombrando archivo:"
@@ -3578,6 +3599,11 @@ msgstr "Duplicar..."
msgid "Move To..."
msgstr "Mover A..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Nueva Escena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Nuevo Script.."
@@ -3643,6 +3669,11 @@ msgstr "Ya hay un archivo o carpeta con el mismo nombre en esta ubicación."
msgid "Overwrite"
msgstr "Sobreescribir"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Crear desde Escena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Crear Script"
@@ -3705,6 +3736,14 @@ msgid "Search complete"
msgstr "Búsqueda completa"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Agregar al Grupo"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Quitar del Grupo"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "El nombre del grupo ya existe."
@@ -3712,12 +3751,23 @@ msgstr "El nombre del grupo ya existe."
msgid "Invalid group name."
msgstr "Nombre de grupo inválido."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Administrar Grupos"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Eliminar Grupo de Imágenes"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupos"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Nodos fuera del Grupo"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3730,12 +3780,12 @@ msgid "Nodes in Group"
msgstr "Nodos dentro del Grupo"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Agregar al Grupo"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Quitar del Grupo"
+msgid "Group Editor"
+msgstr "Editor de Grupos"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3945,7 +3995,8 @@ msgid "MultiNode Set"
msgstr "Setear MultiNodo"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Seleccionar un Nodo para editar Señales y Grupos."
#: editor/plugin_config_dialog.cpp
@@ -4709,10 +4760,6 @@ msgid "View Files"
msgstr "Ver Archivos"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "No se ha podido resolver el nombre del host:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Error de conexión, por favor intentá de nuevo."
@@ -4725,14 +4772,47 @@ msgid "No response from host:"
msgstr "No hay respuesta desde el host:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "No se ha podido resolver el nombre del host:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Solicitud fallida. Código de retorno:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Solicitud fallida."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "No se pudo guardar el tema a un archivo:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Solicitud fallida, demasiadas redireccinoes"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Bucle de redireccionamiento."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Solicitud fallida. Código de retorno:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Tiempo"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Hash de descarga incorrecto, asumiendo que el archivo fue manipulado."
@@ -4809,8 +4889,13 @@ msgid "All"
msgstr "Todos"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Reimportando..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Plugins"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4831,7 +4916,8 @@ msgid "Site:"
msgstr "Sitio:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Soporte..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4843,6 +4929,11 @@ msgid "Testing"
msgstr "Prueba"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Cargar..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Archivo ZIP de Assets"
@@ -5008,6 +5099,11 @@ msgid "Paste Pose"
msgstr "Pegar Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Restablecer Huesos"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Crear Hueso(s) Personalizado(s) a partir de Nodo(s)"
@@ -5038,6 +5134,7 @@ msgid "Zoom Reset"
msgstr "Reset de Zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Modo Seleccionar"
@@ -5060,14 +5157,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+Click Der.: Selección en depth list"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Modo Mover"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Modo Rotar"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Modo de Escalado"
@@ -5093,6 +5193,7 @@ msgid "Toggle snapping."
msgstr "Act/Desact. alineado."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Usar Snap"
@@ -5109,11 +5210,6 @@ msgid "Use Rotation Snap"
msgstr "Usar Snap de Rotación"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Configurar Snap..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Usar Snap Relativo"
@@ -5126,6 +5222,11 @@ msgid "Smart Snapping"
msgstr "Ajuste inteligente"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Configurar Snap..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "Ajustar al Padre"
@@ -5340,16 +5441,6 @@ msgstr "Setear Handle"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Error al cargar la imagen:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Sin pixeles con transparencia > 128 en imagen..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Cargar Máscara de Emisión"
@@ -5661,14 +5752,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "La superficie de origen es inválida (sin caras)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "La superficie padre no tiene caras solidas para poblar."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "No se pudo mapear el area."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Seleccioná una Mesh de Origen:"
@@ -5753,20 +5836,27 @@ msgid "Generation Time (sec):"
msgstr "Tiempo de Generación (seg):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Las caras no contienen area!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "El nodo no contiene geometría (caras)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Sin caras!"
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "El nodo no contiene geometría."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "El nodo no contiene geometría (caras)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "El nodo no contiene geometría."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6100,7 +6190,6 @@ msgid "Grid Settings"
msgstr "Ajustes de Grilla"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Esnapear"
@@ -6206,12 +6295,9 @@ msgid "Error writing TextFile:"
msgstr "Error al escribir el TextFile:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Error: no se pudo cargar el archivo."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "Error no se pudo cargar el archivo."
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "No se pudo cargar el tile:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6234,7 +6320,8 @@ msgid "Error Importing"
msgstr "Error al Importar"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Nuevo TextFile..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6315,6 +6402,11 @@ msgid "Open..."
msgstr "Abrir..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Abrir Script"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Guardar Todo"
@@ -6352,13 +6444,13 @@ msgid "Save Theme"
msgstr "Guardar Tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Cerrar Docs"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Cerrar Todos"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Cerrar Docs"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Ejecutar"
@@ -6446,6 +6538,11 @@ msgstr "Depurador"
msgid "Search Results"
msgstr "Resultados de la Búsqueda"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Restablecer Escenas Recientes"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "Conexiones al método:"
@@ -6514,6 +6611,7 @@ msgid "Syntax Highlighter"
msgstr "Resaltador de Sintaxis"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr "Ir A"
@@ -6548,22 +6646,6 @@ msgid "Toggle Comment"
msgstr "Act/Desact. Comentario"
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr "Act./Desact. Marcador"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "Ir al Siguiente Marcador"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr "Ir al Marcador Anterior"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "Eliminar Todos los Marcadores"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Expandir/Colapsar Línea"
@@ -6584,6 +6666,11 @@ msgid "Complete Symbol"
msgstr "Completar Símbolo"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Escalar Selección"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Eliminar Espacios Sobrantes al Final"
@@ -6600,29 +6687,32 @@ msgid "Auto Indent"
msgstr "Auto Indentar"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Act/Desact. Breakpoint"
+msgid "Find Previous"
+msgstr "Encontrar Anterior"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Quitar Todos los Breakpoints"
+msgid "Find in Files..."
+msgstr "Buscar en Archivos..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Ir al Breakpoint Siguiente"
+msgid "Contextual Help"
+msgstr "Ayuda Contextual"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Ir al Breakpoint Anterior"
+msgid "Toggle Bookmark"
+msgstr "Act./Desact. Marcador"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Encontrar Anterior"
+msgid "Go to Next Bookmark"
+msgstr "Ir al Siguiente Marcador"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Buscar en Archivos..."
+msgid "Go to Previous Bookmark"
+msgstr "Ir al Marcador Anterior"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Eliminar Todos los Marcadores"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6633,8 +6723,21 @@ msgid "Go to Line..."
msgstr "Ir a Línea..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Ayuda Contextual"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Act/Desact. Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Quitar Todos los Breakpoints"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Ir al Breakpoint Siguiente"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Ir al Breakpoint Anterior"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -6813,14 +6916,12 @@ msgid "Rear"
msgstr "Detrás"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Transform with View"
-msgstr "Alinear con Vista"
+msgstr "Alinear Transform con Vista"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Rotation with View"
-msgstr "Alinear Selección Con Vista"
+msgstr "Alinear Rotación con Vista"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -6875,8 +6976,9 @@ msgid "Audio Listener"
msgstr "Oyente de Audio"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Activar Doppler"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Habilitar Filtrado"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6931,8 +7033,8 @@ msgid "Snap Nodes To Floor"
msgstr "Ajustar Nodos al Suelo"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Modo Seleccionar (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6945,30 +7047,11 @@ msgstr ""
"Alt+Click Der.: Selección en depth list"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Modo Mover (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Modo Rotar (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Modo Escalar (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Coordenadas Locales"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Modo de Espacio Local (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Modo de Snap (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Vista Inferior"
@@ -7009,22 +7092,6 @@ msgid "Focus Selection"
msgstr "Foco en Selección"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Seleccionar Herramienta"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Herramienta Mover"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Herramienta Rotar"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Herramienta Escalar"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Act./Desact. Vista Libre"
@@ -7079,7 +7146,8 @@ msgstr "Ver Grilla"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Configuración"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7372,10 +7440,6 @@ msgid "TextureRegion"
msgstr "Región de Textura"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "No se pudo guardar el tema a un archivo:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Agregar Todos los Items"
@@ -7460,11 +7524,13 @@ msgid "Submenu"
msgstr "Submenú"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+#, fuzzy
+msgid "Subitem 1"
msgstr "Ãtem 1"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+#, fuzzy
+msgid "Subitem 2"
msgstr "Ãtem 2"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7581,9 +7647,10 @@ msgid "Paint Tile"
msgstr "Pintar Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Shift + Clic derecho: Dibujar línea\n"
"Shift + Ctrl + Clic derecho: Pintar Rectángulo"
@@ -7880,6 +7947,10 @@ msgid "TileSet"
msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(Sólo GLES3)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr "Añadir entrada +"
@@ -7956,6 +8027,11 @@ msgid "Duplicate Nodes"
msgstr "Duplicar Nodos"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Pegar Nodos"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "Eliminar Nodos"
@@ -7964,10 +8040,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "Se cambió el Tipo de Entrada de Visual Shader"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr "(Sólo GLES3)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "Vértice"
@@ -7980,6 +8052,11 @@ msgid "Light"
msgstr "Luz"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Crear Nodo Shader"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr "Crear Nodo Shader"
@@ -8347,10 +8424,11 @@ msgid "Returns the square root of the parameter."
msgstr "Devuelve la raíz cuadrada del parámetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8361,10 +8439,11 @@ msgstr ""
"polinomios de Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
@@ -8538,6 +8617,11 @@ msgid "Linear interpolation between two vectors."
msgstr "Interpolación lineal entre dos vectores."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Interpolación lineal entre dos vectores."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr "Calcula el producto normalizado del vector."
@@ -8562,10 +8646,11 @@ msgid "Returns the vector that points in the direction of refraction."
msgstr "Devuelve el vector que apunta en la dirección de refracción."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8576,10 +8661,11 @@ msgstr ""
"polinomios de Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8590,20 +8676,22 @@ msgstr ""
"polinomios de Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
"Devuelve 0.0 si 'x' es menor que 'edge' y 1.0 en caso contrario."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
@@ -8657,6 +8745,13 @@ msgstr ""
"dirección de vista de la camara ( pasale los puntos asociados)."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr "(Sólo modo Fragmento/Luz) Función derivada escalar."
@@ -8886,6 +8981,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Faltan las plantillas de exportación para esta plataforma:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Gestionar Plantillas de Exportación"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "Exportar Con Depuración"
@@ -9045,6 +9144,15 @@ msgid "Unnamed Project"
msgstr "Proyecto Sin Nombre"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Importar Proyecto Existente"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "No se puede abrir el proyecto en '%s'."
@@ -9142,12 +9250,13 @@ msgstr ""
"El contenido de la carpeta de proyecto no será modificado."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
-"¿Eliminar todos los proyectos faltantes de la lista? (El contenido de las "
-"carpetas no se modificará)"
+"¿Quitar %d proyectos de la lista?\n"
+"El contenido de las carpetas de proyecto no será modificado."
#: editor/project_manager.cpp
msgid ""
@@ -9172,8 +9281,9 @@ msgid "Project Manager"
msgstr "Gestor de Proyectos"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Listado de Proyectos"
+#, fuzzy
+msgid "Projects"
+msgstr "Proyecto"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9196,10 +9306,6 @@ msgid "Templates"
msgstr "Plantillas"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Salir"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Reiniciar Ahora"
@@ -9539,6 +9645,10 @@ msgstr "Locales:"
msgid "AutoLoad"
msgstr "AutoLoad"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Plugins"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Zero"
@@ -9591,15 +9701,6 @@ msgstr "Seleccionar Método Virtual"
msgid "Select Method"
msgstr "Seleccionar Método"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "No se pudo ejecutar la herramienta PVRTC:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-"No se pudo volver a cargar la imagen convertida usando la herramienta PVRTC:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "Renombrar en Masa"
@@ -9896,6 +9997,11 @@ msgid "Remove Node(s)"
msgstr "Quitar Nodo(s)"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Cambiar nombre del puerto de salida"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9940,9 +10046,8 @@ msgid "Extend Script"
msgstr "Extender Script"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
-msgstr "Reemparentar Nodo"
+msgstr "Reemparentar a Nuevo Nodo"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -10017,24 +10122,27 @@ msgid "Node configuration warning:"
msgstr "Advertencia de configuración de nodo:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"El nodo tiene conexión/es y grupo/s.\n"
"Clic para mostrar el panel de señales."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"El nodo tiene conexiones.\n"
"Click para mostrar el panel de señales."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"El nodo está en un grupo/s.\n"
@@ -10134,6 +10242,11 @@ msgid "Error loading script from %s"
msgstr "Error al cargar el script desde %s"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Sobreescribir"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "N/A"
@@ -10322,6 +10435,10 @@ msgid "Change Shortcut"
msgstr "Cambiar Atajo"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Configuración del Editor"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Atajos"
@@ -10742,10 +10859,30 @@ msgid "Set Variable Type"
msgstr "Editar Tipo de Variable"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "No debe coincidir con el nombre de un tipo built-in ya existente."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Crear un rectángulo nuevo."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Variables:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Crear un rectángulo nuevo."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Crear un nuevo polígono."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "El nombre no es un identificador válido:"
@@ -10934,10 +11071,6 @@ msgid "Cut Nodes"
msgstr "Cortar Nodos"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Pegar Nodos"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "Editar Miembros"
@@ -11834,22 +11967,6 @@ msgstr ""
"pueda obtener un tamaño. Alternativamente, haz un RenderTarget y asigna su "
"textura interna a algún otro nodo para mostrar."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Error inicializando FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Formato de tipografía desconocido."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Error cargando tipografía."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Tamaño de tipografía inválido."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Entrada"
@@ -11882,6 +11999,110 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice."
msgid "Constants cannot be modified."
msgstr "Las constantes no pueden modificarse."
+#~ msgid "No Matches"
+#~ msgstr "Sin Coincidencias"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "No se puede abrir file_type_cache.cch para escribir, no se guardará el "
+#~ "cache de tipos de archivo!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "No se puede navegar a '%s' ya que no se encontro en el sistema de "
+#~ "archivos!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Error al cargar la imagen:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Sin pixeles con transparencia > 128 en imagen..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "La superficie padre no tiene caras solidas para poblar."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "No se pudo mapear el area."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Las caras no contienen area!"
+
+#~ msgid "No faces!"
+#~ msgstr "Sin caras!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Error: no se pudo cargar el archivo."
+
+#~ msgid "Error could not load file."
+#~ msgstr "Error no se pudo cargar el archivo."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Activar Doppler"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Modo Seleccionar (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Modo Mover (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Modo Rotar (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Modo Escalar (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Coordenadas Locales"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Modo de Snap (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Seleccionar Herramienta"
+
+#~ msgid "Tool Move"
+#~ msgstr "Herramienta Mover"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Herramienta Rotar"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Herramienta Escalar"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "¿Eliminar todos los proyectos faltantes de la lista? (El contenido de las "
+#~ "carpetas no se modificará)"
+
+#~ msgid "Project List"
+#~ msgstr "Listado de Proyectos"
+
+#~ msgid "Exit"
+#~ msgstr "Salir"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "No se pudo ejecutar la herramienta PVRTC:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr ""
+#~ "No se pudo volver a cargar la imagen convertida usando la herramienta "
+#~ "PVRTC:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Error inicializando FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Formato de tipografía desconocido."
+
+#~ msgid "Error loading font."
+#~ msgstr "Error cargando tipografía."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Tamaño de tipografía inválido."
+
#~ msgid "Previous Folder"
#~ msgstr "Carpeta Anterior"
@@ -12486,9 +12707,6 @@ msgstr "Las constantes no pueden modificarse."
#~ msgid "Erase selection"
#~ msgstr "Eliminar Selección"
-#~ msgid "Could not find tile:"
-#~ msgstr "No se pudo cargar el tile:"
-
#~ msgid "Item name or ID:"
#~ msgstr "Nombre o ID de Item:"
@@ -12757,9 +12975,6 @@ msgstr "Las constantes no pueden modificarse."
#~ msgid "Info"
#~ msgstr "Info"
-#~ msgid "Re-Import..."
-#~ msgstr "Reimportando..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "Sin máscaras de bits para importar!"
@@ -13154,9 +13369,6 @@ msgstr "Las constantes no pueden modificarse."
#~ msgid "Stereo"
#~ msgstr "Estereo"
-#~ msgid "Window"
-#~ msgstr "Ventana"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Escalando a %s%%."
@@ -13393,9 +13605,6 @@ msgstr "Las constantes no pueden modificarse."
#~ msgid "Add Image Group"
#~ msgstr "Agregar Grupo de Imágenes"
-#~ msgid "Delete Image Group"
-#~ msgstr "Eliminar Grupo de Imágenes"
-
#~ msgid "Project Export Settings"
#~ msgstr "Ajustes de Exportación del Proyecto"
@@ -13480,9 +13689,6 @@ msgstr "Las constantes no pueden modificarse."
#~ msgid "Export Project PCK"
#~ msgstr "Exportar PCK de Proyecto"
-#~ msgid "Export..."
-#~ msgstr "Exportar..."
-
#~ msgid "Project Export"
#~ msgstr "Exportar Proyecto"
@@ -13587,6 +13793,3 @@ msgstr "Las constantes no pueden modificarse."
#~ msgid "Deploy File Server Clients"
#~ msgstr "Hacer Deploy de Clientes del Servidor de Archivos"
-
-#~ msgid "Group Editor"
-#~ msgstr "Editor de Grupos"
diff --git a/editor/translations/et.po b/editor/translations/et.po
index 18b8252b94..1540cf65d0 100644
--- a/editor/translations/et.po
+++ b/editor/translations/et.po
@@ -58,7 +58,6 @@ msgid "On call to '%s':"
msgstr "'%' kutsudes:"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Vaba"
@@ -632,15 +631,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -864,8 +863,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -959,7 +957,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -995,7 +993,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1084,14 +1082,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1108,7 +1106,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1591,12 +1589,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -1988,6 +1985,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2284,6 +2285,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2377,6 +2386,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2462,20 +2475,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2508,24 +2517,32 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2605,12 +2622,12 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
msgstr ""
#: editor/editor_node.cpp
@@ -2646,14 +2663,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2661,12 +2678,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3103,7 +3121,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3120,6 +3138,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3181,12 +3203,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3200,13 +3220,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3291,19 +3315,11 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3336,11 +3352,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3399,6 +3415,10 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3462,6 +3482,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Loo"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3522,6 +3547,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3529,12 +3562,20 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Delete Group"
+msgstr ""
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3547,11 +3588,11 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
+msgid "Group Editor"
msgstr ""
#: editor/groups_editor.cpp
@@ -3758,7 +3799,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4500,10 +4541,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4516,14 +4553,43 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Aeg:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4600,8 +4666,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4622,7 +4691,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4634,6 +4703,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4790,6 +4863,10 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4818,6 +4895,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4838,14 +4916,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -4869,6 +4950,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4885,11 +4967,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4902,6 +4979,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5109,16 +5191,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5429,14 +5501,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5520,19 +5584,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5859,7 +5927,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -5965,11 +6032,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5993,7 +6056,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6074,6 +6137,10 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6111,11 +6178,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6203,6 +6270,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6269,6 +6340,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6303,92 +6375,97 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
+msgid "Fold/Unfold Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
+msgid "Fold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
+msgid "Unfold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
+msgid "Clone Down"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
+msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Kustuta Valim"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
+msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6626,7 +6703,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6680,7 +6757,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6691,27 +6768,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6755,22 +6812,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6825,7 +6866,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7118,10 +7159,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7206,11 +7243,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7328,8 +7365,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7608,6 +7645,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7684,15 +7725,16 @@ msgid "Duplicate Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Delete Nodes"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Visual Shader Input Type Changed"
+msgid "Delete Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
+msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7708,6 +7750,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8066,7 +8112,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8075,7 +8121,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8234,6 +8280,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8259,7 +8309,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8268,7 +8318,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8277,14 +8327,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8329,6 +8379,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8536,6 +8593,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8682,6 +8743,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8751,8 +8820,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8772,7 +8841,7 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
+msgid "Projects"
msgstr ""
#: editor/project_manager.cpp
@@ -8796,10 +8865,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9133,6 +9198,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9185,14 +9254,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9478,6 +9539,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9595,19 +9660,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9698,6 +9763,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -9886,6 +9955,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10296,10 +10369,26 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10484,10 +10573,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11217,22 +11302,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
diff --git a/editor/translations/eu.po b/editor/translations/eu.po
new file mode 100644
index 0000000000..881afb2b7c
--- /dev/null
+++ b/editor/translations/eu.po
@@ -0,0 +1,11325 @@
+# Basque translation of the Godot Engine editor
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
+# This file is distributed under the same license as the Godot source code.
+# Julen Irazoki <rktzbkr.julen@gmail.com>, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2019-08-15 10:23+0000\n"
+"Last-Translator: Julen Irazoki <rktzbkr.julen@gmail.com>\n"
+"Language-Team: Basque <https://hosted.weblate.org/projects/godot-engine/"
+"godot/eu/>\n"
+"Language: eu\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.8\n"
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/mono/glue/gd_glue.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+"Ez daude byte nahikoa byte-ak dekodetzeko, edota formatua ez da zuzena."
+
+#: core/math/expression.cpp
+msgid "Invalid input %i (not passed) in expression"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "self can't be used because instance is null (not passed)"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid operands to operator %s, %s and %s."
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid index of type %s for base type %s"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid named index '%s' for base type %s"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid arguments to construct '%s'"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "On call to '%s':"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Free"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Balanced"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Mirror"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
+msgid "Time:"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Value:"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Insert Key Here"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Duplicate Selected Key(s)"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Delete Selected Key(s)"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Add Bezier Point"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Move Bezier Points"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Time"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Value"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Keyframe Time"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Transition"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Transform"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Keyframe Value"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Call"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Length"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Property Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "3D Transform Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Call Method Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Bezier Curve Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation length (frames)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation length (seconds)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Looping"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Clips:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Clips:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Track Path"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Toggle this track on/off."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Update Mode (How this property is set)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Interpolation Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove this track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Time (s): "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Toggle Track Enabled"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Capture"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Nearest"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
+#: editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Cubic"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clamp Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Wrap Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Key(s)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Key(s)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Update Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Interpolation Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Loop Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/create_dialog.cpp
+#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "AnimationPlayer can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Rearrange Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Transform tracks only apply to Spatial-based nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"Audio tracks can only point to nodes of type:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation tracks can only point to AnimationPlayer nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "An animation player can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Not possible to add a new track without a root"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Bezier Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track is not of type Spatial, can't insert key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Transform Track Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Track Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a method key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Method Track Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Method not found in object: "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clipboard is empty"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Paste Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"This option does not work for Bezier editing, as it's only a single track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"This animation belongs to an imported scene, so changes to imported tracks "
+"will not be saved.\n"
+"\n"
+"To enable the ability to add custom tracks, navigate to the scene's import "
+"settings and set\n"
+"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks"
+"\", then re-import.\n"
+"Alternatively, use an import preset that imports animations to separate "
+"files."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Warning: Editing imported animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Select All"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Select None"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Only show tracks from nodes selected in tree."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Group tracks by node or display them as plain list."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Snap:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation step value."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Seconds"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "FPS"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/project_manager.cpp editor/project_settings_editor.cpp
+#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Edit"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation properties."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Copy Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Next Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Previous Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Pick the node that will be animated:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Use Bezier Curves"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Select tracks to copy:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_log.cpp
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Copy"
+msgstr ""
+
+#: editor/animation_track_editor_plugins.cpp
+msgid "Add Audio Track Clip"
+msgstr ""
+
+#: editor/animation_track_editor_plugins.cpp
+msgid "Change Audio Track Clip Start Offset"
+msgstr ""
+
+#: editor/animation_track_editor_plugins.cpp
+msgid "Change Audio Track Clip End Offset"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replaced %d occurrence(s)."
+msgstr ""
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
+msgstr ""
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Match Case"
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: editor/code_editor.cpp editor/rename_dialog.cpp
+msgid "Replace"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
+#: editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Warnings"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line and column numbers."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Method in target node must be specified."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid ""
+"Target method not found. Specify a valid method or attach a script to the "
+"target node."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect to Node:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect to Script:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "From Signal:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Scene does not contain any script."
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
+#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+msgid "Add"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/editor_feature_profile.cpp editor/groups_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp
+msgid "Remove"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Advanced"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid ""
+"Defers the signal, storing it in a queue and only firing it at idle time."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnects the signal after its first emission."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Cannot connect signal"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/export_template_manager.cpp editor/groups_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
+#: editor/project_settings_editor.cpp editor/property_editor.cpp
+#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Close"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Signal:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect '%s' from '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect all from signal: '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect a Signal to a Method"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit Connection:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from this signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect All"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Go To Method"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Change %s Type"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/project_settings_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Create New %s"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Matches:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Description:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will only take effect when reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will only take effect when reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
+msgid "Path"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Open"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (Can't be restored)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Cannot remove:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Load failed due to missing dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Show Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
+#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Key"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Value"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Godot Engine contributors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Founders"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Lead Developer"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Manager "
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Developers"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Authors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Platinum Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Mini Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Silver Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "License"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Third-party Licenses"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid ""
+"Godot Engine relies on a number of third-party free and open source "
+"libraries, all compatible with the terms of its MIT license. The following "
+"is an exhaustive list of all such third-party components with their "
+"respective copyright statements and license terms."
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "All Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Licenses"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Error opening package file, not in ZIP format."
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Uncompressing Assets"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Package installed successfully!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Success!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/editor_node.cpp
+msgid "Install"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Package Installer"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Speakers"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Rename Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Change Audio Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Bypass Effects"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Select Audio Bus Send"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio Bus, Drag and Drop to rearrange."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bypass"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bus options"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Master bus can't be deleted!"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Duplicate Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save Audio Bus Layout As..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Location for New Layout..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Open Audio Bus Layout"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "There is no '%s' file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Layout"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Invalid file, not an audio bus layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add a new Audio Bus to this layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load an existing Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save As"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save this Bus Layout to a file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/import_dock.cpp
+msgid "Load Default"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load the default Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Create a new Bus Layout."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Must not collide with an existing engine class name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Must not collide with an existing built-in type name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Must not collide with an existing global constant name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Keyword cannot be used as an autoload name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
+msgid "Name"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Storing local changes..."
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating scene..."
+msgstr ""
+
+#: editor/editor_data.cpp editor/editor_properties.cpp
+msgid "[empty]"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "[unsaved]"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Please select a base directory first."
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp editor/project_manager.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Name:"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "No export template found at the expected path:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid ""
+"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
+"Etc' in Project Settings."
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid ""
+"Target platform requires 'ETC2' texture compression for GLES3. Enable "
+"'Import Etc 2' in Project Settings."
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid ""
+"Target platform requires 'ETC' texture compression for the driver fallback "
+"to GLES2.\n"
+"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
+"Enabled'."
+msgstr ""
+
+#: editor/editor_export.cpp platform/android/export/export.cpp
+#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
+#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
+msgid "Custom debug template not found."
+msgstr ""
+
+#: editor/editor_export.cpp platform/android/export/export.cpp
+#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
+#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
+msgid "Custom release template not found."
+msgstr ""
+
+#: editor/editor_export.cpp platform/javascript/export/export.cpp
+msgid "Template file not found:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "3D Editor"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Script Editor"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Asset Library"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Scene Tree Editing"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Node Dock"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "FileSystem and Import Docks"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Erase profile '%s'? (no undo)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Profile must be a valid filename and must not contain '.'"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Profile with this name already exists."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "(Editor Disabled, Properties Disabled)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "(Properties Disabled)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "(Editor Disabled)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Class Options:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Enable Contextual Editor"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Enabled Properties:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Enabled Features:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Enabled Classes:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "File '%s' format is invalid, import aborted."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid ""
+"Profile '%s' already exists. Remove it first before importing, import "
+"aborted."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Error saving profile to path: '%s'."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Unset"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Current Profile:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Make Current"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp editor/editor_node.cpp
+#: editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Available Profiles:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Class Options"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "New profile name:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Erase Profile"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Profile(s)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Export Profile"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Manage Editor Feature Profiles"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select This Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Open in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/project_manager.cpp
+msgid "Show in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "New Folder..."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Save"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go to previous folder."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go to next folder."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Go to parent folder."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Refresh files."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "(Un)favorite current folder."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Toggle the visibility of hidden files."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "View items as a grid of thumbnails."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "View items as a list."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
+#: editor/plugins/style_box_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Preview:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid ""
+"There are multiple importers for different types pointing to file %s, import "
+"aborted"
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "(Re)Importing Assets"
+msgstr ""
+
+#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class:"
+msgstr ""
+
+#: editor/editor_help.cpp editor/scene_tree_editor.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Signals:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "enum "
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Online Tutorials:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There are currently no tutorials for this class, you can [color=$color][url="
+"$url]contribute one[/url][/color] or [color=$color][url=$url2]request one[/"
+"url][/color]."
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this property. Please help us by "
+"[color=$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this method. Please help us by [color="
+"$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set Multiple:"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Output:"
+msgstr ""
+
+#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
+msgid "Copy Selection"
+msgstr ""
+
+#: editor/editor_log.cpp editor/editor_profiler.cpp
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/property_editor.cpp editor/scene_tree_dock.cpp
+#: editor/script_editor_debugger.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Clear"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Clear Output"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project export failed with error code %d."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Imported resources can't be saved."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource can't be saved because it does not belong to the edited scene. "
+"Make it unique first."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save Resource As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Can't open '%s'. The file could have been moved or deleted."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while parsing '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unexpected end of file '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Missing '%s' or its dependencies."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while loading '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a tree root."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
+"be satisfied."
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was imported, so it's not editable.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was instanced or inherited.\n"
+"Changes to it won't be kept when saving the current scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource was imported, so it's not editable. Change its settings in the "
+"import panel and then re-import."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene was imported, so changes to it won't be kept.\n"
+"Instancing it or inheriting will allow making changes to it.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This is a remote object, so changes to it won't be kept.\n"
+"Please read the documentation relevant to debugging to better understand "
+"this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: editor/editor_node.cpp editor/filesystem_dock.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Script..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Close"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to '%s' before closing?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Saved %s modified resource(s)."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "A root node is required to save the scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "No"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a root node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a selected node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Run Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to the following scene(s) before quitting?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes the following scene(s) before opening Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This option is deprecated. Situations where refresh must be forced are now "
+"considered a bug. Please report."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Scene '%s' was automatically imported, so it can't be modified.\n"
+"To make changes to it, a new inherited scene can be created."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Clear Recent Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: editor/editor_node.cpp editor/import_dock.cpp
+#: editor/script_create_dialog.cpp
+msgid "Default"
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play This Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Close Other Tabs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Tabs to the Right"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close All Tabs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files or folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Dock Position"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle distraction-free mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Add a new scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Copy Text"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Filter Files..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save All Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Convert To..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "MeshLibrary..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "TileSet..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Undo"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Redo"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
+msgid "Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project Settings..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Orphan Resource Explorer..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
+msgid "Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Take Screenshot"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Screenshots are stored in the Editor Data/Settings Folder."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle System Console"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data/Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Manage Editor Features..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
+msgid "Help"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+msgid "Search"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Online Docs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Q&A"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Issue Tracker"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_profiler.cpp
+msgid "Stop"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Changing the video driver requires restarting the editor."
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_settings_editor.cpp
+#: editor/settings_config_dialog.cpp
+msgid "Save & Restart"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Spins when the editor window redraws."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update Continuously"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update When Changed"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Hide Update Spinner"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Expand Bottom Panel"
+msgstr ""
+
+#: editor/editor_node.cpp scene/resources/visual_shader.cpp
+msgid "Output"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Don't Save"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Android build template is missing, please install relevant templates."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Manage Templates"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This will install the Android project for custom builds.\n"
+"Note that, in order to use it, it needs to be enabled per export preset."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Android build template is already installed and it won't be overwritten.\n"
+"Remove the \"build\" directory manually before attempting this operation "
+"again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Password:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 2D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 3D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Script Editor"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "Open Asset Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the next Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the previous Editor"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Creating Mesh Previews"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Thumbnail..."
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit Plugin"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Update"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Version:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Author:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit:"
+msgstr ""
+
+#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
+#: editor/rename_dialog.cpp
+msgid "Start"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Physics Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Time"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Calls"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Edit Text:"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/script_create_dialog.cpp
+msgid "On"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Layer"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Bit %d, value %d"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "[Empty]"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Pick a Viewport"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New %s"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Make Unique"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Paste"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Convert To %s"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Open Editor"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Selected node is not a Viewport!"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Size: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Page: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Key:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Value:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Add Key/Value Pair"
+msgstr ""
+
+#: editor/editor_run_native.cpp
+msgid ""
+"No runnable export preset found for this platform.\n"
+"Please add a runnable preset in the export menu."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Redownload"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Uninstall"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Installed)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Missing)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Current)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Retrieving mirrors, please wait..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove template version '%s'?"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Invalid version.txt format inside templates: %s."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "No version.txt found inside templates."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error creating path for templates:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Extracting Export Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Importing:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"No download links found for this version. Direct download is only available "
+"for official releases."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Request Failed."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Redirect Loop."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Complete."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error requesting URL:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connecting to Mirror..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Disconnected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Resolving"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Resolve"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connecting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Connect"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Requesting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Downloading"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connection Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "SSL Handshake Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Uncompressing Android Build Sources"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Current Version:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Installed Versions:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Install From File"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove Template"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select Template File"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Export Template Manager"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select mirror from list: (Shift+Click: Open in Browser)"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Status: Import of file failed. Please fix file and reimport manually."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move/rename resources root."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move a folder into itself."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error moving:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error duplicating:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Unable to update dependencies:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Provided name contains invalid characters."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "A file or folder with this name already exists."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Inherited Scene"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Open Scenes"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Add to Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Edit Dependencies..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View Owners..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicate..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "New Script..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Resource..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/project_manager.cpp editor/rename_dialog.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Rename"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Previous Folder/File"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Next Folder/File"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Toggle Split Mode"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Search files"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid ""
+"Scanning Files,\n"
+"Please Wait..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "There is already file or folder with the same name in this location."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Overwrite"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Create Scene"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Find in Files"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Folder:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Filters:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid ""
+"Include the files with the following extensions. Add or remove them in "
+"ProjectSettings."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
+msgid "Replace..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
+msgid "Cancel"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace all (no undo)"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Searching..."
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Search complete"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Group name already exists."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Invalid group name."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Delete Group"
+msgstr ""
+
+#: editor/groups_editor.cpp editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes Not in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Filter nodes"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Empty groups will be automatically removed."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Group Editor"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Manage Groups"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Single Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Importing Scene..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating Lightmaps"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating for Mesh: "
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Running Custom Script..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Saving..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Set as Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Clear Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid " Files"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Import As:"
+msgstr ""
+
+#: editor/import_dock.cpp editor/property_editor.cpp
+msgid "Preset..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Reimport"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Save scenes, re-import and restart"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Changing the type of an imported file requires editor restart."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid ""
+"WARNING: Assets exist that use this resource, they may stop loading properly."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Expand All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Collapse All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save As..."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Edit Resource Clipboard"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Object properties."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Filter properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Changes may be lost!"
+msgstr ""
+
+#: editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: editor/node_dock.cpp
+msgid "Select a single node to edit its signals and groups."
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Edit a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Create a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Plugin Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Subfolder:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Language:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Script Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Activate now?"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid ""
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Insert Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon (Remove Point)"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Remove Polygon And Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Load..."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Move Node Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Change BlendSpace1D Limits"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Change BlendSpace1D Labels"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "This type of node can't be used. Only root nodes are allowed."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Add Node Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Add Animation Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Remove BlendSpace1D Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Move BlendSpace1D Node Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"AnimationTree is inactive.\n"
+"Activate to enable playback, check node warnings if activation fails."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Set the blending position within the space"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Select and move points, create points with RMB."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Open Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Triangle already exists."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Add Triangle"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Change BlendSpace2D Limits"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Change BlendSpace2D Labels"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Remove BlendSpace2D Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Remove BlendSpace2D Triangle"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "BlendSpace2D does not belong to an AnimationTree node."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "No triangles exist, so no blending can take place."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Toggle Auto Triangles"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create triangles by connecting points."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Erase points and triangles."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Generate blend triangles automatically (instead of manually)"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Parameter Changed"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Filters"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Output node can't be added to the blend tree."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Add Node to BlendTree"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Node Moved"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Unable to connect, port may be in use or connection may be invalid."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Nodes Connected"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Nodes Disconnected"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Set Animation"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Delete Node"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Toggle Filter On/Off"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Change Filter"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "No animation player set, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Player path set is invalid, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid ""
+"Animation player has no valid root node path, so unable to retrieve track "
+"names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Node Renamed"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Node..."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Edit Filtered Tracks:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Enable Filtering"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Delete Animation?"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Invalid animation name!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation name already exists!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to copy!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation resource on clipboard!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to edit!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Transitions..."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Open in Inspector"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Enable Onion Skinning"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Onion Skinning Options"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Directions"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Past"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Future"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Depth"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "1 step"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "2 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "3 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Differences Only"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Force White Modulate"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Include Gizmos (3D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pin AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Move Node"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Add Transition"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Immediate"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Sync"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "At End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Travel"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Start and end nodes are needed for a sub-transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "No playback resource set at path: %s."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Node Removed"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition Removed"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Set Start Node (Autoplay)"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"Select and move nodes.\n"
+"RMB to add new nodes.\n"
+"Shift+LMB to create connections."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Create new nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Connect nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Remove selected node or transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Toggle autoplay this animation on start, restart or seek to zero."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Set the end animation. This is useful for sub-transitions."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition: "
+msgstr ""
+
+#: editor/plugins/animation_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "AnimationTree"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Import Animations..."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Filters..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Contents:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "View Files"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connection error, please try again."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect to host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response from host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, return code:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, too many redirects"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Bad download hash, assuming file has been tampered with."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Expected:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Got:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed sha256 hash check"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Asset Download Error:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading (%s / %s)..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Resolving..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Error making request"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Idle"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Install..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Retry"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download Error"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download for this asset is already in progress!"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "First"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Previous"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Next"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Last"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+msgid "Sort:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Reverse sorting."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Category:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Support"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"Can't determine a save path for lightmap images.\n"
+"Save your scene (for images to be saved in the same dir), or pick a save "
+"path from the BakedLightmap properties."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
+"Light' flag is on."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Failed creating lightmap images, make sure path is writable."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Bake Lightmaps"
+msgstr ""
+
+#: editor/plugins/camera_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Preview"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Vertical Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Vertical Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove Vertical Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Horizontal Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Horizontal Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove Horizontal Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Horizontal and Vertical Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move pivot"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Resize CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Children of containers have their anchors and margins values overridden by "
+"their parent."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Presets for the anchors and margins values of a Control node."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"When active, moving Control nodes changes their anchors instead of their "
+"margins."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchors only"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors and Margins"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock Selected"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Unlock Selected"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Group Selected"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Ungroup Selected"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Custom Bone(s) from Node(s)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Toggle snapping."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snapping Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Smart Snapping"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Parent"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Node Anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Node Sides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Node Center"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Other Nodes"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Custom Bone(s) from Node(s)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Custom Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Helpers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Rulers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Origin"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Viewport"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Preview Canvas Scale"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Translation mask for inserting keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation mask for inserting keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale mask for inserting keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert keys (based on mask)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Auto insert keys when objects are translated, rotated on scaled (based on "
+"mask).\n"
+"Keys are only added to existing tracks, no new tracks will be created.\n"
+"Keys must be inserted manually for the first time."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Auto Insert Key"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Multiply grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Divide grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan View"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Cannot instantiate multiple nodes without root."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Default Type"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Polygon3D"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Restart"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Particles"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Mask"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Capture from Pixel"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Colors"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+msgid "CPUParticles"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Mesh"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Node"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat 0"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat 1"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Smoothstep"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load Curve Preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Add Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Left Linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Right Linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load Preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Toggle Curve Linear Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Hold Shift to edit tangents individually"
+msgstr ""
+
+#: editor/plugins/gi_probe_editor_plugin.cpp
+msgid "Bake GI Probe"
+msgstr ""
+
+#: editor/plugins/gradient_editor_plugin.cpp
+msgid "Gradient Edited"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Failed creating shapes!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape(s)"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Contained Mesh is not of type ArrayMesh."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "UV Unwrap failed, mesh may not be manifold?"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "No mesh to debug."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Model has no UV in this layer"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling(s)"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh..."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV1"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV2"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Unwrap UV2 for Lightmap/AO"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generating Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generate Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Can only set point into a ParticlesMaterial process material"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generation Time (sec):"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry doesn't contain any faces."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Points:"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points+Normal (Directed)"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Source: "
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "A processor material of type 'ParticlesMaterial' is required."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generating AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate Visibility AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Out-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove In-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Angles"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Lengths"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Out-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove In-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/physical_bone_plugin.cpp
+msgid "Move Joint"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"Polygon 2D has internal vertices, so it can no longer be edited in the "
+"viewport."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon & UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Add Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygons"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create a custom polygon. Enables custom polygon rendering."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Unpaint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Radius:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Settings"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Configure Grid:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones to Polygon"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Type:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ResourcePreloader"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "AnimationTree has no path set to an AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Path to AnimationPlayer is invalid"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Files"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close and save changes?"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error writing TextFile:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Could not load file at:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving file!"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Importing"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "New Text File..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save File As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "%s Class Reference"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Filter scripts"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle alphabetical sorting of the method list."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Filter methods"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Sort"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Up"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Down"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Copy Script Path"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Previous"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle Scripts Panel"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Debug with External Editor"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open Godot online documentation."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Request Docs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Help improve the Godot documentation by giving feedback."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Discard"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Results"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Connections to method:"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Source"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Signal"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Target"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid ""
+"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "(ignore)"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Only resources from filesystem can be dropped."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Lookup Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Convert Case"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Uppercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Lowercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Capitalize"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Syntax Highlighter"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+msgid "Go To"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+msgid "Bookmarks"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Cut"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Delete Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold/Unfold Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Unfold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Evaluate Selection"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Spaces"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Tabs"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find in Files..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Bookmark"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Bookmark"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Bookmark"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Line..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr ""
+
+#: editor/plugins/shader_editor_plugin.cpp
+msgid ""
+"This shader has been modified on on disk.\n"
+"What action should be taken?"
+msgstr ""
+
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Shader"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "This skeleton has no bones, create some children Bone2D nodes."
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Create Rest Pose from Bones"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Set Rest Pose to Bones"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Skeleton2D"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Make Rest Pose (From Bones)"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Set Bones to Rest Pose"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical bones"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_ik_editor_plugin.cpp
+msgid "Play IK"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translating: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Objects Drawn"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Material Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Shader Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Surface Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Draw Calls"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Vertices"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Transform with View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Rotation with View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock View Rotation"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Unshaded"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Environment"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Information"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View FPS"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Half Resolution"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Enable Doppler"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Cinematic Preview"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Forward"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Backwards"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Up"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Down"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Speed Modifier"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Note: The FPS value displayed is the editor's framerate.\n"
+"It cannot be used as a reliable indication of in-game performance."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Nodes To Floor"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Drag: Rotate\n"
+"Alt+Drag: Move\n"
+"Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Local Space"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Toggle Freelook"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Object to Floor"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog..."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Settings..."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Nameless gizmo"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create Mesh2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create Polygon2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create CollisionPolygon2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create LightOccluder2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite is empty!"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Can't convert a sprite using animation frames to mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't replace by mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Convert to Mesh2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't create polygon."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Convert to Polygon2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't create collision polygon."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create CollisionPolygon2D Sibling"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't create light occluder."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create LightOccluder2D Sibling"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Simplification: "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Grow (Pixels): "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Update Preview"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Settings:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "No Frames Selected"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add %d Frame(s)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "New Animation"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add a Texture from File"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frames from a Sprite Sheet"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Select Frames"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Horizontal:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Vertical:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Select/Clear All Frames"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Create Frames from Sprite Sheet"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "SpriteFrames"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Region Rect"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Sep.:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "TextureRegion"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
+msgid "Remove All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Edit Theme"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme editing menu."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create From Current Editor Theme"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Toggle Button"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Disabled Button"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Disabled Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Named Sep."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Submenu"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Subitem 1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Subitem 2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Disabled LineEdit"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Editable Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Subtree"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has,Many,Options"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Style"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Fix Invalid Tiles"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Line Draw"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rectangle Paint"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket Fill"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Disable Autotile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Enable Priority"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid ""
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate Left"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate Right"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip Horizontally"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip Vertically"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear Transform"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Texture(s) to TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected Texture from TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Next Coordinate"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Select the next shape, subtile, or Tile."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Previous Coordinate"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Select the previous shape, subtile, or Tile."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Region Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Collision Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Occlusion Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Navigation Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Bitmask Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Priority Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Icon Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Z Index Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new rectangle."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "You haven't selected a texture to remove."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Texture"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Drag handles to edit Rect.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select current edited sub-tile.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Shift+LMB: Set wildcard bit.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to use as icon, this will be also used on invalid autotile "
+"bindings.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its priority.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Make Polygon Concave"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Make Polygon Convex"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "This property can't be changed."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "TileSet"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add input +"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add output +"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Boolean"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add input port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add output port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change input port type"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change output port type"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change input port name"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change output port name"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Remove input port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Remove output port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Set expression"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Resize VisualShader node"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Set Uniform Name"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Set Input Default Port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Node to Visual Shader"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Duplicate Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Delete Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Visual Shader Input Type Changed"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vertex"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Fragment"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Light"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Create Shader Node"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Grayscale function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts HSV vector to RGB equivalent."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts RGB vector to HSV equivalent."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Sepia function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Burn operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Darken operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Difference operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Dodge operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "HardLight operator"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Lighten operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Overlay operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Screen operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "SoftLight operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the boolean result of the %s comparison between two parameters."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Equal (==)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Greater Than (>)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Greater Than or Equal (>=)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns an associated vector if the provided scalars are equal, greater or "
+"less."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the boolean result of the comparison between INF and a scalar "
+"parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the boolean result of the comparison between NaN and a scalar "
+"parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Less Than (<)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Less Than or Equal (<=)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Not Equal (!=)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns an associated vector if the provided boolean value is true or false."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the boolean result of the comparison between two parameters."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the boolean result of the comparison between INF (or NaN) and a "
+"scalar parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Boolean constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Boolean uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for all shader modes."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Input parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for vertex and fragment shader modes."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for fragment and light shader modes."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for fragment shader mode."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for light shader mode."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for vertex shader mode."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for vertex and fragment shader mode."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "E constant (2.718282). Represents the base of the natural logarithm."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Epsilon constant (0.00001). Smallest possible scalar number."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Phi constant (1.618034). Golden ratio."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Pi/4 constant (0.785398) or 45 degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Pi/2 constant (1.570796) or 90 degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Pi constant (3.141593) or 180 degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Tau constant (6.283185) or 360 degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Sqrt2 constant (1.414214). Square root of 2."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the absolute value of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-cosine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse hyperbolic cosine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-sine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse hyperbolic sine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-tangent of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-tangent of the parameters."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse hyperbolic tangent of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Finds the nearest integer that is greater than or equal to the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Constrains a value to lie between two further values."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the cosine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the hyperbolic cosine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts a quantity in radians to degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Base-e Exponential."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Base-2 Exponential."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the nearest integer less than or equal to the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Computes the fractional part of the argument."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse of the square root of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Natural logarithm."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Base-2 logarithm."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the greater of two values."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the lesser of two values."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two scalars."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the opposite value of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 - scalar"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the value of the first parameter raised to the power of the second."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts a quantity in degrees to radians."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 / scalar"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the nearest integer to the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the nearest even integer to the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Clamps the value between 0.0 and 1.0."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Extracts the sign of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the sine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the hyperbolic sine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the square root of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
+"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
+"using Hermite polynomials."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Step function( scalar(edge), scalar(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the tangent of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the hyperbolic tangent of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the truncated value of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Adds scalar to scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Divides scalar by scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies scalar by scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the remainder of the two scalars."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Subtracts scalar from scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Perform the cubic texture lookup."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Perform the texture lookup."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Cubic texture uniform lookup."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "2D texture uniform lookup."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "2D texture uniform lookup with triplanar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Calculate the outer product of a pair of vectors.\n"
+"\n"
+"OuterProduct treats the first parameter 'c' as a column vector (matrix with "
+"one column) and the second parameter 'r' as a row vector (matrix with one "
+"row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix "
+"whose number of rows is the number of components in 'c' and whose number of "
+"columns is the number of components in 'r'."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Composes transform from four vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Decomposes transform to four vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the determinant of a transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the inverse of a transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the transpose of a transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies transform by transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies vector by transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Composes vector from three scalars."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Decomposes vector to three scalars."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the cross product of two vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the distance between two points."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the dot product of two vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the vector that points in the same direction as a reference vector. "
+"The function has three vector parameters : N, the vector to orient, I, the "
+"incident vector, and Nref, the reference vector. If the dot product of I and "
+"Nref is smaller than zero the return value is N. Otherwise -N is returned."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the length of a vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the normalize product of vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 - vector"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 / vector"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the vector that points in the direction of reflection ( a : incident "
+"vector, b : normal vector )."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the vector that points in the direction of refraction."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
+"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
+"using Hermite polynomials."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
+"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
+"using Hermite polynomials."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Step function( vector(edge), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Step function( scalar(edge), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Adds vector to vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Divides vector by vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies vector by vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the remainder of the two vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Subtracts vector from vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, with custom amount of input and "
+"output ports. This is a direct injection of code into the vertex/fragment/"
+"light function, do not use it to write the function declarations inside."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns falloff based on the dot product of surface normal and view "
+"direction of camera (pass associated inputs to it)."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(Fragment/Light mode only) Scalar derivative function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(Fragment/Light mode only) Vector derivative function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
+"differencing."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
+"differencing."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
+"differencing."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
+"differencing."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
+"'y'."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
+"'y'."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "VisualShader"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Edit Visual Property"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Visual Shader Mode Changed"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Runnable"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete patch '%s' from list?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete preset '%s'?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Failed to export the project for platform '%s'.\n"
+"Export templates seem to be missing or invalid."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Failed to export the project for platform '%s'.\n"
+"This might be due to a configuration issue in the export preset or your "
+"export settings."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "The given export path doesn't exist:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing/corrupted:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Presets"
+msgstr ""
+
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+msgid "Add..."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export all resources in the project"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected scenes (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected resources (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources to export:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Patches"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Make Patch"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Features"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Custom (comma-separated):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Feature List:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export With Debug"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The path does not exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose an empty folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose a 'project.godot' or '.zip' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Directory already contains a Godot project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid Project Name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "There is already a folder in this path with the specified name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "It would be a good idea to name your project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Couldn't load project.godot in project path (error %d). It may be missing or "
+"corrupted."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't edit project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Rename Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Installation Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Renderer:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "OpenGL ES 3.0"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Higher visual quality\n"
+"All features available\n"
+"Incompatible with older hardware\n"
+"Not recommended for web games"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "OpenGL ES 2.0"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Lower visual quality\n"
+"Some features not available\n"
+"Works on most hardware\n"
+"Recommended for web games"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Renderer can be changed later, but scenes may need to be adjusted."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't open project at '%s'."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file does not specify the version of Godot "
+"through which it was created.\n"
+"\n"
+"%s\n"
+"\n"
+"If you proceed with opening it, it will be converted to Godot's current "
+"configuration file format.\n"
+"Warning: You won't be able to open the project with previous versions of the "
+"engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You won't be able to open the project with previous versions of the "
+"engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: no main scene defined.\n"
+"Please edit the project and set the main scene in the Project Settings under "
+"the \"Application\" category."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: Assets need to be imported.\n"
+"Please edit the project to trigger the initial import."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to run %d projects at once?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Remove %d projects from the list?\n"
+"The project folders' contents won't be modified."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Remove this project from the list?\n"
+"The project folder's contents won't be modified."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Language changed.\n"
+"The interface will update after restarting the editor or project manager."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Are you sure to scan %s folders for existing Godot projects?\n"
+"This could take a while."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Projects"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Remove Missing"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Templates"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Restart Now"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't run project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"You currently don't have any projects.\n"
+"Would you like to explore official example projects in the Asset Library?"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Key "
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "An action with the name '%s' already exists."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Action deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "All Devices"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Press a Key..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 1"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 2"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Axis Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Global Property"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Select a setting item first!"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "No property '%s' exists."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Setting '%s' is internal, and it can't be deleted."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Delete Item"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override for Feature"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter Mode"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Project Settings (project.godot)"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override For..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "The editor must be restarted for changes to take effect."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Input Map"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Localization"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resources:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locale"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show All Locales"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show Selected Locales Only"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Filter mode:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "File..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Dir..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Select Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Pick a Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Virtual Method"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Batch Rename"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Prefix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Advanced Options"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Substitute"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node's parent name, if available"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node type"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Current scene name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Root node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Sequential integer counter.\n"
+"Compare counter options."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Per Level counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "If set the counter restarts for each group of child nodes"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Initial value for the counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Step"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Amount by which counter is incremented for each node"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Padding"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Minimum number of digits for the counter.\n"
+"Missing digits are padded with leading zeros."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Regular Expressions"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Post-Process"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Keep"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "CamelCase to under_scored"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "under_scored to CamelCase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Case"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Lowercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Uppercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Reset"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Error"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Node must belong to the edited scene to become root."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instantiated scenes can't become root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make node as Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can not perform with the root node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Save New Scene As..."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "New Scene Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Create Root Node:"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "2D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "3D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "User Interface"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Other Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Sub-Resources"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Open Documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Expand/Collapse All"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Extend Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Reparent to New Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Scene Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+msgid "Copy Node Path"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remote"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visible"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Unlock Node"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Button Group"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "(Connecting From)"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node configuration warning:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has %s connection(s) and %s group(s).\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has %s connection(s).\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is in %s group(s).\n"
+"Click to show groups dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Open Script:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is locked.\n"
+"Click to unlock it."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Children are not selectable.\n"
+"Click to make selectable."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visibility"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"AnimationPlayer is pinned.\n"
+"Click to unpin."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node Configuration Warning!"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is empty."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Filename is empty."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is not local."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid base path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "A directory with the same name exists."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid extension."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Wrong extension chosen."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading template '%s'"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error - Could not create script in filesystem."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Open Script / Choose Location"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Open Script"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "File exists, it will be reused."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid class name."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid inherited parent name or path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Script is valid."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Allowed: a-z, A-Z, 0-9, _ and ."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in script (into scene file)."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Will create a new script file."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Will load an existing script file."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Inherits"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Class Name"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Template"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in Script"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Remote "
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Trace"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Pick one or more items from the list to display the graph."
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Copy Error"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Export measures as CSV"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Erase Shortcut"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Restore Shortcut"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Change Shortcut"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Binding"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change AudioStreamPlayer3D Emission Angle"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Particles AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Height"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Inner Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Outer Radius"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select the dynamic library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select dependencies of the library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Remove current entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Double click to create a new entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform:"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dynamic Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Add an architecture entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "GDNativeLibrary"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Enabled GDNative Singleton"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Disabled GDNative Singleton"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Status"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Libraries: "
+msgstr ""
+
+#: modules/gdnative/register_types.cpp
+msgid "GDNative"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Object can't provide a length."
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Plane:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Floor:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Delete Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Paste Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Paint"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Grid Map"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Snap View"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Disabled"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Above"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Below"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit X Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Y Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Z Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Clear Rotation"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clear Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Settings"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Pick Distance:"
+msgstr ""
+
+#: modules/mono/csharp_script.cpp
+msgid "Class name can't be a reserved keyword"
+msgstr ""
+
+#: modules/mono/mono_gd/gd_mono_utils.cpp
+msgid "End of inner exception stack trace"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Bake NavMesh"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Clear the navigation mesh."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Setting up Configuration..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Calculating grid size..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Marking walkable triangles..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Constructing compact heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Eroding walkable area..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Partitioning..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating contours..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating polymesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Converting to native navigation mesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Navigation Mesh Generator Setup:"
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Parsing Geometry..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Done!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Signal Arguments"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument name"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Default Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Duplicate VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Base Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Move Node(s)"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Data"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Script already has function '%s'"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Input Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Resize Comment"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Can't copy the function node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Clipboard is empty!"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit its graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Member"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search VisualScript"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Get %s"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Set %s"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Package name is missing."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Package segments must be of non-zero length."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "The character '%s' is not allowed in Android application package names."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "A digit cannot be the first character in a package segment."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "The character '%s' cannot be the first character in a package segment."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "The package must have at least one '.' separator."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "ADB executable not configured in the Editor Settings."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "OpenJDK jarsigner not configured in the Editor Settings."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Debug keystore not configured in the Editor Settings nor in the preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Custom build requires a valid Android SDK path in Editor Settings."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Invalid Android SDK path for custom build in Editor Settings."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"Android project is not installed for compiling. Install from Editor menu."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Invalid public key for APK expansion."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Invalid package name:"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"Trying to build from a custom built template, but no version info for it "
+"exists. Please reinstall from the 'Project' menu."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"Android build version mismatch:\n"
+" Template installed: %s\n"
+" Godot Version: %s\n"
+"Please reinstall Android build template from 'Project' menu."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Building Android Project (gradle)"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"Building of Android project failed, check output for the error.\n"
+"Alternatively visit docs.godotengine.org for Android build documentation."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "No build apk generated at: "
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "Identifier is missing."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "Identifier segments must be of non-zero length."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "The character '%s' is not allowed in Identifier."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "A digit cannot be the first character in a Identifier segment."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid ""
+"The character '%s' cannot be the first character in a Identifier segment."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "The Identifier must have at least one '.' separator."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "App Store Team ID not specified - cannot configure the project."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "Invalid Identifier:"
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "Required icon is not specified in the preset."
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run in Browser"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run exported HTML in the system's default browser."
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not write file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not open template for export:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Invalid export template:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read custom HTML shell:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read boot splash image file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Using default boot splash image."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid package unique name."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the \"Frames\" property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_object_2d.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
+"define its shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the \"Texture\" "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid ""
+"GPU-based particles are not supported by the GLES2 video driver.\n"
+"Use the CPUParticles2D node instead. You can use the \"Convert to "
+"CPUParticles\" option for this purpose."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
+msgid ""
+"A material to process the particles is not assigned, so no behavior is "
+"imprinted."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/physics_body_2d.cpp
+msgid ""
+"Size changes to RigidBody2D (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "This Bone2D chain should end at a Skeleton2D node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid ""
+"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
+msgstr ""
+
+#: scene/2d/tile_map.cpp
+msgid ""
+"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes "
+"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
+"KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnabler2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRCamera must have an ARVROrigin node as its parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRController must have an ARVROrigin node as its parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The controller ID must not be 0 or this controller won't be bound to an "
+"actual controller."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRAnchor must have an ARVROrigin node as its parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The anchor ID must not be 0 or this anchor won't be bound to an actual "
+"anchor."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVROrigin requires an ARVRCamera child node."
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "%d%%"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "(Time Left: %d:%02d s)"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Meshes: "
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Lights:"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
+msgid "Finishing Plot"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Lighting Meshes: "
+msgstr ""
+
+#: scene/3d/collision_object.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape or CollisionPolygon as a child to define "
+"its shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"Plane shapes don't work well and will be removed in future versions. Please "
+"don't use them."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial whose "
+"Billboard Mode is set to \"Particle Billboard\"."
+msgstr ""
+
+#: scene/3d/gi_probe.cpp
+msgid "Plotting Meshes"
+msgstr ""
+
+#: scene/3d/gi_probe.cpp
+msgid ""
+"GIProbes are not supported by the GLES2 video driver.\n"
+"Use a BakedLightmap instead."
+msgstr ""
+
+#: scene/3d/light.cpp
+msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"GPU-based particles are not supported by the GLES2 video driver.\n"
+"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles"
+"\" option for this purpose."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Nothing is visible because meshes have not been assigned to draw passes."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial whose Billboard "
+"Mode is set to \"Particle Billboard\"."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
+"parent Path's Curve resource."
+msgstr ""
+
+#: scene/3d/physics_body.cpp
+msgid ""
+"Size changes to RigidBody (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid ""
+"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
+"derived node to work."
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid "This body will be ignored until you set a mesh."
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid ""
+"Size changes to SoftBody will be overridden by the physics engine when "
+"running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the \"Frames\" property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/3d/vehicle_body.cpp
+msgid ""
+"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
+"it as a child of a VehicleBody."
+msgstr ""
+
+#: scene/3d/world_environment.cpp
+msgid ""
+"WorldEnvironment requires its \"Environment\" property to contain an "
+"Environment to have a visible effect."
+msgstr ""
+
+#: scene/3d/world_environment.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/world_environment.cpp
+msgid ""
+"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
+"this environment's Background Mode to Canvas (for 2D scenes)."
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "On BlendTree node '%s', animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "Animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "In node '%s', invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Nothing connected to input '%s' of node '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "No root AnimationNode for the graph is set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path to an AnimationPlayer node containing animations is not set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "The AnimationPlayer root node is not a valid node."
+msgstr ""
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Pick a color from the screen."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "HSV"
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Raw"
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Switch between hexadecimal and code values."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Add current color as a preset."
+msgstr ""
+
+#: scene/gui/container.cpp
+msgid ""
+"Container by itself serves no purpose unless a script configures its "
+"children placement behavior.\n"
+"If you don't intend to add a script, use a plain Control node instead."
+msgstr ""
+
+#: scene/gui/control.cpp
+msgid ""
+"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
+"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine, but they will hide upon "
+"running."
+msgstr ""
+
+#: scene/gui/range.cpp
+msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
+msgstr ""
+
+#: scene/gui/scroll_container.cpp
+msgid ""
+"ScrollContainer is intended to work with a single child control.\n"
+"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
+"minimum size manually."
+msgstr ""
+
+#: scene/gui/tree.cpp
+msgid "(Other)"
+msgstr ""
+
+#: scene/main/scene_tree.cpp
+msgid ""
+"Default Environment as specified in Project Settings (Rendering -> "
+"Environment -> Default Environment) could not be loaded."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/visual_shader.cpp
+msgid "Input"
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid source for preview."
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid source for shader."
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid comparison function for that type."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to function."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to uniform."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Varyings can only be assigned in vertex function."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Constants cannot be modified."
+msgstr ""
diff --git a/editor/translations/fa.po b/editor/translations/fa.po
index 60e6216f01..9c919cfa50 100644
--- a/editor/translations/fa.po
+++ b/editor/translations/fa.po
@@ -74,7 +74,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "ازاد کردن"
@@ -683,17 +682,18 @@ msgid "Line Number:"
msgstr "شماره خط:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "تعداد d% رخداد جایگزین شد."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+#, fuzzy
+msgid "%d matches."
msgstr "تطبیقی ندارد"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "تعداد d% رخداد جایگزین شد."
-
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "بین حرو٠کوچک و بزرگ لاتین تمایز قائل شو"
@@ -931,8 +931,7 @@ msgstr "برگزیده‌ها:"
msgid "Recent:"
msgstr "اخیر:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1036,7 +1035,7 @@ msgstr ""
"کنند.\n"
"آیا در هر صورت حذ٠شوند؟(بدون برگشت)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "امکان حذ٠وجود ندارد :"
@@ -1074,7 +1073,7 @@ msgstr "به طور دائمی تعداد 'd%' آیتم را حذ٠کند؟ (ب
msgid "Show Dependencies"
msgstr "بستگی‌ها"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "پوینده‌ی منبع جدا Ø§ÙØªØ§Ø¯Ù‡"
@@ -1163,14 +1162,15 @@ msgid "License"
msgstr "مجوز"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "مجوز‌های شخص ثالث"
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1187,7 +1187,7 @@ msgid "Licenses"
msgstr "گواهینامه"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1698,12 +1698,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "وارد کردن"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "صدور"
@@ -2128,6 +2127,10 @@ msgstr "پاک کردن"
msgid "Clear Output"
msgstr "خروجی"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2427,6 +2430,15 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "باز کردن صحنه"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2524,6 +2536,11 @@ msgstr "پخش صحنه"
msgid "Close Tab"
msgstr "بستن"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "بستن"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2611,6 +2628,10 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr ""
@@ -2621,14 +2642,6 @@ msgid "Save All Scenes"
msgstr "ذخیره صحنه در ..."
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr ""
@@ -2658,26 +2671,37 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "پروژه"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "ترجیحات پروژه"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "ابزارها"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "صدور"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "باز شدن مدیر پروژه؟"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "ابزارها"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "پوینده‌ی منبع جدا Ø§ÙØªØ§Ø¯Ù‡"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2756,12 +2780,13 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "ویرایشگر"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "ویرایشگر ترجیحات"
#: editor/editor_node.cpp
@@ -2803,14 +2828,15 @@ msgstr "ویرایشگر ترجیحات"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "مدیریت صدور قالب ها"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "مدیریت صدور قالب ها"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "راهنما"
@@ -2818,12 +2844,13 @@ msgstr "راهنما"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "جستجو"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3273,8 +3300,9 @@ msgid "Import From Node:"
msgstr "وارد کردن از گره:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
-msgstr ""
+#, fuzzy
+msgid "Redownload"
+msgstr "در حال بارگیری"
#: editor/export_template_manager.cpp
msgid "Uninstall"
@@ -3290,6 +3318,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3353,13 +3385,11 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Request Failed."
msgstr "در حال درخواست..."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3373,13 +3403,19 @@ msgid "Download Complete."
msgstr "دانلود کامل."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "امکان حذ٠وجود ندارد :"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "خطای آدرس درخواستی: "
#: editor/export_template_manager.cpp
@@ -3468,20 +3504,12 @@ msgstr "بارگیری قالب ها"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "برگزیده‌ها:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3518,15 +3546,15 @@ msgid "Provided name contains invalid characters."
msgstr "کاراکترهای معتبر:"
#: editor/filesystem_dock.cpp
+msgid "A file or folder with this name already exists."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Name contains invalid characters."
msgstr "کاراکترهای معتبر:"
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Renaming file:"
msgstr "تغییر متغیر"
@@ -3589,6 +3617,11 @@ msgstr "انتخاب شده را به دو تا تکثیر کن"
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "صحنه جدید"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3659,6 +3692,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "ساختن گره"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3728,6 +3766,14 @@ msgid "Search complete"
msgstr "جستجوی متن"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "بارگذاری خودکار 's%' هم اکنون موجود است!"
@@ -3737,12 +3783,22 @@ msgstr "بارگذاری خودکار 's%' هم اکنون موجود است!"
msgid "Invalid group name."
msgstr "نام نامعتبر."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "تغییر نام گره"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "حذ٠گره(ها)"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3755,12 +3811,13 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
+#, fuzzy
+msgid "Group Editor"
+msgstr "گشودن ویرایشگر اسکریپت"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3970,7 +4027,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4761,10 +4818,6 @@ msgid "View Files"
msgstr "نمایش پرونده ها"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4778,14 +4831,46 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "در حال درخواست..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "امکان حذ٠وجود ندارد :"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "در حال درخواست..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "زمان:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4867,8 +4952,12 @@ msgid "All"
msgstr "همه"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "وارد کردن"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4890,7 +4979,8 @@ msgid "Site:"
msgstr "تارنما:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "پشتیبانی..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4902,6 +4992,11 @@ msgid "Testing"
msgstr "آزمودن"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "بارگیری"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "ÙØ§ÛŒÙ„ های ZIP‌ منابع بازی"
@@ -5069,6 +5164,11 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "پخش Ø³ÙØ§Ø±Ø´ÛŒ صحنه"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "پخش Ø³ÙØ§Ø±Ø´ÛŒ صحنه"
@@ -5099,6 +5199,7 @@ msgid "Zoom Reset"
msgstr "بزرگنمایی کمتر"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "انتخاب حالت"
@@ -5119,14 +5220,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "انتخاب حالت"
@@ -5152,6 +5256,7 @@ msgid "Toggle snapping."
msgstr "یک Breakpoint درج کن"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5168,11 +5273,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5185,6 +5285,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5401,16 +5506,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5731,14 +5826,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5823,19 +5910,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6178,7 +6269,6 @@ msgid "Grid Settings"
msgstr "ترجیحات"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6287,12 +6377,7 @@ msgstr "خطا در بارگذاری:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "نمی‌تواند یک پوشه ایجاد شود."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "نمی‌تواند یک پوشه ایجاد شود."
#: editor/plugins/script_editor_plugin.cpp
@@ -6322,7 +6407,7 @@ msgstr "خطا در بارگذاری:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "ساختن پوشه..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6409,6 +6494,11 @@ msgid "Open..."
msgstr "باز کن"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "باز کردن و اجرای یک اسکریپت"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6449,14 +6539,14 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Close All"
msgstr "بستن"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "اجرا"
@@ -6546,6 +6636,11 @@ msgstr ""
msgid "Search Results"
msgstr "جستجوی راهنما"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "صحنه جدید"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6618,6 +6713,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6655,26 +6751,6 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "دید آزاد"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "به گام بعدی برو"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "یک Breakpoint درج کن"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "برداشتن انتخاب شده"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Fold/Unfold Line"
msgstr "برو به خط"
@@ -6695,6 +6771,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "انتخاب شده را تغییر مقیاس بده"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6713,32 +6794,37 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "یک Breakpoint درج کن"
+msgid "Find Previous"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "ÛŒØ§ÙØªÙ†"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "به گام بعدی برو"
+msgid "Toggle Bookmark"
+msgstr "دید آزاد"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "یک Breakpoint درج کن"
+msgid "Go to Next Bookmark"
+msgstr "به گام بعدی برو"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "یک Breakpoint درج کن"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "ÛŒØ§ÙØªÙ†"
+msgid "Remove All Bookmarks"
+msgstr "برداشتن انتخاب شده"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6751,9 +6837,24 @@ msgid "Go to Line..."
msgstr "برو به خط"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "یک Breakpoint درج کن"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "به گام بعدی برو"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "یک Breakpoint درج کن"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -6998,8 +7099,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "ÙØ±Ø²Ù†Ø¯ قابل ویرایش"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -7055,9 +7157,8 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Select Mode (Q)"
-msgstr "انتخاب حالت"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7067,31 +7168,10 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap Mode (%s)"
-msgstr "انتخاب حالت"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr ""
@@ -7132,23 +7212,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Tool Select"
-msgstr "همه‌ی انتخاب ها"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "دید آزاد"
@@ -7203,7 +7266,8 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "ترجیحات"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7514,10 +7578,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7609,11 +7669,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7739,8 +7799,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8055,6 +8115,10 @@ msgid "TileSet"
msgstr "صدور مجموعه کاشی"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Ø§ÙØ²ÙˆØ¯Ù† نقطه"
@@ -8142,6 +8206,12 @@ msgid "Duplicate Nodes"
msgstr "تکرار کلید‌های انیمیشن"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "مسیر به سمت گره:"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "حذ٠گره(ها)"
@@ -8151,10 +8221,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -8169,6 +8235,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "ساختن گره"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "ساختن گره"
@@ -8533,7 +8604,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8542,7 +8613,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8706,6 +8777,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8731,7 +8806,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8740,7 +8815,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8749,14 +8824,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8801,6 +8876,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9021,6 +9103,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "مدیریت صدور قالب ها"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "صدور با اشکال زدا"
@@ -9175,6 +9261,15 @@ msgstr "پروژه بی نام"
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "وارد کردن پروژه موجود"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "ناتوان در گشودن پروژه"
@@ -9244,8 +9339,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9268,8 +9363,9 @@ msgid "Project Manager"
msgstr "مدیر پروژه"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Ùهرست پروژه ها"
+#, fuzzy
+msgid "Projects"
+msgstr "پروژه"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9293,10 +9389,6 @@ msgid "Templates"
msgstr "قالب ها"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "خروج"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "راه اندازی دوباره"
@@ -9641,6 +9733,10 @@ msgstr "بومی‌سازی‌ها:"
msgid "AutoLoad"
msgstr "بارگیری خودکار"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9696,14 +9792,6 @@ msgstr "انتخاب حالت"
msgid "Select Method"
msgstr "انتخاب حالت"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10005,6 +10093,11 @@ msgid "Remove Node(s)"
msgstr "حذ٠گره(ها)"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "مقدار آرایه را تغییر بده"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10132,19 +10225,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10244,6 +10337,10 @@ msgid "Error loading script from %s"
msgstr "خطای بارگذاری قلم."
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10445,6 +10542,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "ویرایشگر ترجیحات"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10887,10 +10988,30 @@ msgid "Set Variable Type"
msgstr "متغیر را ویرایش کن:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "نام نامعتبر. نباید یا یک نام نوع توکار برخوردی داشته باشد."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "ساختن %s جدید"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "متغیرها:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "ساختن %s جدید"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "انتخاب شده را تغییر مقیاس بده"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "نام یک شناسه‌ی معتبر نیست:"
@@ -11084,11 +11205,6 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
-msgid "Paste Nodes"
-msgstr "مسیر به سمت گره:"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
msgstr "عضوها"
@@ -11908,22 +12024,6 @@ msgstr ""
"تا بتواند یک اندازه بگیرد. در غیر اینصورت، آن را یک RenderTarget قرار دهید و "
"Ø¨Ø§ÙØª داخلی آن را برای نمایش به تعدادی گره تخصیص دهید."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "خطا در ارزش‌دهی آغازین به FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "ÙØ±Ù…ت قلم ناشناخته."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "خطای بارگذاری قلم."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "اندازهٔ قلم نامعتبر."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11960,6 +12060,40 @@ msgid "Constants cannot be modified."
msgstr ""
#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "نمی‌تواند یک پوشه ایجاد شود."
+
+#, fuzzy
+#~ msgid "Select Mode (Q)"
+#~ msgstr "انتخاب حالت"
+
+#, fuzzy
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "انتخاب حالت"
+
+#, fuzzy
+#~ msgid "Tool Select"
+#~ msgstr "همه‌ی انتخاب ها"
+
+#~ msgid "Project List"
+#~ msgstr "Ùهرست پروژه ها"
+
+#~ msgid "Exit"
+#~ msgstr "خروج"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "خطا در ارزش‌دهی آغازین به FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "ÙØ±Ù…ت قلم ناشناخته."
+
+#~ msgid "Error loading font."
+#~ msgstr "خطای بارگذاری قلم."
+
+#~ msgid "Invalid font size."
+#~ msgstr "اندازهٔ قلم نامعتبر."
+
+#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "زبانه قبلی"
diff --git a/editor/translations/fi.po b/editor/translations/fi.po
index e6a6e101b8..9905d85038 100644
--- a/editor/translations/fi.po
+++ b/editor/translations/fi.po
@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-29 19:20+0000\n"
+"PO-Revision-Date: 2019-08-04 14:23+0000\n"
"Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n"
"Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/"
"godot/fi/>\n"
@@ -65,7 +65,6 @@ msgid "On call to '%s':"
msgstr "Kutsuttaessa funktiota '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Vapauta"
@@ -134,29 +133,24 @@ msgid "Anim Change Call"
msgstr "Animaatio: muuta kutsua"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Animaatio: muuta avainruudun aikaa"
+msgstr "Animaatio: muuta monen avainruudun aikaa"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Animaatio: muuta siirtymää"
+msgstr "Animaatio: muuta monta siirtymää"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Animaatio: muuta muunnosta"
+msgstr "Animaatio: muuta monta muunnosta"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Animaatio: muuta avainruudun arvoa"
+msgstr "Animaatio: muuta monen avainruudun arvoa"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "Animaatio: muuta kutsua"
+msgstr "Animaatio: muuta monta kutsua"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -655,16 +649,18 @@ msgid "Line Number:"
msgstr "Rivinumero:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "Löydettiin %d osuma(a)."
+msgid "Replaced %d occurrence(s)."
+msgstr "Korvattu %d osuvuutta."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Ei osumia"
+#, fuzzy
+msgid "%d match."
+msgstr "Löydettiin %d osuma(a)."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Korvattu %d osuvuutta."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Löydettiin %d osuma(a)."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -890,8 +886,7 @@ msgstr "Suosikit:"
msgid "Recent:"
msgstr "Viimeaikaiset:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -992,7 +987,7 @@ msgstr ""
"toimivuuteen.\n"
"Poistetaanko silti? (ei mahdollisuutta kumota)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Ei voida poistaa:"
@@ -1028,7 +1023,7 @@ msgstr "Poista pysyvästi %d kohdetta? (Ei voi kumota!)"
msgid "Show Dependencies"
msgstr "Näytä riippuvuudet"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Irrallisten resurssien hallinta"
@@ -1117,14 +1112,16 @@ msgid "License"
msgstr "Lisenssi"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Kolmannen osapuolen lisenssi"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot moottori käyttää useita kolmannen osapuolen ilmaisia ja avoimia "
@@ -1145,7 +1142,8 @@ msgid "Licenses"
msgstr "Lisenssit"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Virhe avattaessa pakettitiedostoa, ei zip-muodossa."
#: editor/editor_asset_installer.cpp
@@ -1643,12 +1641,11 @@ msgid "New"
msgstr "Uusi"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Tuo"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Vie"
@@ -1785,30 +1782,26 @@ msgid "Move Favorite Down"
msgstr "Siirrä suosikkia alas"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Siirry yläkansioon."
+msgstr "Siirry edelliseen kansioon."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Siirry yläkansioon."
+msgstr "Siirry seuraavaan kansioon."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "Siirry yläkansioon."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Etsi tiedostoista"
+msgstr "Lataa uudelleen tiedostot."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "Kansio suosikkeihin."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
msgstr "Aseta piilotiedostojen näyttäminen."
@@ -2050,6 +2043,11 @@ msgstr "Tyhjennä"
msgid "Clear Output"
msgstr "Tyhjennä tuloste"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "Ikkuna"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Projektin vienti epäonnistui virhekoodilla %d."
@@ -2372,6 +2370,15 @@ msgid "Pick a Main Scene"
msgstr "Valitse pääskene"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Sulje skene"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Sulje skene"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr "Lisäosan '%s' aktivointi epäonnistui, virheellinen asetustiedosto."
@@ -2478,6 +2485,11 @@ msgstr "Pelaa tätä skeneä"
msgid "Close Tab"
msgstr "Sulje välilehti"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Sulje välilehti"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Sulje muut välilehdet"
@@ -2562,6 +2574,10 @@ msgstr "Uusi peritty skene..."
msgid "Open Scene..."
msgstr "Avaa skene..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Avaa viimeaikainen"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Tallenna skene"
@@ -2571,14 +2587,6 @@ msgid "Save All Scenes"
msgstr "Tallenna kaikki skenet"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Sulje skene"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Avaa viimeaikainen"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Muunna..."
@@ -2608,25 +2616,37 @@ msgstr "Palauta skene"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Sekalaiset projekti- tai skenetyökalut."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Projekti"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Projektin asetukset"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Työkalut"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Vie"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Asenna Androidin käännösmalli"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Avaa projektin datakansio"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Työkalut"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Asenna Androidin käännösmalli"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Irrallisten resurssien hallinta"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2723,12 +2743,13 @@ msgstr ""
"käynnistyessä.\n"
"Mikäli peliä ajetaan etälaitteella, on tehokkaampaa käyttää verkkolevyä."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Editori"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Editorin asetukset"
#: editor/editor_node.cpp
@@ -2764,14 +2785,16 @@ msgid "Open Editor Settings Folder"
msgstr "Avaa editorin asetuskansio"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "Hallinnoi editorin ominaisuuksia"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Hallinnoi vientimalleja"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Ohje"
@@ -2779,12 +2802,13 @@ msgstr "Ohje"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Hae"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Dokumentaatio"
@@ -3063,9 +3087,8 @@ msgid "Calls"
msgstr "Kutsuja"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Muokkaa teemaa"
+msgstr "Muokkaa tekstiä:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3239,7 +3262,8 @@ msgid "Import From Node:"
msgstr "Tuo solmusta:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Lataa uudelleen"
#: editor/export_template_manager.cpp
@@ -3256,6 +3280,10 @@ msgid "Download"
msgstr "Lataa"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Puuttuva)"
@@ -3319,12 +3347,10 @@ msgid "No response."
msgstr "Ei vastausta."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Pyyntö epäonnistui."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Loputon uudelleenohjaus."
@@ -3338,15 +3364,22 @@ msgid "Download Complete."
msgstr "Lataus valmis."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Teemaa ei voi tallentaa tiedostoon:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Vientimallien asennus epäonnistui. Ongelmallisten vientimallien arkisto "
"löytyy kohteesta '%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Virhe pyydettäessä osoitetta: "
#: editor/export_template_manager.cpp
@@ -3431,23 +3464,11 @@ msgstr "Lataa mallit"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Valitse peilipalvelin listasta: (Shift+napsautus: Avaa selaimessa)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Tiedostoa file_type_cache.cch ei voitu avata kirjoittamista varten. "
-"Välimuistia ei tallenneta!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Suosikit"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"Tiedostoa '%s' ei voida avata, koska sitä ei näytä löytyvän "
-"tiedostojärjestelmästäsi!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Tila: Tuonti epäonnistui. Ole hyvä, korjaa tiedosto ja tuo se uudelleen."
@@ -3481,14 +3502,14 @@ msgid "Provided name contains invalid characters."
msgstr "Annettu nimi sisältää virheellisiä kirjainmerkkejä."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Nimi sisältää virheellisiä kirjainmerkkejä."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Tällä nimellä löytyy jo kansio tai tiedosto."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Nimi sisältää virheellisiä kirjainmerkkejä."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Nimetään tiedosto uudelleen:"
@@ -3544,6 +3565,11 @@ msgstr "Kahdenna..."
msgid "Move To..."
msgstr "Siirrä..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Uusi skene"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Uusi skripti..."
@@ -3609,6 +3635,11 @@ msgstr "Tästä sijainnista löytyy jo samanniminen tiedosto tai kansio."
msgid "Overwrite"
msgstr "Ylikirjoita"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Luo skenestä"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Luo skripti"
@@ -3671,6 +3702,14 @@ msgid "Search complete"
msgstr "Haku valmis"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Lisää ryhmään"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Poista ryhmästä"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Ryhmän nimi on jo olemassa."
@@ -3678,12 +3717,23 @@ msgstr "Ryhmän nimi on jo olemassa."
msgid "Invalid group name."
msgstr "Virheellinen ryhmän nimi."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Hallinnoi ryhmiä"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Poista asettelu"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Ryhmät"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Ryhmään kuulumattomat solmut"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3696,12 +3746,13 @@ msgid "Nodes in Group"
msgstr "Ryhmään kuuluvat solmut"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Lisää ryhmään"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Poista ryhmästä"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Skriptieditori"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3912,7 +3963,8 @@ msgid "MultiNode Set"
msgstr "Aseta usealle solmulle"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Valitse solmu, jonka signaaleja ja ryhmiä haluat muokata."
#: editor/plugin_config_dialog.cpp
@@ -4671,10 +4723,6 @@ msgid "View Files"
msgstr "Näytä tiedostot"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Palvelinta ei löytynyt:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Yhteysvirhe, ole hyvä ja yritä uudelleen."
@@ -4687,14 +4735,47 @@ msgid "No response from host:"
msgstr "Ei vastausta isännältä:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Palvelinta ei löytynyt:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Pyyntö epäonnistui, virhekoodi:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Pyyntö epäonnistui."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Teemaa ei voi tallentaa tiedostoon:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Pyyntö epäonnistui, liikaa uudelleenohjauksia"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Loputon uudelleenohjaus."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Pyyntö epäonnistui, virhekoodi:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Aika"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
"Latauksessa väärä hajautuskoodi, oletetaan että tiedostoa on näpelöity."
@@ -4772,8 +4853,13 @@ msgid "All"
msgstr "Kaikki"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Tuo uudelleen..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Liitännäiset"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4794,7 +4880,8 @@ msgid "Site:"
msgstr "Sivu:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Tuki..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4806,6 +4893,11 @@ msgid "Testing"
msgstr "Testaus"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Lataa..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Assettien zip-tiedosto"
@@ -4971,6 +5063,11 @@ msgid "Paste Pose"
msgstr "Liitä asento"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Poista luut"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Luo mukautetut luut solmuista"
@@ -5001,6 +5098,7 @@ msgid "Zoom Reset"
msgstr "Palauta oletuslähennystaso"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Valitse tila"
@@ -5023,14 +5121,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt + Hiiren oikea painike: Syvyyslistan valinta"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Siirtotila"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Kääntötila"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Skaalaustila"
@@ -5056,6 +5157,7 @@ msgid "Toggle snapping."
msgstr "Aseta tarttuminen."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Käytä tarttumista"
@@ -5072,11 +5174,6 @@ msgid "Use Rotation Snap"
msgstr "Tartu käännettäessä"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Määrittele tarttuminen..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Suhteellinen tarttuminen"
@@ -5089,6 +5186,11 @@ msgid "Smart Snapping"
msgstr "Älykäs tarttuminen"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Määrittele tarttuminen..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "Tartu isäntään"
@@ -5303,16 +5405,6 @@ msgstr "Aseta kahva"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Virhe ladattaessa kuvaa:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Kuvassa ei ole pikseleitä, joiden läpinäkyvyys on enemmän kuin 128…"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Lataa emissiomaski"
@@ -5625,14 +5717,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Pinnan lähde on virheellinen (tahkot puuttuvat)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "Lähteellä ei ole kiinteitä tahkoja täytettäväksi."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Aluetta ei voitu kartoittaa."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Valitse lähdemesh:"
@@ -5717,20 +5801,27 @@ msgid "Generation Time (sec):"
msgstr "Luontiaika (s):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Pinnat eivät sisällä aluetta!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Ei pintoja!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Solmulta puuttuu geometria (tahkot)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Solmu ei sisällä geometriaa."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Solmulta puuttuu geometria (tahkot)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Solmu ei sisällä geometriaa."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6063,7 +6154,6 @@ msgid "Grid Settings"
msgstr "Ruudukon asetukset"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Tartu"
@@ -6169,12 +6259,9 @@ msgid "Error writing TextFile:"
msgstr "Virhe kirjoitettaessa teksitiedostoa:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Virhe: ei voitu ladata tiedostoa."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "Virhe - Ei voitu ladata tiedostoa."
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "Ruutua ei löytynyt:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6197,7 +6284,8 @@ msgid "Error Importing"
msgstr "Virhe tuonnissa"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Uusi tekstitiedosto..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6278,6 +6366,11 @@ msgid "Open..."
msgstr "Avaa..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Avaa skripti"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Tallenna kaikki"
@@ -6315,13 +6408,13 @@ msgid "Save Theme"
msgstr "Tallenna teema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Sulje dokumentaatio"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Sulje kaikki"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Sulje dokumentaatio"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Suorita"
@@ -6409,6 +6502,11 @@ msgstr "Debuggeri"
msgid "Search Results"
msgstr "Haun tulokset"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Tyhjennä viimeisimmät skenet"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "Yhteydet metodiin:"
@@ -6476,6 +6574,7 @@ msgid "Syntax Highlighter"
msgstr "Syntaksin korostaja"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr "Mene"
@@ -6510,22 +6609,6 @@ msgid "Toggle Comment"
msgstr "Lisää tai poista kommentit"
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr "Aseta kirjanmerkki"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "Mene seuraavaan kirjanmerkkiin"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr "Mene edelliseen kirjanmerkkiin"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "Poista kaikki kirjanmerkit"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Laskosta tai avaa rivi"
@@ -6546,6 +6629,11 @@ msgid "Complete Symbol"
msgstr "Täydennä symboli"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Skaalaa valintaa"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Poista välilyönnit lopusta"
@@ -6562,29 +6650,32 @@ msgid "Auto Indent"
msgstr "Automaattinen sisennys"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Aseta tai poista keskeytyskohta"
+msgid "Find Previous"
+msgstr "Etsi edellinen"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Poista kaikki keskeytyskohdat"
+msgid "Find in Files..."
+msgstr "Etsi tiedostoista..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Mene seuraavaan keskeytyskohtaan"
+msgid "Contextual Help"
+msgstr "Asiayhteydellinen ohje"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Mene edelliseen keskeytyskohtaan"
+msgid "Toggle Bookmark"
+msgstr "Aseta kirjanmerkki"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Etsi edellinen"
+msgid "Go to Next Bookmark"
+msgstr "Mene seuraavaan kirjanmerkkiin"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Etsi tiedostoista..."
+msgid "Go to Previous Bookmark"
+msgstr "Mene edelliseen kirjanmerkkiin"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Poista kaikki kirjanmerkit"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6595,8 +6686,21 @@ msgid "Go to Line..."
msgstr "Mene riville..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Asiayhteydellinen ohje"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Aseta tai poista keskeytyskohta"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Poista kaikki keskeytyskohdat"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Mene seuraavaan keskeytyskohtaan"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Mene edelliseen keskeytyskohtaan"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -6775,14 +6879,12 @@ msgid "Rear"
msgstr "Taka"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Transform with View"
-msgstr "Kohdista näkymään"
+msgstr "Kohdista muunnos näkymään"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Rotation with View"
-msgstr "Kohdista valinta näkymään"
+msgstr "Kohdista kierto näkymään"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -6837,8 +6939,9 @@ msgid "Audio Listener"
msgstr "Äänikuuntelija"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Doppler käytössä"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Kytke suodatus"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6893,8 +6996,8 @@ msgid "Snap Nodes To Floor"
msgstr "Tarraa solmut lattiaan"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Valintatila (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6907,30 +7010,11 @@ msgstr ""
"Alt + Hiiren oikea painike: Syvyyslistan valinta"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Siirtotila (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Kääntötila (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Skaalaustila (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Paikalliset koordinaatit"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Paikallisavaruuden tila (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Tarttumisen tila (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Alanäkymä"
@@ -6971,22 +7055,6 @@ msgid "Focus Selection"
msgstr "Kohdista valintaan"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Valintatyökalu"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Siirtotyökalu"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Kiertotyökalu"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Skaalaustyökalu"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Kytke liikkuminen päälle/pois"
@@ -7041,7 +7109,8 @@ msgstr "Näytä ruudukko"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Asetukset"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7334,10 +7403,6 @@ msgid "TextureRegion"
msgstr "Tekstuurialue"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "Teemaa ei voi tallentaa tiedostoon:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Lisää kaikki"
@@ -7422,11 +7487,13 @@ msgid "Submenu"
msgstr "Alivalikko"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+#, fuzzy
+msgid "Subitem 1"
msgstr "Osanen 1"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+#, fuzzy
+msgid "Subitem 2"
msgstr "Osanen 2"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7543,9 +7610,10 @@ msgid "Paint Tile"
msgstr "Maalaa ruutu"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Shift+Hiiren oikea: Piirrä viiva\n"
"Shift+Ctrl+Hiiren oikea: Suorakaidemaalaus"
@@ -7842,6 +7910,10 @@ msgid "TileSet"
msgstr "Ruutuvalikoima"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(Vain GLES3)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr "Lisää tulo +"
@@ -7918,6 +7990,11 @@ msgid "Duplicate Nodes"
msgstr "Kahdenna solmut"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Liitä solmut"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "Poista solmut"
@@ -7926,10 +8003,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "Visual Shaderin syötteen tyyppi vaihdettu"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr "(Vain GLES3)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "Kärkipiste"
@@ -7942,6 +8015,11 @@ msgid "Light"
msgstr "Valo"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Luo Shader solmu"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr "Luo Shader solmu"
@@ -8305,10 +8383,11 @@ msgid "Returns the square root of the parameter."
msgstr "Palauttaa parametrin neliöjuuren."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8319,10 +8398,11 @@ msgstr ""
"polynomeilla."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
@@ -8495,6 +8575,11 @@ msgid "Linear interpolation between two vectors."
msgstr "Kahden vektorin välinen lineaari-interpolaatio."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Kahden vektorin välinen lineaari-interpolaatio."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr "Laskee ja palauttaa vektorin normaalin."
@@ -8519,10 +8604,11 @@ msgid "Returns the vector that points in the direction of refraction."
msgstr "Palauttaa vektorin, joka osoittaa taittumisen suuntaan."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8533,10 +8619,11 @@ msgstr ""
"polynomeilla."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8547,20 +8634,22 @@ msgstr ""
"polynomeilla."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Askelfunktio( vektori(edge), vektori(x) ).\n"
"\n"
"Palauttaa 0.0, jos 'x' on pienempi kuin 'edge', ja muutoin 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Askelfunktio( skalaari(edge), vektori(x) ).\n"
"\n"
@@ -8613,6 +8702,13 @@ msgstr ""
"suuntavektorin pistetuloon (välitä nämä syötteinä)."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr "(Vain Fragment/Light tilat) Skalaariderivaattafunktio."
@@ -8841,6 +8937,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Tälle alustalle ei löytynyt vientipohjia:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Hallinnoi vientimalleja"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "Vie debugaten"
@@ -9000,6 +9100,15 @@ msgid "Unnamed Project"
msgstr "Nimetön projekti"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Tuo olemassaoleva projekti"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "Ei voida avata projektia kohteesta '%s'."
@@ -9094,11 +9203,13 @@ msgstr ""
"Projektikansion sisältöä ei muuteta."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
-"Poista kaikki puuttuvat projektit listalta? (Kansioiden sisältöjä ei muuteta)"
+"Poista %d projektia listalta?\n"
+"Projektikansioiden sisältöjä ei muuteta."
#: editor/project_manager.cpp
msgid ""
@@ -9122,8 +9233,9 @@ msgid "Project Manager"
msgstr "Projektinhallinta"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Projektiluettelo"
+#, fuzzy
+msgid "Projects"
+msgstr "Projekti"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9146,10 +9258,6 @@ msgid "Templates"
msgstr "Mallit"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Poistu"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Käynnistä uudelleen nyt"
@@ -9489,6 +9597,10 @@ msgstr "Kielet:"
msgid "AutoLoad"
msgstr "Automaattilataus"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Liitännäiset"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Nolla"
@@ -9541,14 +9653,6 @@ msgstr "Valitse virtuaalinen metodi"
msgid "Select Method"
msgstr "Valitse metodi"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "PVRTC-työkalun suoritus ei onnistunut:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr "Muunnettua kuva ei voitu ladata takaisin PVRTC-työkalulla:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "Niputettu uudelleennimeäminen"
@@ -9846,6 +9950,11 @@ msgid "Remove Node(s)"
msgstr "Poista solmu(t)"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Vaihda lähtöportin nimi"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9890,9 +9999,8 @@ msgid "Extend Script"
msgstr "Laajenna skriptiä"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
-msgstr "Vaihda solmun isäntää"
+msgstr "Vaihda solmulle uusi isäntä"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -9967,24 +10075,27 @@ msgid "Node configuration warning:"
msgstr "Solmun konfiguroinnin varoitus:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"Solmulla on yhteyksiä ja ryhmiä.\n"
"Napsauta näyttääksesi signaalitelakan."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"Solmulla on liitäntöjä.\n"
"Napsauta näyttääksesi signaalitelakan."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"Solmu kuuluu ryhmään.\n"
@@ -10083,6 +10194,11 @@ msgid "Error loading script from %s"
msgstr "Virhe ladattaessa skripti %s:stä"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Ylikirjoita"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "Ei mitään"
@@ -10271,6 +10387,10 @@ msgid "Change Shortcut"
msgstr "Muuta pikanäppäintä"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Editorin asetukset"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Pikanäppäimet"
@@ -10691,10 +10811,32 @@ msgid "Set Variable Type"
msgstr "Aseta muuttujan tyyppi"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr ""
+"Ei saa mennä päällekkäin olemassa olevan sisäänrakennetun tyypin nimen "
+"kanssa."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Luo uusi suorakulmio."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Muuttujat:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Luo uusi suorakulmio."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Luo uusi polygoni."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Nimi ei ole kelvollinen tunniste:"
@@ -10884,10 +11026,6 @@ msgid "Cut Nodes"
msgstr "Leikkaa solmut"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Liitä solmut"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "Muokkaa jäsentä"
@@ -11760,22 +11898,6 @@ msgstr ""
"saada koon. Muutoin tee siitä RenderTarget ja aseta sen sisäinen tekstuuri "
"johonkin solmuun näkyväksi."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Virhe FreeType:n alustamisessa."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Tuntematon fonttimuoto."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Virhe fontin latauksessa."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Virheellinen fonttikoko."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Syöte"
@@ -11808,6 +11930,108 @@ msgstr "Varying tyypin voi sijoittaa vain vertex-funktiossa."
msgid "Constants cannot be modified."
msgstr "Vakioita ei voi muokata."
+#~ msgid "No Matches"
+#~ msgstr "Ei osumia"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Tiedostoa file_type_cache.cch ei voitu avata kirjoittamista varten. "
+#~ "Välimuistia ei tallenneta!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "Tiedostoa '%s' ei voida avata, koska sitä ei näytä löytyvän "
+#~ "tiedostojärjestelmästäsi!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Virhe ladattaessa kuvaa:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Kuvassa ei ole pikseleitä, joiden läpinäkyvyys on enemmän kuin 128…"
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Lähteellä ei ole kiinteitä tahkoja täytettäväksi."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Aluetta ei voitu kartoittaa."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Pinnat eivät sisällä aluetta!"
+
+#~ msgid "No faces!"
+#~ msgstr "Ei pintoja!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Virhe: ei voitu ladata tiedostoa."
+
+#~ msgid "Error could not load file."
+#~ msgstr "Virhe - Ei voitu ladata tiedostoa."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Doppler käytössä"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Valintatila (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Siirtotila (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Kääntötila (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Skaalaustila (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Paikalliset koordinaatit"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Tarttumisen tila (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Valintatyökalu"
+
+#~ msgid "Tool Move"
+#~ msgstr "Siirtotyökalu"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Kiertotyökalu"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Skaalaustyökalu"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "Poista kaikki puuttuvat projektit listalta? (Kansioiden sisältöjä ei "
+#~ "muuteta)"
+
+#~ msgid "Project List"
+#~ msgstr "Projektiluettelo"
+
+#~ msgid "Exit"
+#~ msgstr "Poistu"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "PVRTC-työkalun suoritus ei onnistunut:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr "Muunnettua kuva ei voitu ladata takaisin PVRTC-työkalulla:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Virhe FreeType:n alustamisessa."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Tuntematon fonttimuoto."
+
+#~ msgid "Error loading font."
+#~ msgstr "Virhe fontin latauksessa."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Virheellinen fonttikoko."
+
#~ msgid "Previous Folder"
#~ msgstr "Edellinen kansio"
@@ -12458,9 +12682,6 @@ msgstr "Vakioita ei voi muokata."
#~ msgid "Erase selection"
#~ msgstr "Tyhjennä valinta"
-#~ msgid "Could not find tile:"
-#~ msgstr "Ruutua ei löytynyt:"
-
#~ msgid "Item name or ID:"
#~ msgstr "Nimi tai ID:"
@@ -12672,9 +12893,6 @@ msgstr "Vakioita ei voi muokata."
#~ msgid "Info"
#~ msgstr "Tietoja"
-#~ msgid "Re-Import..."
-#~ msgstr "Tuo uudelleen..."
-
#~ msgid "Target path is empty."
#~ msgstr "Kohdepolku on tyhjä."
@@ -12923,9 +13141,6 @@ msgstr "Vakioita ei voi muokata."
#~ msgid "8 Bits"
#~ msgstr "8 bittiä"
-#~ msgid "Window"
-#~ msgstr "Ikkuna"
-
#~ msgid "Up"
#~ msgstr "Ylös"
diff --git a/editor/translations/fil.po b/editor/translations/fil.po
index c863ce1071..c089099228 100644
--- a/editor/translations/fil.po
+++ b/editor/translations/fil.po
@@ -7,8 +7,8 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2019-04-07 08:04+0000\n"
-"Last-Translator: Amado Wilkins <epicalert68@gmail.com>\n"
+"PO-Revision-Date: 2019-08-11 10:23+0000\n"
+"Last-Translator: Marco Santos <enum.scima@gmail.com>\n"
"Language-Team: Filipino <https://hosted.weblate.org/projects/godot-engine/"
"godot/fil/>\n"
"Language: fil\n"
@@ -16,103 +16,107 @@ msgstr ""
"Content-Transfer-Encoding: 8-bit\n"
"Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 == 4 "
"|| n % 10 == 6 || n % 10 == 9);\n"
-"X-Generator: Weblate 3.6-dev\n"
+"X-Generator: Weblate 3.8-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
+"Invalid na type argument para sa convert(), gamitin ang mga TYPE_* na "
+"constant."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
+"Kulang ang mga byte para sa pag-decode ng mga byte, o kaya naman invalid na "
+"format."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Invalid na input %i (hindi pinasa) sa ekspresyon"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
+"Hindi magagamit ang self dahil ang instance ay naka-null (hindi pinasa)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr ""
+msgstr "Invalid na mga operand para sa operator na %s, %s, at %s."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr ""
+msgstr "Invalid na index ng type na %s para sa base type na %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Invalid na pinangalang index '%s' para sa base type na %s"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr ""
+msgstr "Mga invalid na argument para i-construct ang '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "On call sa '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
-msgstr ""
+msgstr "Malaya"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Balanse"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
-msgstr ""
+msgstr "Salamin"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
-msgstr ""
+msgstr "Oras:"
#: editor/animation_bezier_editor.cpp
msgid "Value:"
-msgstr ""
+msgstr "Halaga:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr ""
+msgstr "Mag-insert ng Key Rito"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr ""
+msgstr "I-duplicate ang (mga) Napiling Key"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr ""
+msgstr "Burahin ang (mga) Napiling Key"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
-msgstr "Idagdag Ang Bezier Point"
+msgstr "Magdagdag ng Bezier Point"
#: editor/animation_bezier_editor.cpp
msgid "Move Bezier Points"
-msgstr "Ilipat Ang Mga Bezier Points"
+msgstr "Maglipat ng (mga) Bezier Point"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr ""
+msgstr "I-anim ang (mga) Duplicate Key"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr ""
+msgstr "I-anim ang (mga) Delete Key"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
-msgstr ""
+msgstr "I-anim ang Oras ng Pagbago ng Keyframe"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
-msgstr ""
+msgstr "I-anim ang Transisyon ng Pagbago"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
@@ -631,15 +635,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -863,8 +867,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -958,7 +961,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -994,7 +997,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1083,14 +1086,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1107,7 +1110,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1590,12 +1593,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -1985,6 +1987,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2281,6 +2287,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2374,6 +2388,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2458,20 +2476,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2504,24 +2518,32 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2601,12 +2623,12 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
msgstr ""
#: editor/editor_node.cpp
@@ -2642,14 +2664,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2657,12 +2679,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3100,7 +3123,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3117,6 +3140,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3178,12 +3205,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3197,13 +3222,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3288,19 +3317,11 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3333,11 +3354,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3396,6 +3417,10 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3459,6 +3484,10 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "Create Scene"
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3519,6 +3548,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3526,12 +3563,20 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Delete Group"
+msgstr ""
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3544,11 +3589,11 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
+msgid "Group Editor"
msgstr ""
#: editor/groups_editor.cpp
@@ -3755,7 +3800,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4497,10 +4542,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4513,14 +4554,43 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Oras:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4597,8 +4667,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4619,7 +4692,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4631,6 +4704,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4786,6 +4863,10 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4814,6 +4895,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4834,14 +4916,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -4865,6 +4950,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4881,11 +4967,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4898,6 +4979,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5105,16 +5191,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5427,14 +5503,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5518,19 +5586,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't contain geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5858,7 +5930,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -5964,11 +6035,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5992,7 +6059,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6073,6 +6140,10 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6110,11 +6181,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6202,6 +6273,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6268,6 +6343,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6302,92 +6378,96 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
+msgid "Fold/Unfold Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
+msgid "Fold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
+msgid "Unfold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
+msgid "Clone Down"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
+msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
+msgid "Evaluate Selection"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
+msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
+msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6625,7 +6705,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6679,7 +6759,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6690,27 +6770,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6754,22 +6814,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6824,7 +6868,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7117,10 +7161,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7205,11 +7245,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7327,8 +7367,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7608,6 +7648,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7684,15 +7728,16 @@ msgid "Duplicate Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Delete Nodes"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Visual Shader Input Type Changed"
+msgid "Delete Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
+msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7708,6 +7753,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8066,7 +8115,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8075,7 +8124,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8235,6 +8284,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8260,7 +8313,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8269,7 +8322,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8278,14 +8331,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8330,6 +8383,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8537,6 +8597,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8683,6 +8747,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8752,8 +8824,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8773,7 +8845,7 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
+msgid "Projects"
msgstr ""
#: editor/project_manager.cpp
@@ -8797,10 +8869,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9134,6 +9202,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9186,14 +9258,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9479,6 +9543,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9596,19 +9664,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9699,6 +9767,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -9887,6 +9959,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10297,10 +10373,26 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10485,10 +10577,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11218,22 +11306,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
diff --git a/editor/translations/fr.po b/editor/translations/fr.po
index d5798892a5..efa3da542a 100644
--- a/editor/translations/fr.po
+++ b/editor/translations/fr.po
@@ -59,12 +59,14 @@
# Alexis Comte <comtealexis@gmail.com>, 2019.
# Julian Murgia <the.straton@gmail.com>, 2019.
# Ducoté <Raphalielle@gmail.com>, 2019.
+# Corentin Pacaud Boehm <corentin.pacaudboehm@gmail.com>, 2019.
+# Kentarosan <jacquin.yannis@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-29 19:20+0000\n"
-"Last-Translator: Hugo Locurcio <hugo.locurcio@hugo.pro>\n"
+"PO-Revision-Date: 2019-08-21 15:57+0000\n"
+"Last-Translator: Kentarosan <jacquin.yannis@gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/godot-engine/"
"godot/fr/>\n"
"Language: fr\n"
@@ -72,7 +74,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -115,7 +117,6 @@ msgid "On call to '%s':"
msgstr "Sur appel à '%s' :"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Libre"
@@ -184,22 +185,18 @@ msgid "Anim Change Call"
msgstr "Changer l'appel de l'animation"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Modifier le temps de l'image-clé"
+msgstr "Modification du temps de l'image-clé"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
msgstr "Changer la transition de l'animation"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Changer la transformation de l'animation"
+msgstr "Changer le Transform"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
msgstr "Changer la valeur de l'image-clé de l'animation"
@@ -717,16 +714,18 @@ msgid "Line Number:"
msgstr "Numéro de ligne :"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "%d correspondance(s) trouvée(s)"
+msgid "Replaced %d occurrence(s)."
+msgstr "%d occurrence(s) remplacée(s)."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Pas de correspondances"
+#, fuzzy
+msgid "%d match."
+msgstr "%d correspondance(s) trouvée(s)."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d occurrence(s) remplacée(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "%d correspondance(s) trouvée(s)."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -876,9 +875,8 @@ msgid "Connect"
msgstr "Connecter"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Signal:"
-msgstr "Signaux :"
+msgstr "Signal :"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
@@ -954,8 +952,7 @@ msgstr "Favoris :"
msgid "Recent:"
msgstr "Récents :"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1043,10 +1040,9 @@ msgid "Owners Of:"
msgstr "Propriétaires de :"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Remove selected files from the project? (Can't be restored)"
msgstr ""
-"Supprimer les fichiers sélectionnés de ce projet ? (annulation impossible)"
+"Supprimer les fichiers sélectionnés du projet ? (restauration impossible)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1058,7 +1054,7 @@ msgstr ""
"pour leur fonctionnement.\n"
"Les supprimer tout de même ? (annulation impossible)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Impossible à enlever :"
@@ -1094,7 +1090,7 @@ msgstr "Supprimer de manière permanente %d objet(s) ? (Annulation impossible!)"
msgid "Show Dependencies"
msgstr "Afficher les dépendances"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Explorateur de ressources orphelines"
@@ -1183,14 +1179,16 @@ msgid "License"
msgstr "Licence"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Licences tierce partie"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Le moteur Godot s'appuie sur un certain nombre de bibliothèques libres et "
@@ -1211,7 +1209,8 @@ msgid "Licenses"
msgstr "Licences"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Erreur d'ouverture de paquetage, pas au format zip."
#: editor/editor_asset_installer.cpp
@@ -1416,11 +1415,9 @@ msgstr ""
"Ne doit pas entrer en collision avec un nom de classe du moteur existant."
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing built-in type name."
msgstr ""
-"Ne doit pas entrer en collision avec un nom de type intégré au moteur "
-"existant."
+"Ne doit pas entrer en conflit avec un nom de type existant intégré au moteur."
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing global constant name."
@@ -1627,9 +1624,8 @@ msgid "Node Dock"
msgstr "Dock nœud"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "FileSystem and Import Docks"
-msgstr "Dock système de fichiers"
+msgstr "Module d'importation et système de fichiers"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1694,17 +1690,15 @@ msgstr "Erreur lors de l'enregistrement du profil au chemin: '%s'."
#: editor/editor_feature_profile.cpp
msgid "Unset"
-msgstr ""
+msgstr "Désassigner"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Current Profile:"
-msgstr "Profil actuel"
+msgstr "Profil actuel :"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Make Current"
-msgstr "Actuel :"
+msgstr "Rendre actuel"
#: editor/editor_feature_profile.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -1712,19 +1706,17 @@ msgid "New"
msgstr "Nouveau"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importer"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Exporter"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Available Profiles:"
-msgstr "Profils disponibles"
+msgstr "Profils disponibles :"
#: editor/editor_feature_profile.cpp
msgid "Class Options"
@@ -1747,9 +1739,8 @@ msgid "Export Profile"
msgstr "Profil d'exportation"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Manage Editor Feature Profiles"
-msgstr "Gérer les modèles d'exportation"
+msgstr "Gérer les profils de fonctionnalités de l'éditeur"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select Current Folder"
@@ -1856,30 +1847,26 @@ msgid "Move Favorite Down"
msgstr "Déplacer le favori vers le bas"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Aller au dossier parent."
+msgstr "Aller au dossier précédent."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Aller au dossier parent."
+msgstr "Aller au dossier suivant."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "Aller au dossier parent."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Rechercher des fichiers"
+msgstr "Rafraîchir les fichiers."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "Ajouter ou supprimer des favoris le dossier courant."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
msgstr "Activer / désactiver la visibilité des fichiers cachés."
@@ -1918,6 +1905,8 @@ msgid ""
"There are multiple importers for different types pointing to file %s, import "
"aborted"
msgstr ""
+"Il y a plusieurs importateurs pour différents types pointant vers le fichier "
+"%s, importation avortée"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
@@ -2120,6 +2109,10 @@ msgstr "Effacer"
msgid "Clear Output"
msgstr "Effacer la sortie"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "L'export du projet a échoué avec le code erreur %d."
@@ -2278,7 +2271,6 @@ msgstr ""
"paramètres dans le panneau d'importation et réimportez-la ensuite."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This scene was imported, so changes to it won't be kept.\n"
"Instancing it or inheriting will allow making changes to it.\n"
@@ -2287,7 +2279,8 @@ msgid ""
msgstr ""
"Cette scène a été importée, les modifications ne seront donc pas "
"conservées.\n"
-"L'instancier ou l'hériter permettra de conserver les modifications.\n"
+"L'instancier ou le faire hériter permettra de lui apporter des "
+"modifications.\n"
"Veuillez lire la documentation concernant l'importation des scènes afin de "
"mieux comprendre ce processus."
@@ -2451,6 +2444,15 @@ msgid "Pick a Main Scene"
msgstr "Choisir une scène principale"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Fermer la scène"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Fermer la scène"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Impossible d'activer le greffon depuis : « %s », l’analyse syntaxique de la "
@@ -2571,14 +2573,18 @@ msgstr "Jouer Cette Scène"
msgid "Close Tab"
msgstr "Fermer l'onglet"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Fermer l'onglet"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Fermer les autres onglets"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tabs to the Right"
-msgstr "Fermer la fenêtre à droite"
+msgstr "Fermer les onglets à droite"
#: editor/editor_node.cpp
msgid "Close All Tabs"
@@ -2625,9 +2631,8 @@ msgid "Go to previously opened scene."
msgstr "Aller à la scène ouverte précédemment."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "Copier le chemin"
+msgstr "Copier le texte"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2657,6 +2662,10 @@ msgstr "Nouvelle scène héritée…"
msgid "Open Scene..."
msgstr "Ouvrir une scène…"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Fichiers récents"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Enregistrer la scène"
@@ -2666,14 +2675,6 @@ msgid "Save All Scenes"
msgstr "Enregistrer toutes les scènes"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Fermer la scène"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Fichiers récents"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Convertir vers…"
@@ -2703,25 +2704,37 @@ msgstr "Réinitialiser la scène"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Outils divers liés au projet ou à la scène."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Projet"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Paramètres du projet"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Outils"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Exporter"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Installer un modèle de compilation Android"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Ouvrir le dossier de données du projets"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Outils"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Installer un modèle de compilation Android"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Explorateur de ressources orphelines"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2821,12 +2834,13 @@ msgstr ""
"Quand elle est utilisée à distance sur un périphérique, cette option est "
"plus efficace avec le système de fichiers réseau."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Éditeur"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Paramètres de l'éditeur"
#: editor/editor_node.cpp
@@ -2838,18 +2852,17 @@ msgid "Take Screenshot"
msgstr "Prendre une capture d'écran"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr "Ouvrir le dossier de données/paramètres de l'éditeur"
+msgstr ""
+"Les captures d'écran sont sauvegardées dans le dossier Editor Data/Settings."
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
msgstr "Activer/Désactiver le plein écran"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Toggle System Console"
-msgstr "Activer/désactiver le mode scindé"
+msgstr "Activer/désactiver la console système"
#: editor/editor_node.cpp
msgid "Open Editor Data/Settings Folder"
@@ -2864,14 +2877,16 @@ msgid "Open Editor Settings Folder"
msgstr "Ouvrir le dossier des paramètres de l'éditeur"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "Gérer les fonctionnalités de l'éditeur"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Gérer les modèles d'exportation"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Aide"
@@ -2879,12 +2894,13 @@ msgstr "Aide"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Rechercher"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Documentation en ligne"
@@ -2958,19 +2974,16 @@ msgid "Spins when the editor window redraws."
msgstr "Tourne lorsque la fenêtre de l'éditeur est redessinée."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Continuously"
-msgstr "Continu"
+msgstr "Mettre à jour en continu"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update When Changed"
-msgstr "Repeindre quand modifié"
+msgstr "Mettre à jour quand modifié"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Hide Update Spinner"
-msgstr "Désactiver l'indicateur d'activité"
+msgstr "Cacher l'indicateur d'activité"
#: editor/editor_node.cpp
msgid "FileSystem"
@@ -3021,6 +3034,9 @@ msgid ""
"Remove the \"build\" directory manually before attempting this operation "
"again."
msgstr ""
+"Le modèle de build Android est déjà installé et ne va pas être remplacé.\n"
+"Supprimez le répertoire « build » manuellement avant de retenter cette "
+"opération."
#: editor/editor_node.cpp
msgid "Import Templates From ZIP File"
@@ -3165,9 +3181,8 @@ msgid "Calls"
msgstr "Appels"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Modifier le thème"
+msgstr "Modifier le texte :"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3341,7 +3356,8 @@ msgid "Import From Node:"
msgstr "Importer à partir d'un nœud :"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Télécharger à nouveau"
#: editor/export_template_manager.cpp
@@ -3358,6 +3374,10 @@ msgid "Download"
msgstr "Télécharger"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Manquant)"
@@ -3422,12 +3442,10 @@ msgid "No response."
msgstr "Pas de réponse."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Échec de la requête."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Boucle de Redirection."
@@ -3441,15 +3459,22 @@ msgid "Download Complete."
msgstr "Téléchargement terminé."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Impossible d'enregistrer le thème dans le fichier :"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"L'installation des modèles a échoué. Les archives des modèles posant "
"problème peuvent être trouvées à « %s »."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Erreur lors de la requête de l’URL : "
#: editor/export_template_manager.cpp
@@ -3499,7 +3524,6 @@ msgid "SSL Handshake Error"
msgstr "Erreurs de la négociation SSL"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Uncompressing Android Build Sources"
msgstr "Décompresser les sources de compilation Android"
@@ -3537,23 +3561,11 @@ msgstr ""
"Sélectionner un miroir depuis la liste : (Maj+Click : Ouvrir dans le "
"navigateur)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Impossible d'ouvrir file_type_cache.cch en écriture, le fichier de cache ne "
-"sera pas sauvé !"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Favoris"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"Impossible d'accéder à « %s » car celui-ci n'existe pas dans le système de "
-"fichiers !"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Statut : L'importation du fichier a échoué. Veuillez corriger le fichier et "
@@ -3588,14 +3600,14 @@ msgid "Provided name contains invalid characters."
msgstr "Le nom renseigné contient des caractères invalides."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Le nom contient des caractères invalides."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Un fichier ou un dossier avec ce nom existe déjà."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Le nom contient des caractères invalides."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Renommer le fichier :"
@@ -3616,9 +3628,8 @@ msgid "New Inherited Scene"
msgstr "Nouvelle scène héritée"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open Scenes"
-msgstr "Ouvrir une scène"
+msgstr "Ouvrir des scènes"
#: editor/filesystem_dock.cpp
msgid "Instance"
@@ -3652,6 +3663,11 @@ msgstr "Dupliquer…"
msgid "Move To..."
msgstr "Déplacer vers…"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Nouvelle scène"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Nouveau script…"
@@ -3718,6 +3734,11 @@ msgstr ""
msgid "Overwrite"
msgstr "Écraser"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Créer depuis la scène"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Créer un script"
@@ -3743,6 +3764,8 @@ msgid ""
"Include the files with the following extensions. Add or remove them in "
"ProjectSettings."
msgstr ""
+"Inclure les fichiers avec les extensions suivantes. Ajoutez ou supprimez les "
+"dans les paramètres du projet."
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3778,6 +3801,14 @@ msgid "Search complete"
msgstr "Recherche terminée"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Ajouter au groupe"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Supprimer du groupe"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Le nom du groupe existe déjà."
@@ -3785,12 +3816,23 @@ msgstr "Le nom du groupe existe déjà."
msgid "Invalid group name."
msgstr "Nom de groupe invalide."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Gérer les groupes"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Supprimer la disposition"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Groupes"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Nœuds non groupés"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3803,12 +3845,13 @@ msgid "Nodes in Group"
msgstr "Nœuds groupés"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Ajouter au groupe"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Supprimer du groupe"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Éditeur de Script"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -4018,7 +4061,8 @@ msgid "MultiNode Set"
msgstr "Ensemble multi-nœud"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Sélectionnez un nœud pour modifier les signaux et groupes."
#: editor/plugin_config_dialog.cpp
@@ -4785,10 +4829,6 @@ msgid "View Files"
msgstr "Voir Fichiers"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Impossible de résoudre le nom de l'hôte :"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Erreur de connection, veuillez essayer à nouveau."
@@ -4801,14 +4841,47 @@ msgid "No response from host:"
msgstr "Pas de réponse de l'hôte :"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Impossible de résoudre le nom de l'hôte :"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "La requête a échoué, code retourné :"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Échec de la requête."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Impossible d'enregistrer le thème dans le fichier :"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "La requête a échoué, trop de redirections"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Boucle de Redirection."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "La requête a échoué, code retourné :"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Temps"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Vérification du téléchargement échouée, le fichier a été altéré."
@@ -4849,9 +4922,8 @@ msgid "Idle"
msgstr "Inactif"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "Installer"
+msgstr "Installer..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -4886,8 +4958,13 @@ msgid "All"
msgstr "Tout"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Importer"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Extensions"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4895,9 +4972,8 @@ msgid "Sort:"
msgstr "Trier :"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Reverse sorting."
-msgstr "Envoi d'une requête..."
+msgstr "Tri inverse."
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
@@ -4909,7 +4985,8 @@ msgid "Site:"
msgstr "Site :"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Support…"
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4921,6 +4998,11 @@ msgid "Testing"
msgstr "En période de test"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Charger..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Fichier ZIP de données"
@@ -4979,37 +5061,30 @@ msgid "Rotation Step:"
msgstr "Pas de la rotation :"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Vertical Guide"
msgstr "Déplacer le guide vertical"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Vertical Guide"
-msgstr "Créer un nouveau guide vertical"
+msgstr "Créer un guide vertical"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Vertical Guide"
msgstr "Supprimer le guide vertical"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Horizontal Guide"
msgstr "Déplacer le guide horizontal"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal Guide"
-msgstr "Créer un nouveau guide horizontal"
+msgstr "Créer un guide horizontal"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Horizontal Guide"
msgstr "Supprimer le guide horizontal"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal and Vertical Guides"
msgstr "Créer de nouveaux guides horizontaux et verticaux"
@@ -5054,6 +5129,8 @@ msgid ""
"When active, moving Control nodes changes their anchors instead of their "
"margins."
msgstr ""
+"Lorsqu'ils sont actifs, les nœuds Control en mouvement changent leur ancrage "
+"au lieu de leur marges."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5092,6 +5169,11 @@ msgid "Paste Pose"
msgstr "Coller la pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Effacer les os"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Créer des os personnalisés à partir d'un ou de plusieurs nœuds"
@@ -5122,6 +5204,7 @@ msgid "Zoom Reset"
msgstr "Réinitialiser le facteur d'agrandissement"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Sélectionner le mode"
@@ -5144,14 +5227,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+Bouton droit : Sélection détaillée par liste"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Mode déplacement"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Mode rotation"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Mode de mise à l'échelle"
@@ -5177,6 +5263,7 @@ msgid "Toggle snapping."
msgstr "Activer/Désactiver le magnétisme."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Aligner sur la grille"
@@ -5193,11 +5280,6 @@ msgid "Use Rotation Snap"
msgstr "Rotation alignée"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Configurer le magnétisme…"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Alignement relatif"
@@ -5210,6 +5292,11 @@ msgid "Smart Snapping"
msgstr "Magnétisme intelligent"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Configurer le magnétisme…"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "Aimanter au parent"
@@ -5313,7 +5400,7 @@ msgstr "Cadrer la sélection"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Preview Canvas Scale"
-msgstr ""
+msgstr "Prévisualiser l'échelle du Canvas"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Translation mask for inserting keys."
@@ -5369,9 +5456,8 @@ msgid "Divide grid step by 2"
msgstr "Diviser le pas de la grille par 2"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Pan View"
-msgstr "Vue arrière"
+msgstr "Vue panoramique"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
@@ -5425,16 +5511,6 @@ msgstr "Définir la poignée"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Erreur de chargement d'image :"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Pas de pixels avec transparence > 128 dans l'image..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Charger Masque d'Émission"
@@ -5442,9 +5518,8 @@ msgstr "Charger Masque d'Émission"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Restart"
-msgstr "Redémarrer maintenant"
+msgstr "Redémarrer"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5601,7 +5676,7 @@ msgstr "Créer une forme Trimesh statique"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Failed creating shapes!"
-msgstr ""
+msgstr "Échec de la création de formes !"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Convex Shape(s)"
@@ -5754,14 +5829,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "La surface source est invalide (pas de faces)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "Le parent n'a pas de faces solides à peupler."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Impossible de cartographier la zone."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Sélectionnez un maillage source :"
@@ -5846,20 +5913,27 @@ msgid "Generation Time (sec):"
msgstr "Temps de Génération (sec) :"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Des faces ne contiennent pas de zone !"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Pas de faces !"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Le nœud ne contient pas de géométrie (faces)."
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Le nœud ne contient pas de géométrie."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Le nœud ne contient pas de géométrie (faces)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Le nœud ne contient pas de géométrie."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6193,7 +6267,6 @@ msgid "Grid Settings"
msgstr "Paramètres de la grille"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Aligner"
@@ -6299,11 +6372,8 @@ msgid "Error writing TextFile:"
msgstr "Erreur lors de l'écriture du fichier texte :"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Erreur de chargement de fichier."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+#, fuzzy
+msgid "Could not load file at:"
msgstr "Erreur de chargement de fichier."
#: editor/plugins/script_editor_plugin.cpp
@@ -6327,7 +6397,8 @@ msgid "Error Importing"
msgstr "Erreur d'importation"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Nouveau fichier texte..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6364,18 +6435,16 @@ msgid "Find Next"
msgstr "Correspondance suivante"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter scripts"
-msgstr "Filtrer les propriétés"
+msgstr "Filtrer les scripts"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
msgstr "Basculer le tri alphabétique de la liste de méthodes."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter methods"
-msgstr "Mode de filtre :"
+msgstr "Méthodes de filtrage"
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -6410,6 +6479,11 @@ msgid "Open..."
msgstr "Ouvrir..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Ouvrir un script"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Tout enregistrer"
@@ -6447,13 +6521,13 @@ msgid "Save Theme"
msgstr "Enregistrer le thème"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Fermer les documentations"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Fermer tout"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Fermer les documentations"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Lancer"
@@ -6541,6 +6615,11 @@ msgstr "Débogueur"
msgid "Search Results"
msgstr "Résultats de recherche"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Effacer la liste des scènes récentes"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "Connexions à la méthode :"
@@ -6555,13 +6634,14 @@ msgstr "Signaux"
#: editor/plugins/script_text_editor.cpp
msgid "Target"
-msgstr ""
+msgstr "Cible"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid ""
"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
-msgstr "Rien n'est connecté à l'entrée « %s » du nœud « %s »."
+msgstr ""
+"Méthode connectée '%s' manquante pour le signal '%s' du nœud '%s' vers le "
+"nœud '%s'."
#: editor/plugins/script_text_editor.cpp
msgid "Line"
@@ -6608,18 +6688,18 @@ msgid "Syntax Highlighter"
msgstr "Coloration syntaxique"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
-msgstr ""
+msgstr "Atteindre"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Bookmarks"
-msgstr ""
+msgstr "Signets"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Breakpoints"
-msgstr "Créer des points."
+msgstr "Point d'arrêts"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -6643,26 +6723,6 @@ msgid "Toggle Comment"
msgstr "Commenter/décommenter"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Basculer en vue libre"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Aller au point d'arrêt suivant"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Aller au point d'arrêt précédent"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Supprimer tous"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Réduire/Développer la ligne"
@@ -6683,6 +6743,11 @@ msgid "Complete Symbol"
msgstr "Compléter le symbole"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Mettre à l'échelle la sélection"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Supprimer les espaces de fin de ligne"
@@ -6699,29 +6764,32 @@ msgid "Auto Indent"
msgstr "Indentation automatique"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Placer un point d'arrêt"
+msgid "Find Previous"
+msgstr "Correspondance précédente"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Supprimer tous les points d'arrêt"
+msgid "Find in Files..."
+msgstr "Rechercher dans les fichiers…"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Aller au point d'arrêt suivant"
+msgid "Contextual Help"
+msgstr "Aide contextuelle"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Aller au point d'arrêt précédent"
+msgid "Toggle Bookmark"
+msgstr "Activer / Désactiver signet"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Correspondance précédente"
+msgid "Go to Next Bookmark"
+msgstr "Aller au signet suivant"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Rechercher dans les fichiers…"
+msgid "Go to Previous Bookmark"
+msgstr "Aller au signet précédent"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Supprimer tous les signets"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6732,8 +6800,21 @@ msgid "Go to Line..."
msgstr "Aller à la ligne…"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Aide contextuelle"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Placer un point d'arrêt"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Supprimer tous les points d'arrêt"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Aller au point d'arrêt suivant"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Aller au point d'arrêt précédent"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -6912,14 +6993,12 @@ msgid "Rear"
msgstr "Arrière"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Transform with View"
-msgstr "Aligner avec la vue"
+msgstr "Aligner le Transform avec la vue"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Rotation with View"
-msgstr "Aligner la sélection avec la vue"
+msgstr "Aligner la rotation avec la vue"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -6976,8 +7055,9 @@ msgid "Audio Listener"
msgstr "Écouteur audio"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Activer Doppler"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Activer le filtrage"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -7033,8 +7113,8 @@ msgid "Snap Nodes To Floor"
msgstr "Aligner les nœuds au sol"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Sélectionner le mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7047,30 +7127,11 @@ msgstr ""
"Alt+Bouton droit : Sélection détaillée par liste"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Move déplacement (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Mode rotation (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Mode de mise à l'échelle (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Coordonnées locales"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Mode d'échelle local (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Mode d'aimantation (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Vue de dessous"
@@ -7111,22 +7172,6 @@ msgid "Focus Selection"
msgstr "Focaliser la sélection"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Outil sélection"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Outil déplacement"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Outil rotation"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Outil échelle"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Basculer en vue libre"
@@ -7181,7 +7226,8 @@ msgstr "Afficher la grille"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Paramètres"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7327,14 +7373,12 @@ msgid "Settings:"
msgstr "Paramètres :"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "No Frames Selected"
-msgstr "Cadrer la sélection"
+msgstr "Aucune trame sélectionnée"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add %d Frame(s)"
-msgstr "Ajouter une image"
+msgstr "Ajouter %d Trame(s)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frame"
@@ -7390,7 +7434,7 @@ msgstr "Ajouter une texture à partir d'un fichier"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frames from a Sprite Sheet"
-msgstr ""
+msgstr "Ajouter des trames depuis une feuille de Sprite"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (Before)"
@@ -7409,9 +7453,8 @@ msgid "Move (After)"
msgstr "Déplacer (après)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select Frames"
-msgstr "Pile des appels"
+msgstr "Sélectionner des Trames"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Horizontal:"
@@ -7422,14 +7465,12 @@ msgid "Vertical:"
msgstr "Vertical :"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select/Clear All Frames"
-msgstr "Tout sélectionner"
+msgstr "Sélectionner/Effacer toutes les trames"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Create Frames from Sprite Sheet"
-msgstr "Créer depuis la scène"
+msgstr "Créer des trames depuis une feuille de Sprite"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "SpriteFrames"
@@ -7481,10 +7522,6 @@ msgid "TextureRegion"
msgstr "RegionDeTexture"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "Impossible d'enregistrer le thème dans le fichier :"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Ajouter tous les items"
@@ -7529,9 +7566,8 @@ msgid "Create From Current Editor Theme"
msgstr "Créer à partir du thème actuel de l'éditeur"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Button"
-msgstr "Bouton de souris"
+msgstr "Activer / Désactiver bouton"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Disabled Button"
@@ -7567,14 +7603,16 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
msgid "Submenu"
-msgstr ""
+msgstr "Sous-menu"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+#, fuzzy
+msgid "Subitem 1"
msgstr "Élément 1"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+#, fuzzy
+msgid "Subitem 2"
msgstr "Élément 2"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7586,9 +7624,8 @@ msgid "Many"
msgstr "Plusieurs"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled LineEdit"
-msgstr "Désactiver l'indicateur d'activité"
+msgstr "LineEdit désactivé"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Tab 1"
@@ -7608,7 +7645,7 @@ msgstr "Élément modifiable"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Subtree"
-msgstr ""
+msgstr "Sous-arbre"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has,Many,Options"
@@ -7681,7 +7718,7 @@ msgstr "Transposer"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Disable Autotile"
-msgstr ""
+msgstr "Désactiver Autotile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Enable Priority"
@@ -7692,10 +7729,13 @@ msgid "Paint Tile"
msgstr "Peindre la case"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
+"Shift + Clic droit : Dessiner une ligne\n"
+"Shift + Ctrl + Clic droit : Dessiner un rectangle"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
@@ -7774,9 +7814,8 @@ msgid "Bitmask Mode"
msgstr "Mode Bitmask"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority Mode"
-msgstr "Mode d'exportation :"
+msgstr "Mode prioritaire"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Icon Mode"
@@ -7992,19 +8031,20 @@ msgid "TileSet"
msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
+msgid "(GLES3 only)"
+msgstr "(GLES3 seulement)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
-msgstr "Ajouter une entrée"
+msgstr "Ajouter une entrée +"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add output +"
-msgstr "Ajouter une entrée"
+msgstr "Ajouter une sortie +"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar"
-msgstr "Échelle :"
+msgstr "Scalaire"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector"
@@ -8012,56 +8052,47 @@ msgstr "Vecteur"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean"
-msgstr ""
+msgstr "Booléen"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add input port"
-msgstr "Ajouter une entrée"
+msgstr "Ajouter un port d'entrée"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add output port"
-msgstr ""
+msgstr "Ajouter un port de sortie"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port type"
-msgstr "Changer le type par défaut"
+msgstr "Changer le type de port d'entrée"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change output port type"
-msgstr "Changer le type par défaut"
+msgstr "Changer le type de port de sortie"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port name"
-msgstr "Changer nom de l'entrée"
+msgstr "Changer le nom du port d'entrée"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change output port name"
-msgstr "Changer nom d'argument"
+msgstr "Changer le nom du port de sortie"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove input port"
-msgstr "Supprimer point"
+msgstr "Supprimer le port d'entrée"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove output port"
-msgstr "Supprimer point"
+msgstr "Supprimer le port de sortie"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Set expression"
-msgstr "Changer l'expression"
+msgstr "Définir l'expression"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Resize VisualShader node"
-msgstr "VisualShader"
+msgstr "Redimensionner le nœud VisualShader"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Uniform Name"
@@ -8080,6 +8111,11 @@ msgid "Duplicate Nodes"
msgstr "Dupliquer le(s) nœud(s)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Coller les nœuds"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "Supprimer des nœuds"
@@ -8088,10 +8124,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "Type d’entrée Visual Shader changée"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "Vertex"
@@ -8105,35 +8137,36 @@ msgstr "Lumière"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Créer un nœud Shader"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
-msgstr "Créer un nœud"
+msgstr "Créer un nœud Shader"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color function."
-msgstr "Aller à la fonction"
+msgstr "Fonction de coloration."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
-msgstr ""
+msgstr "Opérateur de couleur."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Grayscale function."
-msgstr "Créer une fonction"
+msgstr "Fonction niveau de gris."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts HSV vector to RGB equivalent."
-msgstr ""
+msgstr "Convertit le vecteur HSV en équivalent RGB."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts RGB vector to HSV equivalent."
-msgstr ""
+msgstr "Convertit le vecteur RGB en équivalent HSV."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Sepia function."
-msgstr "Renommer la fonction"
+msgstr "Fonction Sepia."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Burn operator."
@@ -8141,243 +8174,249 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Darken operator."
-msgstr ""
+msgstr "Opérateur d'obscurcissement ."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Difference operator."
-msgstr "Différences seules"
+msgstr "Opérateur de différence."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Dodge operator."
-msgstr ""
+msgstr "Opérateur d'évitement."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "HardLight operator"
-msgstr ""
+msgstr "Opérateur HardLight"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Lighten operator."
-msgstr ""
+msgstr "Opérateur d'éclaircissement."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Overlay operator."
-msgstr ""
+msgstr "Opérateur de superposition."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Screen operator."
-msgstr ""
+msgstr "Opérateur d'écran."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "SoftLight operator."
-msgstr ""
+msgstr "Opérateur SoftLight."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color constant."
-msgstr "Constante"
+msgstr "Constante de couleur."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color uniform."
-msgstr "Supprimer la transformation"
+msgstr "Couleur uniforme."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
-msgstr ""
+msgstr "Renvoi le résultat booléen de la comparaison %s de deux paramètres."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Equal (==)"
-msgstr ""
+msgstr "Égal (==)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than (>)"
-msgstr ""
+msgstr "Supérieur à (>)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than or Equal (>=)"
-msgstr ""
+msgstr "Supérieur ou égal à (>=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided scalars are equal, greater or "
"less."
msgstr ""
+"Renvoie un vecteur associé si le scalaire associé est égal, supérieur ou "
+"inférieur."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF and a scalar "
"parameter."
msgstr ""
+"Renvoie le résultat booléen de la comparaison entre INF et un scalaire en "
+"paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between NaN and a scalar "
"parameter."
msgstr ""
+"Renvoie le résultat booléen de la comparaison entre NaN et un scalaire en "
+"paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
-msgstr ""
+msgstr "Inférieur à (<)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than or Equal (<=)"
-msgstr ""
+msgstr "Inférieur ou égal à (<=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Not Equal (!=)"
-msgstr ""
+msgstr "Différent de (!=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided boolean value is true or false."
msgstr ""
+"Renvoi un vecteur associé si la valeur booléen fournie est vrai ou fausse."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the comparison between two parameters."
-msgstr ""
+msgstr "Renvoie le résultat booléen de la comparaison de deux paramètres."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF (or NaN) and a "
"scalar parameter."
msgstr ""
+"Renvoie le résultat booléen de la comparaison entre INF (ou NaN) et un "
+"scalaire en paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean constant."
-msgstr ""
+msgstr "Constante booléenne."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean uniform."
-msgstr ""
+msgstr "Booléen uniforme."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for all shader modes."
-msgstr ""
+msgstr "'%s' paramètre d'entrée pour tous les modes de shader."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Input parameter."
-msgstr "Aimanter au parent"
+msgstr "Paramètre d'entrée."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader modes."
-msgstr ""
+msgstr "'%s' paramètre d'entrée pour les modes de shader fragment et vertex."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment and light shader modes."
-msgstr ""
+msgstr "'%s' paramètre d'entrée pour les modes de shader fragment et light."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment shader mode."
-msgstr ""
+msgstr "'%s' paramètre d'entrée pour le mode de shader fragment."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for light shader mode."
-msgstr ""
+msgstr "'%s' paramètre d'entrée pour le mode de shader light."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex shader mode."
-msgstr ""
+msgstr "'%s' paramètre d'entrée pour le mode de shader vertex."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader mode."
-msgstr ""
+msgstr "'%s' paramètre d'entrée pour les modes de shader fragment et vertex."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar function."
-msgstr "Mettre à l'échelle la sélection"
+msgstr "Fonction scalaire."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar operator."
-msgstr "Échelle (ratio) :"
+msgstr "Opérateur scalaire."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "E constant (2.718282). Represents the base of the natural logarithm."
msgstr ""
+"Constante E (2.718282). Représente la base de tous les logarithmes naturels."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Epsilon constant (0.00001). Smallest possible scalar number."
-msgstr ""
+msgstr "Constante Espilon (0.00001). Plus petit nombre scalaire possible."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Phi constant (1.618034). Golden ratio."
-msgstr ""
+msgstr "Constante Phi (1.618034). Nombre d'or."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/4 constant (0.785398) or 45 degrees."
-msgstr ""
+msgstr "Constante Pi/4 (0.785398) ou 45 degrés."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/2 constant (1.570796) or 90 degrees."
-msgstr ""
+msgstr "Constante Pi/2 (1.570796) ou 90 degrés."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi constant (3.141593) or 180 degrees."
-msgstr ""
+msgstr "Constante Pi (3.141593) ou 180 degrés."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Tau constant (6.283185) or 360 degrees."
-msgstr ""
+msgstr "Constante Tau (6.283185) ou 360 degrés."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sqrt2 constant (1.414214). Square root of 2."
-msgstr ""
+msgstr "Constante Sqrt2 (1.414214). Racine carrée de 2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the absolute value of the parameter."
-msgstr ""
+msgstr "Renvoie la valeur absolue du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-cosine of the parameter."
-msgstr ""
+msgstr "Renvoie l'arc cosinus du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "Renvoie le cosinus hyperbolique inverse du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-sine of the parameter."
-msgstr ""
+msgstr "Renvoie l'arc sinus du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic sine of the parameter."
-msgstr ""
+msgstr "Renvoie le sinus hyperbolique inverse du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameter."
-msgstr ""
+msgstr "Renvoie l'arc tangente du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameters."
-msgstr ""
+msgstr "Renvoie l'arc tangente des paramètres."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic tangent of the parameter."
-msgstr ""
+msgstr "Renvoie la tangente hyperbolique inverse du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Finds the nearest integer that is greater than or equal to the parameter."
msgstr ""
+"Recherche l'entier le plus proche qui est plus supérieur ou égal au "
+"paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Constrains a value to lie between two further values."
-msgstr ""
+msgstr "Limite une valeur entre deux autres valeurs."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the cosine of the parameter."
-msgstr ""
+msgstr "Renvoie le cosinus du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "Renvoie le cosinus hyperbolique du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
-msgstr ""
+msgstr "Convertit une quantité de radians en degrés."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-e Exponential."
@@ -8389,90 +8428,91 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer less than or equal to the parameter."
-msgstr ""
+msgstr "Recherche l'entier le plus proche inférieur ou égal au paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Computes the fractional part of the argument."
-msgstr ""
+msgstr "Calcule la partie décimale de l'argument."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse of the square root of the parameter."
-msgstr ""
+msgstr "Renvoie l'inverse de la racine carrée du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Natural logarithm."
-msgstr ""
+msgstr "Logarithme naturel."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 logarithm."
-msgstr ""
+msgstr "Logarithme base-2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the greater of two values."
-msgstr ""
+msgstr "Renvoie la plus grande des deux valeurs."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the lesser of two values."
-msgstr ""
+msgstr "Renvoie la plus petite des deux valeurs."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two scalars."
-msgstr ""
+msgstr "Interpolation linéaire entre deux scalaires."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the opposite value of the parameter."
-msgstr ""
+msgstr "Renvoie la valeur opposée du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - scalar"
-msgstr ""
+msgstr "1.0 - scalaire"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the value of the first parameter raised to the power of the second."
msgstr ""
+"Renvoie la valeur du premier paramètre à la puissance du second paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in degrees to radians."
-msgstr ""
+msgstr "Convertit une quantité de degrés en radians."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / scalar"
-msgstr ""
+msgstr "1.0 / scalaire"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer to the parameter."
-msgstr ""
+msgstr "Renvoie l'entier le plus proche de celui du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest even integer to the parameter."
-msgstr ""
+msgstr "Renvoie l'entier pair le plus proche de celui du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
-msgstr ""
+msgstr "Limite la valeur entre 0.0 et 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Extracts the sign of the parameter."
-msgstr ""
+msgstr "Extrait le signe du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the sine of the parameter."
-msgstr ""
+msgstr "Renvoie le sinus du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic sine of the parameter."
-msgstr ""
+msgstr "Renvoie le sinus hyperbolique du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the square root of the parameter."
-msgstr ""
+msgstr "Renvoie la racine carrée du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8481,49 +8521,48 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the tangent of the parameter."
-msgstr ""
+msgstr "Renvoie la tangente du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic tangent of the parameter."
-msgstr ""
+msgstr "Renvoie la tangente hyperbolique du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the truncated value of the parameter."
-msgstr ""
+msgstr "Recherche la valeur tronquée du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds scalar to scalar."
-msgstr ""
+msgstr "Additionne un scalaire par un scalaire."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides scalar by scalar."
-msgstr ""
+msgstr "Divise un scalaire par un scalaire."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies scalar by scalar."
-msgstr ""
+msgstr "Multiplie un scalaire par un scalaire."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two scalars."
-msgstr ""
+msgstr "Renvoie le reste de deux scalaires."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts scalar from scalar."
-msgstr ""
+msgstr "Soustrait un scalaire d'un scalaire."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar constant."
-msgstr ""
+msgstr "Constante scalaire."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar uniform."
-msgstr "Supprimer la transformation"
+msgstr "Scalaire uniforme."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the cubic texture lookup."
@@ -8546,9 +8585,8 @@ msgid "2D texture uniform lookup with triplanar."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform function."
-msgstr "Dialogue de transformation…"
+msgstr "Fonction Transform."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8563,70 +8601,67 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes transform from four vectors."
-msgstr ""
+msgstr "Créer un Transform à partir de quatre vecteurs."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes transform to four vectors."
-msgstr ""
+msgstr "Décompose un Transform en quatre vecteurs."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the determinant of a transform."
-msgstr ""
+msgstr "Calcule le déterminant d'un Transform."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the inverse of a transform."
-msgstr ""
+msgstr "Calcule l'inverse d'un Transform."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the transpose of a transform."
-msgstr ""
+msgstr "Calcule la transposition d'une transformation."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies transform by transform."
-msgstr ""
+msgstr "Multiplie un Transform par un Transform."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by transform."
-msgstr ""
+msgstr "Multiplie un vecteur par un Transform."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform constant."
-msgstr "Transformation annulée."
+msgstr "Constante Transform."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform uniform."
-msgstr "Transformation annulée."
+msgstr "Transform uniforme."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector function."
-msgstr "Affectation à la fonction."
+msgstr "Fonction vecteur."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector operator."
-msgstr ""
+msgstr "Opérateur vecteur."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes vector from three scalars."
-msgstr ""
+msgstr "Créer un vecteur à partir de trois scalaires."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes vector to three scalars."
-msgstr ""
+msgstr "Décompose un vecteur en trois scalaires."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the cross product of two vectors."
-msgstr ""
+msgstr "Calcule le produit vectoriel de deux vecteurs."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the distance between two points."
-msgstr ""
+msgstr "Renvoie la distance entre deux points."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the dot product of two vectors."
-msgstr ""
+msgstr "Calcule le produit scalaire de deux vecteurs."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8635,42 +8670,54 @@ msgid ""
"incident vector, and Nref, the reference vector. If the dot product of I and "
"Nref is smaller than zero the return value is N. Otherwise -N is returned."
msgstr ""
+"Retourne le vecteur qui pointe dans la même direction qu'un vecteur de "
+"référence. La fonction a trois paramètres vectoriels : N, le vecteur à "
+"orienter, I, le vecteur incident, et Nref, le vecteur de référence. Si le "
+"produit scalaire de I et Nref est inférieur à zéro, la valeur de retour est "
+"N. Sinon, -N est renvoyé."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the length of a vector."
-msgstr ""
+msgstr "Calcule la magnitude d'un vecteur."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two vectors."
-msgstr ""
+msgstr "Interpolation linéaire de deux vecteurs."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Interpolation linéaire de deux vecteurs."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
-msgstr ""
+msgstr "Calcule le produit normalisé du vecteur."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - vector"
-msgstr ""
+msgstr "1.0 - vecteur"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / vector"
-msgstr ""
+msgstr "1.0 / vecteur"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the vector that points in the direction of reflection ( a : incident "
"vector, b : normal vector )."
msgstr ""
+"Renvoie le vecteur qui pointe dans la direction de la réflexion ( a : "
+"vecteur incident, b : vecteur normal )."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the vector that points in the direction of refraction."
-msgstr ""
+msgstr "Renvoie le vecteur qui pointe dans la direction de la réfraction."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8679,7 +8726,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8688,44 +8735,43 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds vector to vector."
-msgstr ""
+msgstr "Additionne un vecteur avec un vecteur."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides vector by vector."
-msgstr ""
+msgstr "Divise un vecteur par un vecteur."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by vector."
-msgstr ""
+msgstr "Multiplie un vecteur par un vecteur."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two vectors."
-msgstr ""
+msgstr "Renvoie le reste de deux vecteurs."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts vector from vector."
-msgstr ""
+msgstr "Soustrait un vecteur d'un vecteur."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector constant."
-msgstr ""
+msgstr "Constante de vecteur."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector uniform."
-msgstr "Affectation à l'uniforme."
+msgstr "Vecteur uniforme."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8733,6 +8779,10 @@ msgid ""
"output ports. This is a direct injection of code into the vertex/fragment/"
"light function, do not use it to write the function declarations inside."
msgstr ""
+"Expression en langage Godot Shader personnalisé, avec un nombre personnalisé "
+"de ports d'entrée et de sortie. C'est une injection directe de code dans la "
+"fonction vertex/fragment/lumière, ne l'utilisez pas pour écrire les "
+"déclarations de fonction à l'intérieur."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8741,48 +8791,67 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(Fragment/Light mode only) Scalar derivative function."
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(Fragment/Light mode only) Scalar derivative function."
+msgstr "(Mode Fragment/Light uniquement) Fonction dérivée Scalaire."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Vector derivative function."
-msgstr ""
+msgstr "(Mode Fragment/Lumière uniquement) Fonction dérivée vectorielle."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
"differencing."
msgstr ""
+"(Mode Fragment/Light uniquement) (Vecteur) Dérivée en 'x' utilisant la "
+"différenciation locale."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
"differencing."
msgstr ""
+"(Mode Fragment/Light uniquement) (Scalaire) Dérivée en 'x' utilisant la "
+"différenciation locale."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
"differencing."
msgstr ""
+"(Mode Fragment/Light uniquement) (Vecteur) Dérivée en 'y' utilisant la "
+"différenciation locale."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
"differencing."
msgstr ""
+"(Mode Fragment/Light uniquement) (Scalaire) Dérivée en 'y' utilisant la "
+"différenciation locale."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
+"(Mode Fragment/Light uniquement) (Vecteur) Somme des dérivées absolues en "
+"'x' et 'y'."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
+"(Mode Fragment/Light uniquement) (Scalaire) Somme des dérivées absolues en "
+"'x' et 'y'."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "VisualShader"
@@ -8957,6 +9026,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Modèles d'exportation manquants pour cette plateforme :"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Gérer les modèles d'exportation"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "Exporter avec debug"
@@ -9118,6 +9191,15 @@ msgid "Unnamed Project"
msgstr "Projet sans titre"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Importer un projet existant"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "Impossible d'ouvrir le projet à \"%s\"."
@@ -9126,7 +9208,6 @@ msgid "Are you sure to open more than one project?"
msgstr "Voulez-vous vraiment ouvrir plus d'un projet à la fois ?"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"The following project settings file does not specify the version of Godot "
"through which it was created.\n"
@@ -9149,7 +9230,6 @@ msgstr ""
"versions du moteur."
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"The following project settings file was generated by an older engine "
"version, and needs to be converted for this version:\n"
@@ -9179,7 +9259,6 @@ msgstr ""
"du moteur, dont les paramètres ne sont pas compatibles avec cette version."
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in the Project Settings under "
@@ -9198,33 +9277,33 @@ msgstr ""
"Veuillez cliquer sur « Édition » pour déclencher l'importation initiale."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Are you sure to run %d projects at once?"
-msgstr "Voulez-vous vraiment lancer plus d'un projet à la fois ?"
+msgstr "Voulez-vous vraiment lancer %d projets à la fois ?"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Remove %d projects from the list?\n"
"The project folders' contents won't be modified."
msgstr ""
-"Supprimer le projet de la liste ? (Le contenu du dossier ne sera pas modifié)"
+"Supprimer %d projets de la liste ?\n"
+"Le contenu des dossiers de projet ne sera pas modifié."
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Remove this project from the list?\n"
"The project folder's contents won't be modified."
msgstr ""
-"Supprimer le projet de la liste ? (Le contenu du dossier ne sera pas modifié)"
+"Supprimer le projet de la liste ? \n"
+"Le contenu du dossier de projet ne sera pas modifié."
#: editor/project_manager.cpp
#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
-"Supprimer le projet de la liste ? (Le contenu du dossier ne sera pas modifié)"
+"Supprimer %d projets de la liste ?\n"
+"Le contenu des dossiers de projet ne sera pas modifié."
#: editor/project_manager.cpp
msgid ""
@@ -9236,21 +9315,22 @@ msgstr ""
"ou du gestionnaire de projets."
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Are you sure to scan %s folders for existing Godot projects?\n"
"This could take a while."
msgstr ""
-"Vous êtes sur le point de scanner les %s de dossiers pour les projets Godot "
-"existants. Est-ce que vous confirmez ?"
+"Êtes vous certain de vouloir scanner %s dossiers à la recherche de projets "
+"Godot existants ?\n"
+"Cela pourrait prendre prendre un moment."
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Gestionnaire de projets"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Liste des projets"
+#, fuzzy
+msgid "Projects"
+msgstr "Projet"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9273,10 +9353,6 @@ msgid "Templates"
msgstr "Modèles"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Quitter"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Redémarrer maintenant"
@@ -9285,13 +9361,12 @@ msgid "Can't run project"
msgstr "Impossible de lancer le projet"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"You currently don't have any projects.\n"
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
-"Vous n'avez pour l'instant aucun projet.\n"
-"Voulez-vous explorer les exemples de projets officiels dans l'Asset Library ?"
+"Vous n'avez pour l'instant aucun projets.\n"
+"Voulez-vous explorer des exemples de projets officiels dans l'Asset Library ?"
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -9318,9 +9393,8 @@ msgstr ""
"« \\ » ou « \" »"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "L'action « %s » existe déjà !"
+msgstr "Une action avec le nom « %s » existe déjà."
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
@@ -9539,9 +9613,8 @@ msgid "Override For..."
msgstr "Écraser pour…"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
-#, fuzzy
msgid "The editor must be restarted for changes to take effect."
-msgstr "L'éditeur doit être redémarré pour que les changements prennent effet"
+msgstr "L'éditeur doit être redémarré pour que les changements prennent effet."
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -9619,6 +9692,10 @@ msgstr "Langues :"
msgid "AutoLoad"
msgstr "AutoLoad"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Extensions"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Zéro"
@@ -9671,15 +9748,6 @@ msgstr "Sélectionner une méthode virtuelle"
msgid "Select Method"
msgstr "Sélectionner une méthode"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "Impossible d'exécuter l'outil PVRTC :"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-"L'image convertie n'a pas pu être rechargée en utilisant l'outil PVRTC :"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "Renommer par lot"
@@ -9693,7 +9761,6 @@ msgid "Suffix"
msgstr "Suffixe"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced Options"
msgstr "Options avancées"
@@ -9956,9 +10023,8 @@ msgid "User Interface"
msgstr "Interface utilisateur"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Other Node"
-msgstr "Supprimer un nœud"
+msgstr "Autre nœud"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -9977,6 +10043,11 @@ msgid "Remove Node(s)"
msgstr "Supprimer le(s) nœud(s)"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Changer le nom du port de sortie"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10001,7 +10072,6 @@ msgid "Clear Inheritance"
msgstr "Effacer l'héritage"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open Documentation"
msgstr "Ouvrir la documentation"
@@ -10010,9 +10080,8 @@ msgid "Add Child Node"
msgstr "Ajouter un nœud enfant"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Expand/Collapse All"
-msgstr "Réduire tout"
+msgstr "Développer/Réduire tout"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
@@ -10023,7 +10092,6 @@ msgid "Extend Script"
msgstr "Hériter d'un script"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
msgstr "Re-parenter le nœud"
@@ -10048,9 +10116,8 @@ msgid "Delete (No Confirm)"
msgstr "Effacer (pas de confirmation)"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Add/Create a New Node."
-msgstr "Ajouter/Créer un nouveau nœud"
+msgstr "Ajouter/Créer un nouveau nœud."
#: editor/scene_tree_dock.cpp
msgid ""
@@ -10086,52 +10153,51 @@ msgid "Toggle Visible"
msgstr "Rendre visible"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Unlock Node"
-msgstr "Sélectionner un nœud"
+msgstr "Déverrouiller le nœud"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Button Group"
-msgstr "Ajouter au groupe"
+msgstr "Bouton de groupe"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "(Connecting From)"
-msgstr "Erreur de connexion"
+msgstr "(Connexion à partir de)"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
msgstr "Avertissement de configuration de nœud :"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"Le nœud possède des connexions et/ou des groupes.\n"
"Cliquez pour afficher le panneau de connexion des signaux."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"Le nœud possède des connections.\n"
"Cliquez pour afficher le panneau de connexion des signaux."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"Le nœud fait partie de groupes.\n"
"Cliquez pour afficher le panneau de gestion des groupes."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Open Script:"
-msgstr "Ouvrir un script"
+msgstr "Ouvrir le script :"
#: editor/scene_tree_editor.cpp
msgid ""
@@ -10182,39 +10248,32 @@ msgid "Select a Node"
msgstr "Sélectionner un nœud"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is empty."
-msgstr "Le chemin est vide"
+msgstr "Le chemin est vide."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty."
-msgstr "Le nom de fichier est vide"
+msgstr "Le nom de fichier est vide."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is not local."
-msgstr "Le chemin n'est pas local"
+msgstr "Le chemin n'est pas local."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid base path."
-msgstr "Chemin de base invalide"
+msgstr "Chemin de base invalide."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "A directory with the same name exists."
-msgstr "Un dossier du même nom existe déjà"
+msgstr "Un dossier du même nom existe déjà."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid extension."
-msgstr "Extension invalide"
+msgstr "Extension invalide."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Wrong extension chosen."
-msgstr "Choix d'extension erroné"
+msgstr "Choix d'extension erroné."
#: editor/script_create_dialog.cpp
msgid "Error loading template '%s'"
@@ -10229,11 +10288,15 @@ msgid "Error loading script from %s"
msgstr "Erreur de chargement de script depuis %s"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Écraser"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "N/A"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script / Choose Location"
msgstr "Ouvrir le script / Choisir l'emplacement"
@@ -10242,44 +10305,36 @@ msgid "Open Script"
msgstr "Ouvrir un script"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "File exists, it will be reused."
-msgstr "Le fichier existe, il sera réutilisé"
+msgstr "Le fichier existe, il sera réutilisé."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid class name."
-msgstr "Nom de classe invalide"
+msgstr "Nom de classe invalide."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid inherited parent name or path."
-msgstr "Nom ou chemin parent hérité invalide"
+msgstr "Nom ou chemin parent hérité invalide."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script is valid."
-msgstr "Script valide"
+msgstr "Script valide."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr "Autorisé : a-z, A-Z, 0-9 et _"
+msgstr "Autorisé : a-z, A-Z, 0-9, _ et ."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in script (into scene file)."
-msgstr "Script intégré (dans le fichier scène)"
+msgstr "Script intégré (dans le fichier scène)."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will create a new script file."
-msgstr "Créer nouveau fichier de script"
+msgstr "Va créer un nouveau fichier de script."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will load an existing script file."
-msgstr "Charger fichier de script existant"
+msgstr "Va charger un fichier de script existant."
#: editor/script_create_dialog.cpp
msgid "Language"
@@ -10412,7 +10467,7 @@ msgstr "Définir depuis l'arbre"
#: editor/script_editor_debugger.cpp
msgid "Export measures as CSV"
-msgstr ""
+msgstr "Exporter les mesures en CSV"
#: editor/settings_config_dialog.cpp
msgid "Erase Shortcut"
@@ -10427,6 +10482,10 @@ msgid "Change Shortcut"
msgstr "Modifier le raccourci"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Paramètres de l'éditeur"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Raccourcis"
@@ -10544,12 +10603,11 @@ msgstr "GDNativeLibrary"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Enabled GDNative Singleton"
-msgstr ""
+msgstr "Activé le Singleton GDNative"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
-#, fuzzy
msgid "Disabled GDNative Singleton"
-msgstr "Désactiver l'indicateur d'activité"
+msgstr "Désactiver le Singleton GDNative"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Library"
@@ -10640,9 +10698,8 @@ msgid "GridMap Fill Selection"
msgstr "Remplissage de la sélection de GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Paste Selection"
-msgstr "Suppression de la sélection de GridMap"
+msgstr "GridMap Coller la sélection"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Paint"
@@ -10851,10 +10908,31 @@ msgid "Set Variable Type"
msgstr "Définir type de variable"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr ""
+"Ne doit pas entrer en conflit avec un nom de type existant intégré au moteur."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Créer un nouveau rectangle."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Variables :"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Créer un nouveau rectangle."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Créer un nouveau polygone."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Le nom n'est pas un identifiant valide :"
@@ -11023,9 +11101,8 @@ msgid "Available Nodes:"
msgstr "Nœuds disponibles :"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Select or create a function to edit its graph."
-msgstr "Sélectionnez ou créez une fonction pour modifier le graphe"
+msgstr "Sélectionnez ou créez une fonction pour modifier son graphe."
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
@@ -11044,10 +11121,6 @@ msgid "Cut Nodes"
msgstr "Couper les nœuds"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Coller les nœuds"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "Modifier le membre"
@@ -11168,10 +11241,14 @@ msgstr ""
#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
+"La création d'une version personnalisée nécessite un chemin d'accès Android "
+"SDK valide dans les paramètres de l'éditeur."
#: platform/android/export/export.cpp
msgid "Invalid Android SDK path for custom build in Editor Settings."
msgstr ""
+"Chemin d'accès invalide au SDK Android pour le build custom dans les "
+"paramètres de l'éditeur."
#: platform/android/export/export.cpp
msgid ""
@@ -11193,6 +11270,9 @@ msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
+"A essayé de construire à partir d'un modèle personnalisé, mais aucune "
+"information de version n'existe pour lui. Veuillez réinstaller à partir du "
+"menu 'Projet'."
#: platform/android/export/export.cpp
msgid ""
@@ -11204,17 +11284,21 @@ msgstr ""
#: platform/android/export/export.cpp
msgid "Building Android Project (gradle)"
-msgstr ""
+msgstr "Construire le Project Android (gradle)"
#: platform/android/export/export.cpp
msgid ""
"Building of Android project failed, check output for the error.\n"
"Alternatively visit docs.godotengine.org for Android build documentation."
msgstr ""
+"La construction du projet Android a échoué, vérifiez la sortie pour "
+"l'erreur.\n"
+"Sinon, visitez docs.godotengine.org pour la documentation de construction "
+"Android."
#: platform/android/export/export.cpp
msgid "No build apk generated at: "
-msgstr ""
+msgstr "Aucune build apk générée à : "
#: platform/iphone/export/export.cpp
msgid "Identifier is missing."
@@ -11347,13 +11431,12 @@ msgstr ""
"Les dimensions du splash screen sont invalides (doivent être de 620x300)."
#: scene/2d/animated_sprite.cpp
-#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite to display frames."
msgstr ""
"Une ressource SpriteFrames doit être créée ou assignée à la propriété « "
-"Frames » afin qu'AnimatedSprite affiche les images."
+"Frames » afin qu'AnimatedSprite affiche les frames."
#: scene/2d/canvas_modulate.cpp
msgid ""
@@ -11415,13 +11498,12 @@ msgstr ""
"« Particles Animation » activé."
#: scene/2d/light_2d.cpp
-#, fuzzy
msgid ""
"A texture with the shape of the light must be supplied to the \"Texture\" "
"property."
msgstr ""
"Une texture avec la forme de la lumière doit être fournie dans la propriété "
-"« texture »."
+"« Texture »."
#: scene/2d/light_occluder_2d.cpp
msgid ""
@@ -11431,11 +11513,10 @@ msgstr ""
"occulteur ait un effet."
#: scene/2d/light_occluder_2d.cpp
-#, fuzzy
msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
msgstr ""
"Le polygone d'occultation pour cet occulteur est vide. Veuillez dessiner un "
-"polygone !"
+"polygone."
#: scene/2d/navigation_polygon.cpp
msgid ""
@@ -11539,51 +11620,44 @@ msgstr ""
"etc."
#: scene/2d/visibility_notifier_2d.cpp
-#, fuzzy
msgid ""
"VisibilityEnabler2D works best when used with the edited scene root directly "
"as parent."
msgstr ""
-"Un VisibilityEnable2D fonctionne mieux lorsqu'il est directement enfant du "
-"nœud racine de la scène."
+"Un VisibilityEnabler2D fonctionne mieux lorsqu'il est directement enfant du "
+"nœud racine de la scène éditée."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRCamera must have an ARVROrigin node as its parent."
-msgstr "ARVRCamera doit avoir un nœud ARVROrigin comme parent"
+msgstr "ARVRCamera doit avoir un nœud ARVROrigin comme parent."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRController must have an ARVROrigin node as its parent."
-msgstr "ARVRController doit avoir un nœud ARVROrigin comme parent"
+msgstr "ARVRController doit avoir un nœud ARVROrigin comme parent."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid ""
"The controller ID must not be 0 or this controller won't be bound to an "
"actual controller."
msgstr ""
-"L'identifiant contrôleur ne doit pas être 0 ou ce contrôleur ne sera pas lié "
-"à un contrôleur valide"
+"L'identifiant contrôleur ne doit pas être 0 ou ce contrôleur ne sera lié à "
+"aucun contrôleur."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr "ARVRAnchor doit avoir un nœud ARVROrigin comme parent"
+msgstr "ARVRAnchor doit avoir un nœud ARVROrigin comme parent."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid ""
"The anchor ID must not be 0 or this anchor won't be bound to an actual "
"anchor."
msgstr ""
"L'identifiant d'ancrage ne doit pas être 0 ou cette ancre ne sera pas liée à "
-"une ancre valide"
+"une ancre valide."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVROrigin requires an ARVRCamera child node."
-msgstr "ARVROrigin requiert un nœud enfant ARVRCamera"
+msgstr "ARVROrigin requiert un nœud enfant ARVRCamera."
#: scene/3d/baked_lightmap.cpp
msgid "%d%%"
@@ -11643,13 +11717,12 @@ msgstr ""
"CollisionObject, comme Area, StaticBody, RigidBody, KinematicBody, etc."
#: scene/3d/collision_shape.cpp
-#, fuzzy
msgid ""
"A shape must be provided for CollisionShape to function. Please create a "
"shape resource for it."
msgstr ""
-"Une CollisionShape nécessite une forme pour fonctionner. Créez une ressource "
-"de forme pour cette CollisionShape !"
+"Une CollisionShape nécessite une forme pour fonctionner. Veuillez créer une "
+"ressource de forme pour cette CollisionShape."
#: scene/3d/collision_shape.cpp
msgid ""
@@ -11664,7 +11737,6 @@ msgid "Nothing is visible because no mesh has been assigned."
msgstr "Rien n'est visible car aucun maillage n'a été assigné."
#: scene/3d/cpu_particles.cpp
-#, fuzzy
msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial whose "
"Billboard Mode is set to \"Particle Billboard\"."
@@ -11687,6 +11759,8 @@ msgstr ""
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
+"Une SpotLight avec un angle supérieur à 90 degrés ne peut pas projeter "
+"d'ombres."
#: scene/3d/navigation_mesh.cpp
msgid "A NavigationMesh resource must be set or created for this node to work."
@@ -11721,12 +11795,11 @@ msgstr ""
"passes."
#: scene/3d/particles.cpp
-#, fuzzy
msgid ""
"Particles animation requires the usage of a SpatialMaterial whose Billboard "
"Mode is set to \"Particle Billboard\"."
msgstr ""
-"L'animation de Particles a besoin d'un SpatialMaterial avec « Billboard "
+"L'animation de particules a besoin d'un SpatialMaterial avec « Billboard "
"Particles » activé."
#: scene/3d/path.cpp
@@ -11736,7 +11809,6 @@ msgstr ""
"nœud de type Path."
#: scene/3d/path.cpp
-#, fuzzy
msgid ""
"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
"parent Path's Curve resource."
@@ -11755,17 +11827,16 @@ msgstr ""
"Modifiez la taille dans les formes de collision enfants à la place."
#: scene/3d/remote_transform.cpp
-#, fuzzy
msgid ""
"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
"derived node to work."
msgstr ""
-"La propriété Path doit pointer vers un nœud Spatial valide pour fonctionner."
+"La propriété \"Remote Path\" doit pointer vers un nœud valide Spatial ou "
+"dérivé de Spatial pour fonctionner."
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid "This body will be ignored until you set a mesh."
-msgstr "Ce corps sera ignoré jusqu'à ce que vous définissiez un maillage"
+msgstr "Ce corps sera ignoré jusqu'à ce que vous définissiez un maillage."
#: scene/3d/soft_body.cpp
msgid ""
@@ -11778,12 +11849,11 @@ msgstr ""
"Modifiez les tailles dans les formes de collision enfants à la place."
#: scene/3d/sprite_3d.cpp
-#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite3D to display frames."
msgstr ""
-"Une ressource de type SampleFrames doit être créée ou définie dans la "
+"Une ressource de type SpriteFrames doit être créée ou définie dans la "
"propriété « Frames » afin qu'une AnimatedSprite3D fonctionne."
#: scene/3d/vehicle_body.cpp
@@ -11799,6 +11869,8 @@ msgid ""
"WorldEnvironment requires its \"Environment\" property to contain an "
"Environment to have a visible effect."
msgstr ""
+"WorldEnvironment exige que sa propriété \"Environment\" contienne un "
+"Environment pour avoir un effet visible."
#: scene/3d/world_environment.cpp
msgid ""
@@ -11837,9 +11909,8 @@ msgid "Nothing connected to input '%s' of node '%s'."
msgstr "Rien n'est connecté à l'entrée « %s » du nœud « %s »."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "No root AnimationNode for the graph is set."
-msgstr "Un AnimationNode racine pour le graphique n'est pas défini."
+msgstr "Aucun AnimationNode racine pour le graphique n'est défini."
#: scene/animation/animation_tree.cpp
msgid "Path to an AnimationPlayer node containing animations is not set."
@@ -11853,7 +11924,6 @@ msgstr ""
"Le chemin défini pour AnimationPlayer ne mène pas à un nœud AnimationPlayer."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "The AnimationPlayer root node is not a valid node."
msgstr "La racine AnimationPlayer n'est pas un nœud valide."
@@ -11867,12 +11937,11 @@ msgstr "Échantillonner une couleur depuis l'écran."
#: scene/gui/color_picker.cpp
msgid "HSV"
-msgstr ""
+msgstr "HSV"
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Raw"
-msgstr "Lacet (hauteur)"
+msgstr "Brut"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
@@ -11883,7 +11952,6 @@ msgid "Add current color as a preset."
msgstr "Ajouter la couleur courante comme pré-réglage."
#: scene/gui/container.cpp
-#, fuzzy
msgid ""
"Container by itself serves no purpose unless a script configures its "
"children placement behavior.\n"
@@ -11892,13 +11960,16 @@ msgstr ""
"Le conteneur en lui-même ne sert à rien à moins qu'un script ne configure "
"son comportement de placement de ses enfants.\n"
"Si vous n'avez pas l'intention d'ajouter un script, utilisez plutôt un nœud "
-"'Control'."
+"Control."
#: scene/gui/control.cpp
msgid ""
"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
msgstr ""
+"L'outil d'aide ne s'affiche pas car le filtre de contrôle de la souris est "
+"réglé sur \"Ignorer\". Pour résoudre ce problème, réglez le filtre de la "
+"souris sur \"Stop\" ou \"Pass\"."
#: scene/gui/dialogs.cpp
msgid "Alert!"
@@ -11909,31 +11980,28 @@ msgid "Please Confirm..."
msgstr "Veuillez confirmer…"
#: scene/gui/popup.cpp
-#, fuzzy
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
"functions. Making them visible for editing is fine, but they will hide upon "
"running."
msgstr ""
-"Les pop-ups seront cachés par défaut jusqu'à ce que vous appelez une "
+"Les pop-ups seront cachées par défaut jusqu'à ce que vous appeliez une "
"fonction popup() ou une des fonctions popup*(). Les rendre visibles pour "
"l'édition ne pose pas de problème, mais elles seront cachées lors de "
"l'exécution."
#: scene/gui/range.cpp
-#, fuzzy
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
-msgstr "Si exp_edit est vrai min_value doit être > 0."
+msgstr "Si « Exp Edit » est vrai, « Min Value » doit être supérieur à 0."
#: scene/gui/scroll_container.cpp
-#, fuzzy
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
"minimum size manually."
msgstr ""
"ScrollContainer est conçu pour fonctionner avec un unique nœud enfant de "
-"type contrôle.\n"
+"type Control.\n"
"Utilisez un conteneur comme enfant (VBox, HBox, etc.) ou un Control et "
"définissez manuellement la taille minimale personnalisée."
@@ -11961,39 +12029,21 @@ msgstr ""
"nœud de type Control afin qu'il en obtienne une taille. Sinon, faites-en une "
"RenderTarget et assignez sa texture à un nœud pouvant l'afficher."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Erreur à l'initialisation de Freetype."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Format de police inconnu."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Erreur lors du chargement de la police."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Taille de police invalide."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Entrée"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for preview."
-msgstr "Source invalide pour la forme."
+msgstr "Source invalide pour la prévisualisation."
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
msgstr "Source invalide pour la forme."
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid comparison function for that type."
-msgstr "Source invalide pour la forme."
+msgstr "Fonction de comparaison invalide pour ce type."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
@@ -12009,7 +12059,107 @@ msgstr "Les variations ne peuvent être affectées que dans la fonction vertex."
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
-msgstr ""
+msgstr "Les constantes ne peuvent être modifiées."
+
+#~ msgid "No Matches"
+#~ msgstr "Pas de correspondances"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Impossible d'ouvrir file_type_cache.cch en écriture, le fichier de cache "
+#~ "ne sera pas sauvé !"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "Impossible d'accéder à « %s » car celui-ci n'existe pas dans le système "
+#~ "de fichiers !"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Erreur de chargement d'image :"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Pas de pixels avec transparence > 128 dans l'image..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Le parent n'a pas de faces solides à peupler."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Impossible de cartographier la zone."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Des faces ne contiennent pas de zone !"
+
+#~ msgid "No faces!"
+#~ msgstr "Pas de faces !"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Erreur de chargement de fichier."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Activer Doppler"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Sélectionner le mode (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Move déplacement (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Mode rotation (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Mode de mise à l'échelle (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Coordonnées locales"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Mode d'aimantation (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Outil sélection"
+
+#~ msgid "Tool Move"
+#~ msgstr "Outil déplacement"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Outil rotation"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Outil échelle"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "Supprimer tous les projets manquants de la liste ? (Le contenu des "
+#~ "dossiers ne sera pas modifié)"
+
+#~ msgid "Project List"
+#~ msgstr "Liste des projets"
+
+#~ msgid "Exit"
+#~ msgstr "Quitter"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "Impossible d'exécuter l'outil PVRTC :"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr ""
+#~ "L'image convertie n'a pas pu être rechargée en utilisant l'outil PVRTC :"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Erreur à l'initialisation de Freetype."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Format de police inconnu."
+
+#~ msgid "Error loading font."
+#~ msgstr "Erreur lors du chargement de la police."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Taille de police invalide."
#~ msgid "Previous Folder"
#~ msgstr "Dossier précédent"
diff --git a/editor/translations/ga.po b/editor/translations/ga.po
new file mode 100644
index 0000000000..9f7166b719
--- /dev/null
+++ b/editor/translations/ga.po
@@ -0,0 +1,11327 @@
+# Irish translation of the Godot Engine editor
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
+# This file is distributed under the same license as the Godot source code.
+# Rónán Quill <ronan085@gmail.com>, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2019-08-04 14:22+0000\n"
+"Last-Translator: Rónán Quill <ronan085@gmail.com>\n"
+"Language-Team: Irish <https://hosted.weblate.org/projects/godot-engine/godot/"
+"ga/>\n"
+"Language: ga\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :"
+"(n>6 && n<11) ? 3 : 4;\n"
+"X-Generator: Weblate 3.8-dev\n"
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/mono/glue/gd_glue.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid input %i (not passed) in expression"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "self can't be used because instance is null (not passed)"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid operands to operator %s, %s and %s."
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid index of type %s for base type %s"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid named index '%s' for base type %s"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid arguments to construct '%s'"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "On call to '%s':"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Free"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Balanced"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Mirror"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
+msgid "Time:"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Value:"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Insert Key Here"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Duplicate Selected Key(s)"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Delete Selected Key(s)"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Add Bezier Point"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Move Bezier Points"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Time"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Value"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Keyframe Time"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Transition"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Transform"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Keyframe Value"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Call"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Length"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Property Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "3D Transform Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Call Method Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Bezier Curve Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation length (frames)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation length (seconds)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Looping"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Clips:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Clips:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Track Path"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Toggle this track on/off."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Update Mode (How this property is set)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Interpolation Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove this track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Time (s): "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Toggle Track Enabled"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Capture"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Nearest"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
+#: editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Cubic"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clamp Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Wrap Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Key(s)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Key(s)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Update Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Interpolation Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Loop Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/create_dialog.cpp
+#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Cruthaigh"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "AnimationPlayer can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Rearrange Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Transform tracks only apply to Spatial-based nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"Audio tracks can only point to nodes of type:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation tracks can only point to AnimationPlayer nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "An animation player can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Not possible to add a new track without a root"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Bezier Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track is not of type Spatial, can't insert key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Transform Track Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Track Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a method key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Method Track Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Method not found in object: "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clipboard is empty"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Paste Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"This option does not work for Bezier editing, as it's only a single track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"This animation belongs to an imported scene, so changes to imported tracks "
+"will not be saved.\n"
+"\n"
+"To enable the ability to add custom tracks, navigate to the scene's import "
+"settings and set\n"
+"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks"
+"\", then re-import.\n"
+"Alternatively, use an import preset that imports animations to separate "
+"files."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Warning: Editing imported animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Select All"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Select None"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Only show tracks from nodes selected in tree."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Group tracks by node or display them as plain list."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Snap:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation step value."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Seconds"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "FPS"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/project_manager.cpp editor/project_settings_editor.cpp
+#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Edit"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation properties."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Copy Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Next Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Previous Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Pick the node that will be animated:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Use Bezier Curves"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Select tracks to copy:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_log.cpp
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Copy"
+msgstr ""
+
+#: editor/animation_track_editor_plugins.cpp
+msgid "Add Audio Track Clip"
+msgstr ""
+
+#: editor/animation_track_editor_plugins.cpp
+msgid "Change Audio Track Clip Start Offset"
+msgstr ""
+
+#: editor/animation_track_editor_plugins.cpp
+msgid "Change Audio Track Clip End Offset"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replaced %d occurrence(s)."
+msgstr ""
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
+msgstr ""
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Match Case"
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: editor/code_editor.cpp editor/rename_dialog.cpp
+msgid "Replace"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
+#: editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Warnings"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line and column numbers."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Method in target node must be specified."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid ""
+"Target method not found. Specify a valid method or attach a script to the "
+"target node."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect to Node:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect to Script:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "From Signal:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Scene does not contain any script."
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
+#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+msgid "Add"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/editor_feature_profile.cpp editor/groups_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp
+msgid "Remove"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Advanced"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid ""
+"Defers the signal, storing it in a queue and only firing it at idle time."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnects the signal after its first emission."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Cannot connect signal"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/export_template_manager.cpp editor/groups_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
+#: editor/project_settings_editor.cpp editor/property_editor.cpp
+#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Close"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Signal:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect '%s' from '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect all from signal: '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect a Signal to a Method"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit Connection:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from this signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect All"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Go To Method"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Change %s Type"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/project_settings_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Create New %s"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search:"
+msgstr "Cuardach:"
+
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Matches:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Description:"
+msgstr "Cuntas:"
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will only take effect when reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will only take effect when reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Acmhainn"
+
+#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
+msgid "Path"
+msgstr "Cosán"
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Open"
+msgstr "Oscailte"
+
+#: editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (Can't be restored)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Cannot remove:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Load failed due to missing dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Show Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
+#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Key"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Value"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Godot Engine contributors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Founders"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Lead Developer"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Manager "
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Developers"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Authors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Platinum Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Mini Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Silver Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "License"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Third-party Licenses"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid ""
+"Godot Engine relies on a number of third-party free and open source "
+"libraries, all compatible with the terms of its MIT license. The following "
+"is an exhaustive list of all such third-party components with their "
+"respective copyright statements and license terms."
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "All Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Licenses"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Error opening package file, not in ZIP format."
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Uncompressing Assets"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Package installed successfully!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Success!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/editor_node.cpp
+msgid "Install"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Package Installer"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Speakers"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Rename Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Change Audio Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Bypass Effects"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Select Audio Bus Send"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio Bus, Drag and Drop to rearrange."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bypass"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bus options"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Master bus can't be deleted!"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Duplicate Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save Audio Bus Layout As..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Location for New Layout..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Open Audio Bus Layout"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "There is no '%s' file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Layout"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Invalid file, not an audio bus layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add a new Audio Bus to this layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load an existing Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save As"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save this Bus Layout to a file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/import_dock.cpp
+msgid "Load Default"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load the default Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Create a new Bus Layout."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Must not collide with an existing engine class name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Must not collide with an existing built-in type name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Must not collide with an existing global constant name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Keyword cannot be used as an autoload name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
+msgid "Name"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Storing local changes..."
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating scene..."
+msgstr ""
+
+#: editor/editor_data.cpp editor/editor_properties.cpp
+msgid "[empty]"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "[unsaved]"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Please select a base directory first."
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp editor/project_manager.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Name:"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "No export template found at the expected path:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid ""
+"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
+"Etc' in Project Settings."
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid ""
+"Target platform requires 'ETC2' texture compression for GLES3. Enable "
+"'Import Etc 2' in Project Settings."
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid ""
+"Target platform requires 'ETC' texture compression for the driver fallback "
+"to GLES2.\n"
+"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
+"Enabled'."
+msgstr ""
+
+#: editor/editor_export.cpp platform/android/export/export.cpp
+#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
+#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
+msgid "Custom debug template not found."
+msgstr ""
+
+#: editor/editor_export.cpp platform/android/export/export.cpp
+#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
+#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
+msgid "Custom release template not found."
+msgstr ""
+
+#: editor/editor_export.cpp platform/javascript/export/export.cpp
+msgid "Template file not found:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "3D Editor"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Script Editor"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Asset Library"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Scene Tree Editing"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Node Dock"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "FileSystem and Import Docks"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Erase profile '%s'? (no undo)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Profile must be a valid filename and must not contain '.'"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Profile with this name already exists."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "(Editor Disabled, Properties Disabled)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "(Properties Disabled)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "(Editor Disabled)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Class Options:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Enable Contextual Editor"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Enabled Properties:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Enabled Features:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Enabled Classes:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "File '%s' format is invalid, import aborted."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid ""
+"Profile '%s' already exists. Remove it first before importing, import "
+"aborted."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Error saving profile to path: '%s'."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Unset"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Current Profile:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Make Current"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp editor/editor_node.cpp
+#: editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Available Profiles:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Class Options"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "New profile name:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Erase Profile"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Profile(s)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Export Profile"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Manage Editor Feature Profiles"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select This Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Open in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/project_manager.cpp
+msgid "Show in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "New Folder..."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Save"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go to previous folder."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go to next folder."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Go to parent folder."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Refresh files."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "(Un)favorite current folder."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Toggle the visibility of hidden files."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "View items as a grid of thumbnails."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "View items as a list."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
+#: editor/plugins/style_box_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Preview:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid ""
+"There are multiple importers for different types pointing to file %s, import "
+"aborted"
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "(Re)Importing Assets"
+msgstr ""
+
+#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class:"
+msgstr ""
+
+#: editor/editor_help.cpp editor/scene_tree_editor.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Signals:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "enum "
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Online Tutorials:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There are currently no tutorials for this class, you can [color=$color][url="
+"$url]contribute one[/url][/color] or [color=$color][url=$url2]request one[/"
+"url][/color]."
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this property. Please help us by "
+"[color=$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this method. Please help us by [color="
+"$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set Multiple:"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Output:"
+msgstr ""
+
+#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
+msgid "Copy Selection"
+msgstr ""
+
+#: editor/editor_log.cpp editor/editor_profiler.cpp
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/property_editor.cpp editor/scene_tree_dock.cpp
+#: editor/script_editor_debugger.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Clear"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Clear Output"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project export failed with error code %d."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Imported resources can't be saved."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource can't be saved because it does not belong to the edited scene. "
+"Make it unique first."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save Resource As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Can't open '%s'. The file could have been moved or deleted."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while parsing '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unexpected end of file '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Missing '%s' or its dependencies."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while loading '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a tree root."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
+"be satisfied."
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was imported, so it's not editable.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was instanced or inherited.\n"
+"Changes to it won't be kept when saving the current scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource was imported, so it's not editable. Change its settings in the "
+"import panel and then re-import."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene was imported, so changes to it won't be kept.\n"
+"Instancing it or inheriting will allow making changes to it.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This is a remote object, so changes to it won't be kept.\n"
+"Please read the documentation relevant to debugging to better understand "
+"this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: editor/editor_node.cpp editor/filesystem_dock.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Script..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Close"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to '%s' before closing?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Saved %s modified resource(s)."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "A root node is required to save the scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "No"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a root node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a selected node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Run Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to the following scene(s) before quitting?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes the following scene(s) before opening Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This option is deprecated. Situations where refresh must be forced are now "
+"considered a bug. Please report."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Scene '%s' was automatically imported, so it can't be modified.\n"
+"To make changes to it, a new inherited scene can be created."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Clear Recent Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: editor/editor_node.cpp editor/import_dock.cpp
+#: editor/script_create_dialog.cpp
+msgid "Default"
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play This Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Close Other Tabs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Tabs to the Right"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close All Tabs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files or folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Dock Position"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle distraction-free mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Add a new scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Copy Text"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Filter Files..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save All Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Convert To..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "MeshLibrary..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "TileSet..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Undo"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Redo"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
+msgid "Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project Settings..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Orphan Resource Explorer..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
+msgid "Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Take Screenshot"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Screenshots are stored in the Editor Data/Settings Folder."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle System Console"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data/Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Manage Editor Features..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
+msgid "Help"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+msgid "Search"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Online Docs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Q&A"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Issue Tracker"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_profiler.cpp
+msgid "Stop"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Changing the video driver requires restarting the editor."
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_settings_editor.cpp
+#: editor/settings_config_dialog.cpp
+msgid "Save & Restart"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Spins when the editor window redraws."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update Continuously"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update When Changed"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Hide Update Spinner"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Expand Bottom Panel"
+msgstr ""
+
+#: editor/editor_node.cpp scene/resources/visual_shader.cpp
+msgid "Output"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Don't Save"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Android build template is missing, please install relevant templates."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Manage Templates"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This will install the Android project for custom builds.\n"
+"Note that, in order to use it, it needs to be enabled per export preset."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Android build template is already installed and it won't be overwritten.\n"
+"Remove the \"build\" directory manually before attempting this operation "
+"again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Password:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 2D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 3D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Script Editor"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "Open Asset Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the next Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the previous Editor"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Creating Mesh Previews"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Thumbnail..."
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit Plugin"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Update"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Version:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Author:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit:"
+msgstr ""
+
+#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
+#: editor/rename_dialog.cpp
+msgid "Start"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Physics Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Time"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Calls"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Edit Text:"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/script_create_dialog.cpp
+msgid "On"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Layer"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Bit %d, value %d"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "[Empty]"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Pick a Viewport"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New %s"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Make Unique"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Paste"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Convert To %s"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Open Editor"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Selected node is not a Viewport!"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Size: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Page: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Key:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Value:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Add Key/Value Pair"
+msgstr ""
+
+#: editor/editor_run_native.cpp
+msgid ""
+"No runnable export preset found for this platform.\n"
+"Please add a runnable preset in the export menu."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Redownload"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Uninstall"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Installed)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Missing)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Current)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Retrieving mirrors, please wait..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove template version '%s'?"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Invalid version.txt format inside templates: %s."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "No version.txt found inside templates."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error creating path for templates:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Extracting Export Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Importing:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"No download links found for this version. Direct download is only available "
+"for official releases."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Request Failed."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Redirect Loop."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Complete."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error requesting URL:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connecting to Mirror..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Disconnected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Resolving"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Resolve"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connecting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Connect"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Requesting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Downloading"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connection Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "SSL Handshake Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Uncompressing Android Build Sources"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Current Version:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Installed Versions:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Install From File"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove Template"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select Template File"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Export Template Manager"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select mirror from list: (Shift+Click: Open in Browser)"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Status: Import of file failed. Please fix file and reimport manually."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move/rename resources root."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move a folder into itself."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error moving:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error duplicating:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Unable to update dependencies:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Provided name contains invalid characters."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "A file or folder with this name already exists."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Inherited Scene"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Open Scenes"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Add to Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Edit Dependencies..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View Owners..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicate..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "New Script..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Resource..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/project_manager.cpp editor/rename_dialog.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Rename"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Previous Folder/File"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Next Folder/File"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Toggle Split Mode"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Search files"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid ""
+"Scanning Files,\n"
+"Please Wait..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "There is already file or folder with the same name in this location."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Overwrite"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Cruthaigh"
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Find in Files"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Folder:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Filters:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid ""
+"Include the files with the following extensions. Add or remove them in "
+"ProjectSettings."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
+msgid "Replace..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
+msgid "Cancel"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace all (no undo)"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Searching..."
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Search complete"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Group name already exists."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Invalid group name."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Scrios ionchur"
+
+#: editor/groups_editor.cpp editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes Not in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Filter nodes"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Empty groups will be automatically removed."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Group Editor"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Manage Groups"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Single Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Importing Scene..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating Lightmaps"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating for Mesh: "
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Running Custom Script..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Saving..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Set as Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Clear Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid " Files"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Import As:"
+msgstr ""
+
+#: editor/import_dock.cpp editor/property_editor.cpp
+msgid "Preset..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Reimport"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Save scenes, re-import and restart"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Changing the type of an imported file requires editor restart."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid ""
+"WARNING: Assets exist that use this resource, they may stop loading properly."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Expand All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Collapse All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save As..."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Edit Resource Clipboard"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Object properties."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Filter properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Changes may be lost!"
+msgstr ""
+
+#: editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: editor/node_dock.cpp
+msgid "Select a single node to edit its signals and groups."
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Edit a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Create a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Plugin Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Subfolder:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Language:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Script Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Activate now?"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid ""
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Insert Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon (Remove Point)"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Remove Polygon And Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Load..."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Move Node Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Change BlendSpace1D Limits"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Change BlendSpace1D Labels"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "This type of node can't be used. Only root nodes are allowed."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Add Node Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Add Animation Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Remove BlendSpace1D Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Move BlendSpace1D Node Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"AnimationTree is inactive.\n"
+"Activate to enable playback, check node warnings if activation fails."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Set the blending position within the space"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Select and move points, create points with RMB."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Open Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Triangle already exists."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Add Triangle"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Change BlendSpace2D Limits"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Change BlendSpace2D Labels"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Remove BlendSpace2D Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Remove BlendSpace2D Triangle"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "BlendSpace2D does not belong to an AnimationTree node."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "No triangles exist, so no blending can take place."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Toggle Auto Triangles"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create triangles by connecting points."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Erase points and triangles."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Generate blend triangles automatically (instead of manually)"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Parameter Changed"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Filters"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Output node can't be added to the blend tree."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Add Node to BlendTree"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Node Moved"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Unable to connect, port may be in use or connection may be invalid."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Nodes Connected"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Nodes Disconnected"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Set Animation"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Delete Node"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Toggle Filter On/Off"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Change Filter"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "No animation player set, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Player path set is invalid, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid ""
+"Animation player has no valid root node path, so unable to retrieve track "
+"names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Node Renamed"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Node..."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Edit Filtered Tracks:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Enable Filtering"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Delete Animation?"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Invalid animation name!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation name already exists!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to copy!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation resource on clipboard!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to edit!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Transitions..."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Open in Inspector"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Enable Onion Skinning"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Onion Skinning Options"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Directions"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Past"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Future"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Depth"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "1 step"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "2 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "3 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Differences Only"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Force White Modulate"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Include Gizmos (3D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pin AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Move Node"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Add Transition"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Immediate"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Sync"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "At End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Travel"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Start and end nodes are needed for a sub-transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "No playback resource set at path: %s."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Node Removed"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition Removed"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Set Start Node (Autoplay)"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"Select and move nodes.\n"
+"RMB to add new nodes.\n"
+"Shift+LMB to create connections."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Create new nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Connect nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Remove selected node or transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Toggle autoplay this animation on start, restart or seek to zero."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Set the end animation. This is useful for sub-transitions."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition: "
+msgstr "Athrú: "
+
+#: editor/plugins/animation_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "AnimationTree"
+msgstr "CrannBeochan"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "New name:"
+msgstr "Ainm nua:"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "Scála:"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend"
+msgstr "Cumaisc"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix"
+msgstr "Measc"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Start!"
+msgstr "Tosaigh!"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr "Méid:"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr "Cumaisc 0:"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr "Cumaisc 1:"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Add Input"
+msgstr "Cuir ionchur leis"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Delete Input"
+msgstr "Scrios ionchur"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr "Tá crann beochana bailí."
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr "Tá an crann beochana neamhbhailí."
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "Nód Beochana"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr "Nód UrcharAmháin"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix Node"
+msgstr "Nód Measc"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr "Nód Cumaisc2"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr "Nód Cumaisc3"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr "Nód Cumaisc4"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Import Animations..."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Filters..."
+msgstr "Scagairí..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Contents:"
+msgstr "Ãbhar:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "View Files"
+msgstr "Amharc ar Chomhaid"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connection error, please try again."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect to host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response from host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, return code:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, too many redirects"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Bad download hash, assuming file has been tampered with."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Expected:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Got:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed sha256 hash check"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Asset Download Error:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading (%s / %s)..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Resolving..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Error making request"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Idle"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Install..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Retry"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download Error"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download for this asset is already in progress!"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "First"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Previous"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Next"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Last"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+msgid "Sort:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Reverse sorting."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Category:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Support"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"Can't determine a save path for lightmap images.\n"
+"Save your scene (for images to be saved in the same dir), or pick a save "
+"path from the BakedLightmap properties."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
+"Light' flag is on."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Failed creating lightmap images, make sure path is writable."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Bake Lightmaps"
+msgstr ""
+
+#: editor/plugins/camera_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Preview"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Vertical Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Vertical Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove Vertical Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Horizontal Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Horizontal Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove Horizontal Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Horizontal and Vertical Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move pivot"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Resize CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Children of containers have their anchors and margins values overridden by "
+"their parent."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Presets for the anchors and margins values of a Control node."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"When active, moving Control nodes changes their anchors instead of their "
+"margins."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchors only"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors and Margins"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock Selected"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Unlock Selected"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Group Selected"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Ungroup Selected"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Custom Bone(s) from Node(s)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Toggle snapping."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snapping Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Smart Snapping"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Parent"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Node Anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Node Sides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Node Center"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Other Nodes"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Custom Bone(s) from Node(s)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Custom Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Helpers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Rulers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Origin"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Viewport"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Preview Canvas Scale"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Translation mask for inserting keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation mask for inserting keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale mask for inserting keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert keys (based on mask)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Auto insert keys when objects are translated, rotated on scaled (based on "
+"mask).\n"
+"Keys are only added to existing tracks, no new tracks will be created.\n"
+"Keys must be inserted manually for the first time."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Auto Insert Key"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Multiply grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Divide grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan View"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Cannot instantiate multiple nodes without root."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Default Type"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Polygon3D"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Restart"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Particles"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Mask"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Capture from Pixel"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Colors"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+msgid "CPUParticles"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Mesh"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Node"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat 0"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat 1"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Smoothstep"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load Curve Preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Add Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Left Linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Right Linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load Preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Toggle Curve Linear Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Hold Shift to edit tangents individually"
+msgstr ""
+
+#: editor/plugins/gi_probe_editor_plugin.cpp
+msgid "Bake GI Probe"
+msgstr ""
+
+#: editor/plugins/gradient_editor_plugin.cpp
+msgid "Gradient Edited"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Failed creating shapes!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape(s)"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Contained Mesh is not of type ArrayMesh."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "UV Unwrap failed, mesh may not be manifold?"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "No mesh to debug."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Model has no UV in this layer"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling(s)"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh..."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV1"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV2"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Unwrap UV2 for Lightmap/AO"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generating Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generate Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Can only set point into a ParticlesMaterial process material"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generation Time (sec):"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry doesn't contain any faces."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Points:"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points+Normal (Directed)"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Source: "
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "A processor material of type 'ParticlesMaterial' is required."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generating AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate Visibility AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Out-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove In-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Angles"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Lengths"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Out-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove In-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/physical_bone_plugin.cpp
+msgid "Move Joint"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"Polygon 2D has internal vertices, so it can no longer be edited in the "
+"viewport."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon & UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Add Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygons"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create a custom polygon. Enables custom polygon rendering."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Unpaint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Radius:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Settings"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Configure Grid:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones to Polygon"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Type:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ResourcePreloader"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "AnimationTree has no path set to an AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Path to AnimationPlayer is invalid"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Files"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close and save changes?"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error writing TextFile:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Could not load file at:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving file!"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Importing"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "New Text File..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save File As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "%s Class Reference"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Filter scripts"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle alphabetical sorting of the method list."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Filter methods"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Sort"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Up"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Down"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Copy Script Path"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Previous"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle Scripts Panel"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Debug with External Editor"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open Godot online documentation."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Request Docs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Help improve the Godot documentation by giving feedback."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Discard"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Results"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Connections to method:"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Source"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Signal"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Target"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid ""
+"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "(ignore)"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Only resources from filesystem can be dropped."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Lookup Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Convert Case"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Uppercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Lowercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Capitalize"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Syntax Highlighter"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+msgid "Go To"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+msgid "Bookmarks"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Cut"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Delete Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold/Unfold Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Unfold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Evaluate Selection"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Spaces"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Tabs"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find in Files..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Bookmark"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Bookmark"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Bookmark"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Line..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr ""
+
+#: editor/plugins/shader_editor_plugin.cpp
+msgid ""
+"This shader has been modified on on disk.\n"
+"What action should be taken?"
+msgstr ""
+
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Shader"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "This skeleton has no bones, create some children Bone2D nodes."
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Create Rest Pose from Bones"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Set Rest Pose to Bones"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Skeleton2D"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Make Rest Pose (From Bones)"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Set Bones to Rest Pose"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical bones"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_ik_editor_plugin.cpp
+msgid "Play IK"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translating: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Objects Drawn"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Material Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Shader Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Surface Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Draw Calls"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Vertices"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Transform with View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Rotation with View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock View Rotation"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Unshaded"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Environment"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Information"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View FPS"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Half Resolution"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Enable Doppler"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Cinematic Preview"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Forward"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Backwards"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Up"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Down"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Speed Modifier"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Note: The FPS value displayed is the editor's framerate.\n"
+"It cannot be used as a reliable indication of in-game performance."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Nodes To Floor"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Drag: Rotate\n"
+"Alt+Drag: Move\n"
+"Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Local Space"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Toggle Freelook"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Object to Floor"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog..."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Settings..."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Nameless gizmo"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create Mesh2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create Polygon2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create CollisionPolygon2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create LightOccluder2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite is empty!"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Can't convert a sprite using animation frames to mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't replace by mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Convert to Mesh2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't create polygon."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Convert to Polygon2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't create collision polygon."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create CollisionPolygon2D Sibling"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't create light occluder."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create LightOccluder2D Sibling"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Simplification: "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Grow (Pixels): "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Update Preview"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Settings:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "No Frames Selected"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add %d Frame(s)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "New Animation"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add a Texture from File"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frames from a Sprite Sheet"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Select Frames"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Horizontal:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Vertical:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Select/Clear All Frames"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Create Frames from Sprite Sheet"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "SpriteFrames"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Region Rect"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Sep.:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "TextureRegion"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
+msgid "Remove All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Edit Theme"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme editing menu."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create From Current Editor Theme"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Toggle Button"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Disabled Button"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Disabled Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Named Sep."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Submenu"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Subitem 1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Subitem 2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Disabled LineEdit"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Editable Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Subtree"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has,Many,Options"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Style"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Fix Invalid Tiles"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Line Draw"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rectangle Paint"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket Fill"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Disable Autotile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Enable Priority"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid ""
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate Left"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate Right"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip Horizontally"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip Vertically"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear Transform"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Texture(s) to TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected Texture from TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Next Coordinate"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Select the next shape, subtile, or Tile."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Previous Coordinate"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Select the previous shape, subtile, or Tile."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Region Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Collision Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Occlusion Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Navigation Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Bitmask Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Priority Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Icon Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Z Index Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new rectangle."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "You haven't selected a texture to remove."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Texture"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Drag handles to edit Rect.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select current edited sub-tile.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Shift+LMB: Set wildcard bit.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to use as icon, this will be also used on invalid autotile "
+"bindings.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its priority.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Make Polygon Concave"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Make Polygon Convex"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "This property can't be changed."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "TileSet"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add input +"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add output +"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Boolean"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add input port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add output port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change input port type"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change output port type"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change input port name"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change output port name"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Remove input port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Remove output port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Set expression"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Resize VisualShader node"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Set Uniform Name"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Set Input Default Port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Node to Visual Shader"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Duplicate Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Delete Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Visual Shader Input Type Changed"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vertex"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Fragment"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Light"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Create Shader Node"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Grayscale function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts HSV vector to RGB equivalent."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts RGB vector to HSV equivalent."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Sepia function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Burn operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Darken operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Difference operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Dodge operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "HardLight operator"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Lighten operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Overlay operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Screen operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "SoftLight operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the boolean result of the %s comparison between two parameters."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Equal (==)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Greater Than (>)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Greater Than or Equal (>=)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns an associated vector if the provided scalars are equal, greater or "
+"less."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the boolean result of the comparison between INF and a scalar "
+"parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the boolean result of the comparison between NaN and a scalar "
+"parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Less Than (<)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Less Than or Equal (<=)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Not Equal (!=)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns an associated vector if the provided boolean value is true or false."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the boolean result of the comparison between two parameters."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the boolean result of the comparison between INF (or NaN) and a "
+"scalar parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Boolean constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Boolean uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for all shader modes."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Input parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for vertex and fragment shader modes."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for fragment and light shader modes."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for fragment shader mode."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for light shader mode."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for vertex shader mode."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for vertex and fragment shader mode."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "E constant (2.718282). Represents the base of the natural logarithm."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Epsilon constant (0.00001). Smallest possible scalar number."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Phi constant (1.618034). Golden ratio."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Pi/4 constant (0.785398) or 45 degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Pi/2 constant (1.570796) or 90 degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Pi constant (3.141593) or 180 degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Tau constant (6.283185) or 360 degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Sqrt2 constant (1.414214). Square root of 2."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the absolute value of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-cosine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse hyperbolic cosine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-sine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse hyperbolic sine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-tangent of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-tangent of the parameters."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse hyperbolic tangent of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Finds the nearest integer that is greater than or equal to the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Constrains a value to lie between two further values."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the cosine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the hyperbolic cosine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts a quantity in radians to degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Base-e Exponential."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Base-2 Exponential."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the nearest integer less than or equal to the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Computes the fractional part of the argument."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse of the square root of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Natural logarithm."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Base-2 logarithm."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the greater of two values."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the lesser of two values."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two scalars."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the opposite value of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 - scalar"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the value of the first parameter raised to the power of the second."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts a quantity in degrees to radians."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 / scalar"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the nearest integer to the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the nearest even integer to the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Clamps the value between 0.0 and 1.0."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Extracts the sign of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the sine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the hyperbolic sine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the square root of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
+"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
+"using Hermite polynomials."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Step function( scalar(edge), scalar(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the tangent of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the hyperbolic tangent of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the truncated value of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Adds scalar to scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Divides scalar by scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies scalar by scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the remainder of the two scalars."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Subtracts scalar from scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Perform the cubic texture lookup."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Perform the texture lookup."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Cubic texture uniform lookup."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "2D texture uniform lookup."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "2D texture uniform lookup with triplanar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Calculate the outer product of a pair of vectors.\n"
+"\n"
+"OuterProduct treats the first parameter 'c' as a column vector (matrix with "
+"one column) and the second parameter 'r' as a row vector (matrix with one "
+"row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix "
+"whose number of rows is the number of components in 'c' and whose number of "
+"columns is the number of components in 'r'."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Composes transform from four vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Decomposes transform to four vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the determinant of a transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the inverse of a transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the transpose of a transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies transform by transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies vector by transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Composes vector from three scalars."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Decomposes vector to three scalars."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the cross product of two vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the distance between two points."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the dot product of two vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the vector that points in the same direction as a reference vector. "
+"The function has three vector parameters : N, the vector to orient, I, the "
+"incident vector, and Nref, the reference vector. If the dot product of I and "
+"Nref is smaller than zero the return value is N. Otherwise -N is returned."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the length of a vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the normalize product of vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 - vector"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 / vector"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the vector that points in the direction of reflection ( a : incident "
+"vector, b : normal vector )."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the vector that points in the direction of refraction."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
+"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
+"using Hermite polynomials."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
+"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
+"using Hermite polynomials."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Step function( vector(edge), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Step function( scalar(edge), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Adds vector to vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Divides vector by vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies vector by vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the remainder of the two vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Subtracts vector from vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, with custom amount of input and "
+"output ports. This is a direct injection of code into the vertex/fragment/"
+"light function, do not use it to write the function declarations inside."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns falloff based on the dot product of surface normal and view "
+"direction of camera (pass associated inputs to it)."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(Fragment/Light mode only) Scalar derivative function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(Fragment/Light mode only) Vector derivative function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
+"differencing."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
+"differencing."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
+"differencing."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
+"differencing."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
+"'y'."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
+"'y'."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "VisualShader"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Edit Visual Property"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Visual Shader Mode Changed"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Runnable"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete patch '%s' from list?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete preset '%s'?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Failed to export the project for platform '%s'.\n"
+"Export templates seem to be missing or invalid."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Failed to export the project for platform '%s'.\n"
+"This might be due to a configuration issue in the export preset or your "
+"export settings."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "The given export path doesn't exist:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing/corrupted:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Presets"
+msgstr ""
+
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+msgid "Add..."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export all resources in the project"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected scenes (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected resources (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources to export:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Patches"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Make Patch"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Features"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Custom (comma-separated):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Feature List:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export With Debug"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The path does not exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose an empty folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose a 'project.godot' or '.zip' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Directory already contains a Godot project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid Project Name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "There is already a folder in this path with the specified name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "It would be a good idea to name your project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Couldn't load project.godot in project path (error %d). It may be missing or "
+"corrupted."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't edit project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Rename Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Installation Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Renderer:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "OpenGL ES 3.0"
+msgstr "OpenGL ES 3.0"
+
+#: editor/project_manager.cpp
+msgid ""
+"Higher visual quality\n"
+"All features available\n"
+"Incompatible with older hardware\n"
+"Not recommended for web games"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "OpenGL ES 2.0"
+msgstr "OpenGL ES 2.0"
+
+#: editor/project_manager.cpp
+msgid ""
+"Lower visual quality\n"
+"Some features not available\n"
+"Works on most hardware\n"
+"Recommended for web games"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Renderer can be changed later, but scenes may need to be adjusted."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't open project at '%s'."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file does not specify the version of Godot "
+"through which it was created.\n"
+"\n"
+"%s\n"
+"\n"
+"If you proceed with opening it, it will be converted to Godot's current "
+"configuration file format.\n"
+"Warning: You won't be able to open the project with previous versions of the "
+"engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You won't be able to open the project with previous versions of the "
+"engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: no main scene defined.\n"
+"Please edit the project and set the main scene in the Project Settings under "
+"the \"Application\" category."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: Assets need to be imported.\n"
+"Please edit the project to trigger the initial import."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to run %d projects at once?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Remove %d projects from the list?\n"
+"The project folders' contents won't be modified."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Remove this project from the list?\n"
+"The project folder's contents won't be modified."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Language changed.\n"
+"The interface will update after restarting the editor or project manager."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Are you sure to scan %s folders for existing Godot projects?\n"
+"This could take a while."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Projects"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Remove Missing"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Templates"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Restart Now"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't run project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"You currently don't have any projects.\n"
+"Would you like to explore official example projects in the Asset Library?"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Key "
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "An action with the name '%s' already exists."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Action deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "All Devices"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Press a Key..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 1"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 2"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Axis Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Global Property"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Select a setting item first!"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "No property '%s' exists."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Setting '%s' is internal, and it can't be deleted."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Delete Item"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override for Feature"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter Mode"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Project Settings (project.godot)"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override For..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "The editor must be restarted for changes to take effect."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Input Map"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Localization"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resources:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locale"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show All Locales"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show Selected Locales Only"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Filter mode:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "File..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Dir..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Select Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Pick a Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Virtual Method"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Batch Rename"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Prefix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Advanced Options"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Substitute"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node's parent name, if available"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node type"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Current scene name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Root node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Sequential integer counter.\n"
+"Compare counter options."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Per Level counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "If set the counter restarts for each group of child nodes"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Initial value for the counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Step"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Amount by which counter is incremented for each node"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Padding"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Minimum number of digits for the counter.\n"
+"Missing digits are padded with leading zeros."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Regular Expressions"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Post-Process"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Keep"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "CamelCase to under_scored"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "under_scored to CamelCase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Case"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Lowercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Uppercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Reset"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Error"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Node must belong to the edited scene to become root."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instantiated scenes can't become root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make node as Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can not perform with the root node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Save New Scene As..."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "New Scene Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Create Root Node:"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "2D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "3D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "User Interface"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Other Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Sub-Resources"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Open Documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Expand/Collapse All"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Extend Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Reparent to New Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Scene Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+msgid "Copy Node Path"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remote"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visible"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Unlock Node"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Button Group"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "(Connecting From)"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node configuration warning:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has %s connection(s) and %s group(s).\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has %s connection(s).\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is in %s group(s).\n"
+"Click to show groups dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Open Script:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is locked.\n"
+"Click to unlock it."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Children are not selectable.\n"
+"Click to make selectable."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visibility"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"AnimationPlayer is pinned.\n"
+"Click to unpin."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node Configuration Warning!"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is empty."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Filename is empty."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is not local."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid base path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "A directory with the same name exists."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid extension."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Wrong extension chosen."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading template '%s'"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error - Could not create script in filesystem."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Open Script / Choose Location"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Open Script"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "File exists, it will be reused."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid class name."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid inherited parent name or path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Script is valid."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Allowed: a-z, A-Z, 0-9, _ and ."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in script (into scene file)."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Will create a new script file."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Will load an existing script file."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Inherits"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Class Name"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Template"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in Script"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Remote "
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Trace"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Pick one or more items from the list to display the graph."
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Copy Error"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Export measures as CSV"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Erase Shortcut"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Restore Shortcut"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Change Shortcut"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Binding"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change AudioStreamPlayer3D Emission Angle"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Particles AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Height"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Inner Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Outer Radius"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select the dynamic library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select dependencies of the library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Remove current entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Double click to create a new entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform:"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dynamic Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Add an architecture entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "GDNativeLibrary"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Enabled GDNative Singleton"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Disabled GDNative Singleton"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Status"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Libraries: "
+msgstr ""
+
+#: modules/gdnative/register_types.cpp
+msgid "GDNative"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Object can't provide a length."
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Plane:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Floor:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Delete Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Paste Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Paint"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Grid Map"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Snap View"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Disabled"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Above"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Below"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit X Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Y Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Z Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Clear Rotation"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clear Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Settings"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Pick Distance:"
+msgstr ""
+
+#: modules/mono/csharp_script.cpp
+msgid "Class name can't be a reserved keyword"
+msgstr ""
+
+#: modules/mono/mono_gd/gd_mono_utils.cpp
+msgid "End of inner exception stack trace"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Bake NavMesh"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Clear the navigation mesh."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Setting up Configuration..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Calculating grid size..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Marking walkable triangles..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Constructing compact heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Eroding walkable area..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Partitioning..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating contours..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating polymesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Converting to native navigation mesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Navigation Mesh Generator Setup:"
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Parsing Geometry..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Done!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Signal Arguments"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument name"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Default Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Duplicate VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Base Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Move Node(s)"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Data"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Script already has function '%s'"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Input Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Resize Comment"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Can't copy the function node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Clipboard is empty!"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit its graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Member"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search VisualScript"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Get %s"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Set %s"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Package name is missing."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Package segments must be of non-zero length."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "The character '%s' is not allowed in Android application package names."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "A digit cannot be the first character in a package segment."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "The character '%s' cannot be the first character in a package segment."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "The package must have at least one '.' separator."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "ADB executable not configured in the Editor Settings."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "OpenJDK jarsigner not configured in the Editor Settings."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Debug keystore not configured in the Editor Settings nor in the preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Custom build requires a valid Android SDK path in Editor Settings."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Invalid Android SDK path for custom build in Editor Settings."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"Android project is not installed for compiling. Install from Editor menu."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Invalid public key for APK expansion."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Invalid package name:"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"Trying to build from a custom built template, but no version info for it "
+"exists. Please reinstall from the 'Project' menu."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"Android build version mismatch:\n"
+" Template installed: %s\n"
+" Godot Version: %s\n"
+"Please reinstall Android build template from 'Project' menu."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Building Android Project (gradle)"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"Building of Android project failed, check output for the error.\n"
+"Alternatively visit docs.godotengine.org for Android build documentation."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "No build apk generated at: "
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "Identifier is missing."
+msgstr "Tá aitheantóir ar iarraidh."
+
+#: platform/iphone/export/export.cpp
+msgid "Identifier segments must be of non-zero length."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "The character '%s' is not allowed in Identifier."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "A digit cannot be the first character in a Identifier segment."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid ""
+"The character '%s' cannot be the first character in a Identifier segment."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "The Identifier must have at least one '.' separator."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "App Store Team ID not specified - cannot configure the project."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "Invalid Identifier:"
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "Required icon is not specified in the preset."
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run in Browser"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run exported HTML in the system's default browser."
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not write file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not open template for export:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Invalid export template:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read custom HTML shell:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read boot splash image file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Using default boot splash image."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid package unique name."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the \"Frames\" property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_object_2d.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
+"define its shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the \"Texture\" "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid ""
+"GPU-based particles are not supported by the GLES2 video driver.\n"
+"Use the CPUParticles2D node instead. You can use the \"Convert to "
+"CPUParticles\" option for this purpose."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
+msgid ""
+"A material to process the particles is not assigned, so no behavior is "
+"imprinted."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/physics_body_2d.cpp
+msgid ""
+"Size changes to RigidBody2D (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "This Bone2D chain should end at a Skeleton2D node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid ""
+"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
+msgstr ""
+
+#: scene/2d/tile_map.cpp
+msgid ""
+"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes "
+"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
+"KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnabler2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRCamera must have an ARVROrigin node as its parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRController must have an ARVROrigin node as its parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The controller ID must not be 0 or this controller won't be bound to an "
+"actual controller."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRAnchor must have an ARVROrigin node as its parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The anchor ID must not be 0 or this anchor won't be bound to an actual "
+"anchor."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVROrigin requires an ARVRCamera child node."
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "%d%%"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "(Time Left: %d:%02d s)"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Meshes: "
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Lights:"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
+msgid "Finishing Plot"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Lighting Meshes: "
+msgstr ""
+
+#: scene/3d/collision_object.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape or CollisionPolygon as a child to define "
+"its shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"Plane shapes don't work well and will be removed in future versions. Please "
+"don't use them."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial whose "
+"Billboard Mode is set to \"Particle Billboard\"."
+msgstr ""
+
+#: scene/3d/gi_probe.cpp
+msgid "Plotting Meshes"
+msgstr ""
+
+#: scene/3d/gi_probe.cpp
+msgid ""
+"GIProbes are not supported by the GLES2 video driver.\n"
+"Use a BakedLightmap instead."
+msgstr ""
+
+#: scene/3d/light.cpp
+msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"GPU-based particles are not supported by the GLES2 video driver.\n"
+"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles"
+"\" option for this purpose."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Nothing is visible because meshes have not been assigned to draw passes."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial whose Billboard "
+"Mode is set to \"Particle Billboard\"."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
+"parent Path's Curve resource."
+msgstr ""
+
+#: scene/3d/physics_body.cpp
+msgid ""
+"Size changes to RigidBody (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid ""
+"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
+"derived node to work."
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid "This body will be ignored until you set a mesh."
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid ""
+"Size changes to SoftBody will be overridden by the physics engine when "
+"running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the \"Frames\" property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/3d/vehicle_body.cpp
+msgid ""
+"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
+"it as a child of a VehicleBody."
+msgstr ""
+
+#: scene/3d/world_environment.cpp
+msgid ""
+"WorldEnvironment requires its \"Environment\" property to contain an "
+"Environment to have a visible effect."
+msgstr ""
+
+#: scene/3d/world_environment.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/world_environment.cpp
+msgid ""
+"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
+"this environment's Background Mode to Canvas (for 2D scenes)."
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "On BlendTree node '%s', animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "Animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "In node '%s', invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Nothing connected to input '%s' of node '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "No root AnimationNode for the graph is set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path to an AnimationPlayer node containing animations is not set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "The AnimationPlayer root node is not a valid node."
+msgstr ""
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Pick a color from the screen."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "HSV"
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Raw"
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Switch between hexadecimal and code values."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Add current color as a preset."
+msgstr ""
+
+#: scene/gui/container.cpp
+msgid ""
+"Container by itself serves no purpose unless a script configures its "
+"children placement behavior.\n"
+"If you don't intend to add a script, use a plain Control node instead."
+msgstr ""
+
+#: scene/gui/control.cpp
+msgid ""
+"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
+"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine, but they will hide upon "
+"running."
+msgstr ""
+
+#: scene/gui/range.cpp
+msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
+msgstr ""
+
+#: scene/gui/scroll_container.cpp
+msgid ""
+"ScrollContainer is intended to work with a single child control.\n"
+"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
+"minimum size manually."
+msgstr ""
+
+#: scene/gui/tree.cpp
+msgid "(Other)"
+msgstr ""
+
+#: scene/main/scene_tree.cpp
+msgid ""
+"Default Environment as specified in Project Settings (Rendering -> "
+"Environment -> Default Environment) could not be loaded."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/visual_shader.cpp
+msgid "Input"
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid source for preview."
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid source for shader."
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid comparison function for that type."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to function."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to uniform."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Varyings can only be assigned in vertex function."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Constants cannot be modified."
+msgstr "Ní féidir tairisigh a athrú."
diff --git a/editor/translations/he.po b/editor/translations/he.po
index e5c3c37588..4847730e69 100644
--- a/editor/translations/he.po
+++ b/editor/translations/he.po
@@ -9,12 +9,13 @@
# RaikaRakka <shaiyatta@gmail.com>, 2018.
# Ido Dana <idodana01@gmail.com>, 2019.
# Daniel Dovgun <daniel.dovgun@gmail.com>, 2019.
+# MordechaiHadad <Mordechai.hadad01@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-02 10:49+0000\n"
-"Last-Translator: Daniel Dovgun <daniel.dovgun@gmail.com>\n"
+"PO-Revision-Date: 2019-08-11 10:23+0000\n"
+"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/"
"godot/he/>\n"
"Language: he\n"
@@ -28,7 +29,7 @@ msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
+msgstr "משתנה סוג ×œ× ×—×•×§×™ לפונקציית convert()‎, יש להשתמש בקבועי TYPE_*‎."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -67,7 +68,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Free"
msgstr "×—×™× ×"
@@ -686,17 +686,18 @@ msgid "Line Number:"
msgstr "מספר השורה:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "×ין תוצ×ות"
-
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d match."
msgstr ""
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "×ין תוצ×ות"
+
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "הת×מת רישיות"
@@ -928,8 +929,7 @@ msgstr "מועדפי×:"
msgid "Recent:"
msgstr "×חרוני×:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1024,7 +1024,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "×œ× × ×™×ª×Ÿ להסיר:"
@@ -1062,7 +1062,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr "תלויות"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "דפדפן מש××‘×™× ×™×ª×•×ž×™×"
@@ -1151,14 +1151,15 @@ msgid "License"
msgstr "רישיון"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "רישיון צד שלישי"
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1175,7 +1176,8 @@ msgid "Licenses"
msgstr "רישיונות"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "פתיחת קובץ החבילה נכשלה, המבנה ×ינו zip."
#: editor/editor_asset_installer.cpp
@@ -1683,12 +1685,11 @@ msgid "New"
msgstr "חדש"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "ייבו×"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "ייצו×"
@@ -2114,6 +2115,10 @@ msgstr "מחיקה"
msgid "Clear Output"
msgstr "מחיקת הפלט"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2418,6 +2423,15 @@ msgid "Pick a Main Scene"
msgstr "× × ×œ×‘×—×•×¨ סצנה ר×שית"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "סגירת סצנה"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "סגירת סצנה"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr "×œ× × ×™×ª×Ÿ לפתוח ×ת תוסף ההרחבות תחת: ‚%s’ פענוח ההגדרות נכשל."
@@ -2514,6 +2528,11 @@ msgstr "נגינת הסצנה"
msgid "Close Tab"
msgstr "לסגור לשוניות ×חרות"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "לסגור לשוניות ×חרות"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "לסגור לשוניות ×חרות"
@@ -2600,6 +2619,10 @@ msgstr "סצנה חדשה בירושה…"
msgid "Open Scene..."
msgstr "פתיחת סצנה…"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "פתיחה מה×חרוני×"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "שמירת סצנה"
@@ -2610,14 +2633,6 @@ msgid "Save All Scenes"
msgstr "שמירת כל הסצנות"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "סגירת סצנה"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "פתיחה מה×חרוני×"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "המרה ×ל…"
@@ -2647,26 +2662,37 @@ msgstr "שחזור סצנה"
msgid "Miscellaneous project or scene-wide tools."
msgstr "×›×œ×™× ×©×•× ×™× ×œ×ž×™×–× ×ו למגוון סצנות."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "מיז×"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "הגדרות מיז×"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "כלי×"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "ייצו×"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "לפתוח ×ת מנהל המיזמי×?"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "כלי×"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "דפדפן מש××‘×™× ×™×ª×•×ž×™×"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2747,12 +2773,13 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "עורך"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "הגדרות עורך"
#: editor/editor_node.cpp
@@ -2794,14 +2821,15 @@ msgstr "הגדרות עורך"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "ניהול תבניות ייצו×"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "ניהול תבניות ייצו×"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "עזרה"
@@ -2809,12 +2837,13 @@ msgstr "עזרה"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "חיפוש"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "×ž×¡×ž×›×™× ×ž×§×•×•× ×™×"
@@ -3263,7 +3292,8 @@ msgid "Import From Node:"
msgstr "×™×™×‘×•× ×ž×ž×¤×¨×§:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "הורדה מחדש"
#: editor/export_template_manager.cpp
@@ -3280,6 +3310,10 @@ msgid "Download"
msgstr "הורדה"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(חסר)"
@@ -3342,12 +3376,10 @@ msgid "No response."
msgstr "×ין תגובה."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "הבקשה נכשלה."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "לול×ת הפניות."
@@ -3361,13 +3393,19 @@ msgid "Download Complete."
msgstr "ההורדה הושלמה."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "×œ× × ×™×ª×Ÿ להסיר:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "שגי××” בבקשת כתובת: "
#: editor/export_template_manager.cpp
@@ -3454,21 +3492,12 @@ msgstr "הורדת תבניות"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "בחירת ×תר מר××” מהרשימה: "
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"×œ× × ×™×ª×Ÿ לפתוח ×ת file_type_cache.cch לכתיבה, מטמון סוג ×”×§×‘×¦×™× ×œ× ×™×™×©×ž×¨!"
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "מועדפי×:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "×œ× × ×™×ª×Ÿ לנווט ×ל ‚%s’ כיוון ×©×œ× × ×ž×¦× ×‘×ž×¢×¨×›×ª הקבצי×!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr "מצב: ×™×™×‘×•× ×”×§×•×‘×¥ נכשל. × × ×œ×ª×§×Ÿ ×ת הקובץ ×•×œ×™×™×‘× ×ž×—×“×© ידנית."
@@ -3502,14 +3531,14 @@ msgid "Provided name contains invalid characters."
msgstr "×”×©× ×©×¡×•×¤×§ מכיל ×ª×•×•×™× ×©×’×•×™×™×"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "×”×©× ×ž×›×™×œ ×ª×•×•×™× ×©×’×•×™×™×."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "כבר ×§×™×™×ž×™× ×§×•×‘×¥ ×ו תיקייה ×‘×©× ×”×–×”."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "×”×©× ×ž×›×™×œ ×ª×•×•×™× ×©×’×•×™×™×."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "שינוי ×©× ×”×§×•×‘×¥:"
@@ -3569,6 +3598,11 @@ msgstr "שכפול…"
msgid "Move To..."
msgstr "העברה ×ל…"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "סצנה חדשה"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3643,6 +3677,11 @@ msgstr "כבר ×§×™×™×ž×™× ×§×•×‘×¥ ×ו תיקייה ×‘×©× ×”×–×”."
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "שמירת סצנה"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "יצירת סקריפט"
@@ -3711,6 +3750,14 @@ msgid "Search complete"
msgstr "חיפוש טקסט"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "הוספה לקבוצה"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "הסרה מקבוצה"
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "הפעולה ‚%s’ כבר קיימת!"
@@ -3720,13 +3767,23 @@ msgstr "הפעולה ‚%s’ כבר קיימת!"
msgid "Invalid group name."
msgstr "×©× ×©×’×•×™."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "קבוצות"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "מחיקת שורה"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "קבוצות"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr "הוספה לקבוצה"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3740,12 +3797,13 @@ msgid "Nodes in Group"
msgstr "הוספה לקבוצה"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "הוספה לקבוצה"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "הסרה מקבוצה"
+#, fuzzy
+msgid "Group Editor"
+msgstr "פתיחת עורך סקריפטי×"
#: editor/groups_editor.cpp
#, fuzzy
@@ -3956,7 +4014,8 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "יש לבחור מפרק כדי לערוך ×ותות וקבוצות."
#: editor/plugin_config_dialog.cpp
@@ -4745,10 +4804,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4761,14 +4816,47 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "הבקשה נכשלה."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "×œ× × ×™×ª×Ÿ להסיר:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "לול×ת הפניות."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "הבקשה נכשלה."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "זמן"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4849,8 +4937,12 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "ייבו×"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4872,8 +4964,9 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
-msgstr ""
+#, fuzzy
+msgid "Support"
+msgstr "ייבו×"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Official"
@@ -4884,6 +4977,11 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "טעינה"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -5049,6 +5147,11 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "נגינת סצנה בהת×מה ×ישית"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "נגינת סצנה בהת×מה ×ישית"
@@ -5079,6 +5182,7 @@ msgid "Zoom Reset"
msgstr "להתרחק"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -5099,14 +5203,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "מצב שינוי קנה מידה (R)"
@@ -5132,6 +5239,7 @@ msgid "Toggle snapping."
msgstr "החלפת מצב נקודת עצירה"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5149,11 +5257,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "הגדרת הצמדה…"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5166,6 +5269,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "הגדרת הצמדה…"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5382,16 +5490,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5711,14 +5809,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5804,19 +5894,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't contain geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6154,7 +6248,6 @@ msgid "Grid Settings"
msgstr "הגדרות"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "הצמדה"
@@ -6264,12 +6357,7 @@ msgstr "שגי××” ×‘×™×™×‘×•× ×¢×¨×›×ª הנוש×"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "×œ× × ×™×ª×Ÿ ליצור תיקייה."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "×œ× × ×™×ª×Ÿ ליצור תיקייה."
#: editor/plugins/script_editor_plugin.cpp
@@ -6299,7 +6387,7 @@ msgstr "שגי××” בייבו×"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "תיקייה חדשה…"
#: editor/plugins/script_editor_plugin.cpp
@@ -6385,6 +6473,11 @@ msgid "Open..."
msgstr "פתיחה"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "הרצת סקריפט"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "לשמור הכול"
@@ -6424,13 +6517,13 @@ msgid "Save Theme"
msgstr "שמירת ערכת העיצוב"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "סגירת מסמכי×"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "לסגור הכול"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "סגירת מסמכי×"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "הרצה"
@@ -6521,6 +6614,11 @@ msgstr "ניפוי שגי×ות"
msgid "Search Results"
msgstr "חיפוש בעזרה"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "מחיקת ×§×‘×¦×™× ×חרוני×"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6592,6 +6690,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6627,26 +6726,6 @@ msgid "Toggle Comment"
msgstr "החלפת מצב הערה"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "החלפת מצב מבט חופשי"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "מעבר לנקודת העצירה הב××”"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "מעבר לנקודת העצירה הקודמת"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "הסרת כל נקודות העצירה"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "צמצו×/הרחבה של שורה"
@@ -6667,6 +6746,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "בחירת מיקוד"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6685,32 +6769,37 @@ msgid "Auto Indent"
msgstr "×”×–×—×” ×וטומטית"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "החלפת מצב נקודת עצירה"
+msgid "Find Previous"
+msgstr "×יתור הקוד×"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "הסרת כל נקודות העצירה"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "×יתור…"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "עזרה תלוית הקשר"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "מעבר לנקודת העצירה הב××”"
+msgid "Toggle Bookmark"
+msgstr "החלפת מצב מבט חופשי"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "מעבר לנקודת העצירה הקודמת"
+msgid "Go to Next Bookmark"
+msgstr "מעבר לנקודת העצירה הב××”"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "×יתור הקוד×"
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "מעבר לנקודת העצירה הקודמת"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "×יתור…"
+msgid "Remove All Bookmarks"
+msgstr "הסרת כל נקודות העצירה"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6723,8 +6812,23 @@ msgid "Go to Line..."
msgstr "מעבר לשורה…"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "עזרה תלוית הקשר"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "החלפת מצב נקודת עצירה"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "הסרת כל נקודות העצירה"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "מעבר לנקודת העצירה הב××”"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "מעבר לנקודת העצירה הקודמת"
#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
@@ -6972,8 +7076,9 @@ msgid "Audio Listener"
msgstr "מ×זין לשמע"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "שינוי"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -7027,8 +7132,8 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "בחירת מצב (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7041,30 +7146,11 @@ msgstr ""
"Alt+כפתור ימני: בחירת רשימת עומק"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "מצב הזזה (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "מצב הטיה (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "מצב שינוי קנה מידה (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "נקודות ציון מקומיות"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "מצב מרחב מקומי (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "מצב הצמדה (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "מבט תחתי"
@@ -7106,22 +7192,6 @@ msgid "Focus Selection"
msgstr "בחירת מיקוד"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "החלפת מצב מבט חופשי"
@@ -7176,7 +7246,8 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "הגדרות"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7486,10 +7557,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7578,11 +7645,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7704,8 +7771,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8019,6 +8086,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "הוספת ×ירוע"
@@ -8107,6 +8178,11 @@ msgid "Duplicate Nodes"
msgstr "שכפול"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "הדבקת מפרקי×"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "מחיקת שורה"
@@ -8116,10 +8192,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Vertex"
msgstr "קודקודי×"
@@ -8135,6 +8207,11 @@ msgstr "ימין"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "יצירת תיקייה"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "יצירת תיקייה"
@@ -8497,7 +8574,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8506,7 +8583,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8670,6 +8747,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8695,7 +8776,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8704,7 +8785,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8713,14 +8794,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8765,6 +8846,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8979,6 +9067,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "ניהול תבניות ייצו×"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9127,6 +9219,15 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "מיז×"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "×œ× × ×™×ª×Ÿ לפתוח ×ת ‚%s’."
@@ -9196,8 +9297,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9220,8 +9321,9 @@ msgid "Project Manager"
msgstr "מנהל המיזמי×"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "רשימת המיזמי×"
+#, fuzzy
+msgid "Projects"
+msgstr "מיז×"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9245,10 +9347,6 @@ msgid "Templates"
msgstr "תבניות"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "יצי××”"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "להפעיל מחדש כעת"
@@ -9592,6 +9690,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9644,14 +9746,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -9953,6 +10047,11 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "שינוי ×©× ×§×œ×˜"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10080,19 +10179,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10190,6 +10289,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10386,6 +10489,10 @@ msgid "Change Shortcut"
msgstr "שינוי הערה"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "הגדרות עורך"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10800,10 +10907,30 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "×©× ×©×’×•×™. ×œ× ×™×›×•×œ לחפוף ×œ×©× ×¡×•×’ מובנה ×§×™×™×."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "יצירת %s חדש"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "יצירת %s חדש"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "יצירת מצולע"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10991,10 +11118,6 @@ msgid "Cut Nodes"
msgstr "גזירת מפרקי×"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "הדבקת מפרקי×"
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "חברי×"
@@ -11741,22 +11864,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "מבנה הגופן ×œ× ×™×“×•×¢."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "שגי××” בטעינת הגופן."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "גודל הגופן שגוי."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11792,6 +11899,51 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "×œ× × ×™×ª×Ÿ לפתוח ×ת file_type_cache.cch לכתיבה, מטמון סוג ×”×§×‘×¦×™× ×œ× ×™×™×©×ž×¨!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "×œ× × ×™×ª×Ÿ לנווט ×ל ‚%s’ כיוון ×©×œ× × ×ž×¦× ×‘×ž×¢×¨×›×ª הקבצי×!"
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "×œ× × ×™×ª×Ÿ ליצור תיקייה."
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "בחירת מצב (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "מצב הזזה (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "מצב הטיה (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "מצב שינוי קנה מידה (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "נקודות ציון מקומיות"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "מצב הצמדה (%s)"
+
+#~ msgid "Project List"
+#~ msgstr "רשימת המיזמי×"
+
+#~ msgid "Exit"
+#~ msgstr "יצי××”"
+
+#~ msgid "Unknown font format."
+#~ msgstr "מבנה הגופן ×œ× ×™×“×•×¢."
+
+#~ msgid "Error loading font."
+#~ msgstr "שגי××” בטעינת הגופן."
+
+#~ msgid "Invalid font size."
+#~ msgstr "גודל הגופן שגוי."
+
#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "המישור הקוד×"
diff --git a/editor/translations/hi.po b/editor/translations/hi.po
index 8a8a3c28a5..d4030266c5 100644
--- a/editor/translations/hi.po
+++ b/editor/translations/hi.po
@@ -61,7 +61,6 @@ msgid "On call to '%s':"
msgstr "'%s ' को कॉल करने पर:"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "मà¥à¤«à¥à¤¤"
@@ -662,16 +661,17 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr ""
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "à¤à¤• जैसा:"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -914,8 +914,7 @@ msgstr "पसंदीदा:"
msgid "Recent:"
msgstr "हाल ही में किया:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#, fuzzy
@@ -1022,7 +1021,7 @@ msgstr ""
"निकाली गई फ़ाइलों को दूसरे संसाधनों दà¥à¤µà¤¾à¤°à¤¾ उनके लिठकाम करने के लिठआवशà¥à¤¯à¤• है\n"
"वैसे भी उनà¥à¤¹à¥‡à¤‚ निकालें? (कोई पूरà¥à¤µà¤µà¤¤ नहीं)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
#, fuzzy
msgid "Cannot remove:"
msgstr "निकाला नहीं जा सकता:\n"
@@ -1061,7 +1060,7 @@ msgstr "%d आइटम को सà¥à¤¥à¤¾à¤¯à¥€ रूप से हटाà¤à
msgid "Show Dependencies"
msgstr "निरà¥à¤­à¤°à¤¤à¤¾"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
#, fuzzy
msgid "Orphan Resource Explorer"
msgstr "Orphan Resource Explorer"
@@ -1154,14 +1153,15 @@ msgstr "License"
#: editor/editor_about.cpp
#, fuzzy
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr "Thirdparty License"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"गोडोट इंजन तीसरे पकà¥à¤· के सà¥à¤µà¤¤à¤‚तà¥à¤° और खà¥à¤²à¥‡ सà¥à¤°à¥‹à¤¤ पà¥à¤¸à¥à¤¤à¤•ालयों पर निरà¥à¤­à¤° करता है, जो कि इसके "
@@ -1182,7 +1182,8 @@ msgid "Licenses"
msgstr "Licenses"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "पैकेज फ़ाइल खोलने में तà¥à¤°à¥à¤Ÿà¤¿, zip पà¥à¤°à¤¾à¤°à¥‚प में नहीं |"
#: editor/editor_asset_installer.cpp
@@ -1677,12 +1678,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2083,6 +2083,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2380,6 +2384,15 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "खोलो इसे"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2474,6 +2487,11 @@ msgstr ""
msgid "Close Tab"
msgstr "बंद करे"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "बंद करे"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2560,20 +2578,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2606,16 +2620,20 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
@@ -2623,11 +2641,16 @@ msgstr ""
msgid "Open Project Data Folder"
msgstr "परियोजना के संसà¥à¤¥à¤¾à¤ªà¤•"
-#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
msgstr ""
#: editor/editor_node.cpp
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Orphan Resource Explorer"
+
+#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr ""
@@ -2704,13 +2727,14 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
-msgstr ""
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
+msgstr "अनà¥à¤µà¤¾à¤¦ में बदलाव करें:"
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2745,14 +2769,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2760,12 +2784,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3205,7 +3230,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3222,6 +3247,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3283,12 +3312,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3302,14 +3329,20 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "निकाला नहीं जा सकता:\n"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
-msgstr ""
+#, fuzzy
+msgid "Error requesting URL:"
+msgstr "लोड होने मे तà¥à¤°à¥à¤Ÿà¤¿:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
@@ -3396,20 +3429,12 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "पसंदीदा:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3445,11 +3470,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3514,6 +3539,11 @@ msgstr "पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿"
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "संसाधन"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3579,6 +3609,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "à¤à¤• नया बनाà¤à¤‚"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3640,6 +3675,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3648,12 +3691,22 @@ msgstr ""
msgid "Invalid group name."
msgstr "गलत फॉणà¥à¤Ÿ का आकार |"
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "ऑडियो बस का नाम बदलें"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "को हटा दें"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3666,12 +3719,13 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
+#, fuzzy
+msgid "Group Editor"
+msgstr "निरà¥à¤­à¤°à¤¤à¤¾ संपादक"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3878,7 +3932,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4640,10 +4694,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4656,14 +4706,43 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "निकाला नहीं जा सकता:\n"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4741,8 +4820,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4763,7 +4845,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4775,6 +4857,11 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "खोज कर:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4935,6 +5022,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ परिणत"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4965,6 +5057,7 @@ msgid "Zoom Reset"
msgstr "छोटा करो"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4985,14 +5078,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -5016,6 +5112,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5032,11 +5129,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5049,6 +5141,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5258,16 +5355,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5582,14 +5669,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5673,19 +5752,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't contain geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6017,7 +6100,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6124,11 +6206,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6157,7 +6235,7 @@ msgid "Error Importing"
msgstr "लोड होने मे तà¥à¤°à¥à¤Ÿà¤¿:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6240,6 +6318,11 @@ msgid "Open..."
msgstr "खोलो इसे"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "निरà¥à¤­à¤°à¤¤à¤¾ संपादक"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6277,11 +6360,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6370,6 +6453,10 @@ msgstr ""
msgid "Search Results"
msgstr "खोज कर:"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6441,6 +6528,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6476,92 +6564,97 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
+msgid "Fold/Unfold Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
+msgid "Fold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
+msgid "Unfold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
+msgid "Clone Down"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
+msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "डà¥à¤ªà¥à¤²à¤¿à¤•ेट चयन"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
+msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6800,7 +6893,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6854,7 +6947,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6865,27 +6958,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6929,22 +7002,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6999,7 +7056,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7302,10 +7359,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7392,11 +7445,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7516,8 +7569,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7815,6 +7868,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7897,6 +7954,11 @@ msgid "Duplicate Nodes"
msgstr "पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "को हटा दें"
@@ -7906,10 +7968,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7923,6 +7981,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "à¤à¤• नया बनाà¤à¤‚"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "à¤à¤• नया बनाà¤à¤‚"
@@ -8283,7 +8346,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8292,7 +8355,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8456,6 +8519,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8481,7 +8548,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8490,7 +8557,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8499,14 +8566,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8551,6 +8618,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8758,6 +8832,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8907,6 +8985,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8976,8 +9062,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8997,8 +9083,9 @@ msgid "Project Manager"
msgstr "पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ मैनेजर"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "परियोजना के संसà¥à¤¥à¤¾à¤ªà¤•"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9022,10 +9109,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9361,6 +9444,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9413,14 +9500,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9709,6 +9788,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9830,19 +9913,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9936,6 +10019,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10126,6 +10213,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10539,10 +10630,29 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "à¤à¤• नया बनाà¤à¤‚"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "à¤à¤• नया बनाà¤à¤‚"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10727,10 +10837,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11467,22 +11573,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "गलत फॉणà¥à¤Ÿ का आकार |"
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11518,6 +11608,9 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "Invalid font size."
+#~ msgstr "गलत फॉणà¥à¤Ÿ का आकार |"
+
#, fuzzy
#~ msgid "Create C# solution"
#~ msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
diff --git a/editor/translations/hr.po b/editor/translations/hr.po
index 606f7b021f..b9d3494ea2 100644
--- a/editor/translations/hr.po
+++ b/editor/translations/hr.po
@@ -58,7 +58,6 @@ msgid "On call to '%s':"
msgstr "Pri pozivu '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr ""
@@ -634,15 +633,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -867,8 +866,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -962,7 +960,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -998,7 +996,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1087,14 +1085,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1111,7 +1109,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1594,12 +1592,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -1989,6 +1986,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2285,6 +2286,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2378,6 +2387,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2462,20 +2475,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2508,24 +2517,32 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2605,12 +2622,12 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
msgstr ""
#: editor/editor_node.cpp
@@ -2646,14 +2663,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2661,12 +2678,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3104,7 +3122,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3121,6 +3139,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3182,12 +3204,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3201,13 +3221,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3292,19 +3316,11 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3337,11 +3353,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3400,6 +3416,10 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3463,6 +3483,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Stvori"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3523,6 +3548,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3530,12 +3563,20 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Delete Group"
+msgstr ""
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3548,11 +3589,11 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
+msgid "Group Editor"
msgstr ""
#: editor/groups_editor.cpp
@@ -3759,7 +3800,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4501,10 +4542,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4517,14 +4554,42 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4601,8 +4666,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4623,7 +4691,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4635,6 +4703,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4790,6 +4862,10 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4818,6 +4894,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4838,14 +4915,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -4869,6 +4949,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4885,11 +4966,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4902,6 +4978,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5109,16 +5190,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5433,14 +5504,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5524,19 +5587,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5864,7 +5931,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -5970,11 +6036,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5998,7 +6060,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6079,6 +6141,10 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6116,11 +6182,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6208,6 +6274,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6274,6 +6344,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6308,92 +6379,96 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
+msgid "Fold/Unfold Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
+msgid "Fold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
+msgid "Unfold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
+msgid "Clone Down"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
+msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
+msgid "Evaluate Selection"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
+msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
+msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6631,7 +6706,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6685,7 +6760,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6696,27 +6771,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6760,22 +6815,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6830,7 +6869,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7123,10 +7162,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7211,11 +7246,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7333,8 +7368,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7616,6 +7651,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7693,15 +7732,16 @@ msgid "Duplicate Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Delete Nodes"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Visual Shader Input Type Changed"
+msgid "Delete Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
+msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7717,6 +7757,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8075,7 +8119,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8084,7 +8128,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8243,6 +8287,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8268,7 +8316,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8277,7 +8325,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8286,14 +8334,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8338,6 +8386,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8545,6 +8600,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8691,6 +8750,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8760,8 +8827,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8781,7 +8848,7 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
+msgid "Projects"
msgstr ""
#: editor/project_manager.cpp
@@ -8805,10 +8872,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9142,6 +9205,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9194,14 +9261,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9487,6 +9546,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9604,19 +9667,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9709,6 +9772,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -9897,6 +9964,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10307,10 +10378,26 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10495,10 +10582,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11228,22 +11311,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
diff --git a/editor/translations/hu.po b/editor/translations/hu.po
index ac339ff977..4a2ef407d4 100644
--- a/editor/translations/hu.po
+++ b/editor/translations/hu.po
@@ -67,7 +67,6 @@ msgid "On call to '%s':"
msgstr "'%s' hívásánál:"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Ingyenes"
@@ -680,17 +679,18 @@ msgid "Line Number:"
msgstr "Sor Száma:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "Lecserélve %d előfordulás."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+#, fuzzy
+msgid "%d matches."
msgstr "Nincs Találat"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Lecserélve %d előfordulás."
-
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Pontos Egyezés"
@@ -929,8 +929,7 @@ msgstr "Kedvencek:"
msgid "Recent:"
msgstr "Legutóbbi:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1033,7 +1032,7 @@ msgstr ""
"Az eltávolítandó fájlokat szükségelik más források a működésükhöz.\n"
"Eltávolítja őket ennek ellenére? (nem visszavonható)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Nem eltávolítható:"
@@ -1071,7 +1070,7 @@ msgstr "Véglegesen törlöl %d elemet? (Nem visszavonható!)"
msgid "Show Dependencies"
msgstr "Függőségek"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Ãrva Forrás KezelÅ‘"
@@ -1160,14 +1159,16 @@ msgid "License"
msgstr "Licenc"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Harmadik Fél Engedély"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"A Godot Engine több harmadik fél ingyenes és nyílt forráskódú könyvtáraira "
@@ -1188,7 +1189,8 @@ msgid "Licenses"
msgstr "Licencek"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Hiba a csomagfájl megnyitása során, nem zip formátumú."
#: editor/editor_asset_installer.cpp
@@ -1697,12 +1699,11 @@ msgid "New"
msgstr "Új"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importálás"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Exportálás"
@@ -2136,6 +2137,10 @@ msgstr "Töröl"
msgid "Clear Output"
msgstr "Kimenet Törlése"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Projekt export nem sikerült, hibakód %d."
@@ -2463,6 +2468,15 @@ msgid "Pick a Main Scene"
msgstr "Válasszon egy Fő Jelenetet"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Scene bezárás"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Scene bezárás"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Nem sikerült az addon plugin engedélyezése itt: '%s' a konfiguráció elemzése "
@@ -2585,6 +2599,11 @@ msgstr "Scene futtatás"
msgid "Close Tab"
msgstr "A Többi Lap Bezárása"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "A Többi Lap Bezárása"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "A Többi Lap Bezárása"
@@ -2671,6 +2690,10 @@ msgstr "Új örökölt Jelenet..."
msgid "Open Scene..."
msgstr "Jelenet megnyitása..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Legutóbbi Megnyitása"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Scene mentés"
@@ -2681,14 +2704,6 @@ msgid "Save All Scenes"
msgstr "Minden Scene mentés"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Scene bezárás"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Legutóbbi Megnyitása"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Ãtkonvertálás..."
@@ -2718,26 +2733,37 @@ msgstr "Scene visszaállítás"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Egyéb projekt- vagy Scene-szintű eszközök."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Projekt"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Projekt Beállítások"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Eszközök"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Exportálás"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "Megnyitja a Projektkezelőt?"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Eszközök"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Ãrva Forrás KezelÅ‘"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2836,12 +2862,13 @@ msgstr ""
"Ha egy távoli eszközön használja, sokkal hatékonyabb a hálózati "
"fájlrendszerrel együtt."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Szerkesztő"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Szerkesztő Beállítások"
#: editor/editor_node.cpp
@@ -2883,14 +2910,15 @@ msgstr "Szerkesztő Beállítások"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "Export Sablonok Kezelése"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Export Sablonok Kezelése"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Súgó"
@@ -2898,12 +2926,13 @@ msgstr "Súgó"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Keresés"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Online Dokumentáció"
@@ -3357,7 +3386,8 @@ msgid "Import From Node:"
msgstr "Importálás Node-ból:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Letöltés Megint"
#: editor/export_template_manager.cpp
@@ -3374,6 +3404,10 @@ msgid "Download"
msgstr "Letöltés"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Hiányzik)"
@@ -3438,12 +3472,10 @@ msgid "No response."
msgstr "Nincs válasz."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Kérés Sikertelen."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Ãtirányítási Hurok."
@@ -3457,13 +3489,19 @@ msgid "Download Complete."
msgstr "A Letöltés Befejeződött."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Nem eltávolítható:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Hiba történt az url lekérdezésekor: "
#: editor/export_template_manager.cpp
@@ -3551,22 +3589,12 @@ msgstr "Sablonok Letöltése"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Válasszon tükröt a listából: "
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Nem lehet megnyitni a file_type_cache.cch fájlt írásra, a fájltípus "
-"gyorsítótár nem lesz mentve!"
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "Kedvencek:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "Nem lehet '%s'-t elérni, mivel nem létezik a fájlrendszerben!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Ãllapot: Fájl importálása sikertelen. Javítsa a fájlt majd importálja be "
@@ -3602,14 +3630,14 @@ msgid "Provided name contains invalid characters."
msgstr "A megadott név érvénytelen karaktereket tartalmaz"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "A név érvénytelen karaktereket tartalmaz."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Egy fájl vagy mappa már létezik a megadott névvel."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "A név érvénytelen karaktereket tartalmaz."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Fájl átnevezése:"
@@ -3669,6 +3697,11 @@ msgstr "Megkettőzés..."
msgid "Move To..."
msgstr "Ãthelyezés..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Új Scene"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3743,6 +3776,11 @@ msgstr "Egy fájl vagy mappa már létezik a megadott névvel."
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Scene mentés"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Szkript Létrehozása"
@@ -3812,6 +3850,14 @@ msgid "Search complete"
msgstr "Keresés a Szövegben"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Hozzáadás Csoporthoz"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Eltávolítás Csoportból"
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "HIBA: Animáció név már létezik!"
@@ -3821,13 +3867,23 @@ msgstr "HIBA: Animáció név már létezik!"
msgid "Invalid group name."
msgstr "Érvénytelen név."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Csoportok"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Elrendezés Törlése"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Csoportok"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr "Hozzáadás Csoporthoz"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3841,12 +3897,13 @@ msgid "Nodes in Group"
msgstr "Hozzáadás Csoporthoz"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Hozzáadás Csoporthoz"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Eltávolítás Csoportból"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Szkript Szerkesztő Megnyitása"
#: editor/groups_editor.cpp
#, fuzzy
@@ -4058,7 +4115,8 @@ msgid "MultiNode Set"
msgstr "MultiNode Beállítás"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Válasszon ki egy Node-ot a Jelzések és Csoportok módosításához."
#: editor/plugin_config_dialog.cpp
@@ -4859,10 +4917,6 @@ msgid "View Files"
msgstr "Fájlok Megtekintése"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "A gazdagép neve nem oldható meg:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Kapcsolat hiba, kérjük próbálja meg újra."
@@ -4875,14 +4929,47 @@ msgid "No response from host:"
msgstr "Nincs válasz a kiszolgálótól:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "A gazdagép neve nem oldható meg:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Kérés sikertelen, visszatérési kód:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Kérés Sikertelen."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Nem eltávolítható:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Kérés sikertelen, túl sok átirányítás"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Ãtirányítási Hurok."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Kérés sikertelen, visszatérési kód:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Idő"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
"Rossz letöltési hash, a program feltételezi, hogy a fájlt rosszindulatilag "
@@ -4966,8 +5053,13 @@ msgid "All"
msgstr "Mind"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Importálás"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Bővítmények"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4989,7 +5081,8 @@ msgid "Site:"
msgstr "Oldal:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Támogatás..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -5001,6 +5094,11 @@ msgid "Testing"
msgstr "Tesztelés"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Betöltés"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Eszköz ZIP Fájl"
@@ -5181,6 +5279,11 @@ msgstr "Póz Beillesztése"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "Póz Törlése"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Kibocsátási Pontok Létrehozása A Mesh Alapján"
@@ -5211,6 +5314,7 @@ msgid "Zoom Reset"
msgstr "Kicsinyítés"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Kiválasztó Mód"
@@ -5233,14 +5337,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt + Jobb Egérgomb: Mélységi lista választás"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Mozgás Mód"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Forgató mód"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "Kiválasztó Mód"
@@ -5268,6 +5375,7 @@ msgid "Toggle snapping."
msgstr "Illesztés be- és kikapcsolása"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Illesztés Használata"
@@ -5286,11 +5394,6 @@ msgid "Use Rotation Snap"
msgstr "Forgatási Illesztés Használata"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Illesztés Beállítása..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Relatív Illesztés"
@@ -5304,6 +5407,11 @@ msgid "Smart Snapping"
msgstr "Intelligens illesztés"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Illesztés Beállítása..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
msgstr "Illesztés szülőhöz"
@@ -5526,16 +5634,6 @@ msgstr "Fogantyú Beállítása"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Hiba a kép betöltésekor:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Nem létezik egyetlen pixel sem >128-as átlátszósággal a képben..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Kibocsátási Maszk Betöltése"
@@ -5860,14 +5958,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Felületi forrás érvénytelen (nincsenek oldalak)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "A szülőnek nincsenek kitölthető szilárd oldalai."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "A területet nem lehetett leképezni."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Válasszon Ki Egy Forrás Mesh-t:"
@@ -5953,20 +6043,27 @@ msgid "Generation Time (sec):"
msgstr "Generálási Idő (mp):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Az oldalak nem tartalmaznak területet!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "A Node nem tartalmaz geometriát (oldalakat)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Nincsenek oldalak!"
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "A Node nem tartalmaz geometriát."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "A Node nem tartalmaz geometriát (oldalakat)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "A Node nem tartalmaz geometriát."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6308,7 +6405,6 @@ msgid "Grid Settings"
msgstr "Szerkesztő Beállítások"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Illesztés"
@@ -6423,12 +6519,7 @@ msgstr "Hiba TileSet mentésekor!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "Nem sikerült létrehozni a mappát."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "Nem sikerült létrehozni a mappát."
#: editor/plugins/script_editor_plugin.cpp
@@ -6458,7 +6549,7 @@ msgstr "Hiba importáláskor"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "Új Mappa..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6545,6 +6636,11 @@ msgid "Open..."
msgstr "Megnyit"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Szkript Futtatása"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Összes Mentése"
@@ -6584,13 +6680,13 @@ msgid "Save Theme"
msgstr "Téma Mentése"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Dokumentációs Lapok Bezárása"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Mind Bezárása"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Dokumentációs Lapok Bezárása"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Futtatás"
@@ -6681,6 +6777,11 @@ msgstr "Hibakereső"
msgid "Search Results"
msgstr "Keresés Súgóban"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Legutóbbi Jelenetek Törlése"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6754,6 +6855,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6789,26 +6891,6 @@ msgid "Toggle Comment"
msgstr "Ãtváltás Megjegyzésre"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Töréspont Elhelyezése"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Ugrás Következő Töréspontra"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Ugrás Előző Töréspontra"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Összes Töréspont Eltávolítása"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Sor Összezárása / Kibontása"
@@ -6829,6 +6911,11 @@ msgid "Complete Symbol"
msgstr "Szimbólum Befejezése"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Kiválasztás átméretezés"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Sorvégi Szóközök Lenyírása"
@@ -6847,32 +6934,37 @@ msgid "Auto Indent"
msgstr "Automatikus Behúzás"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Töréspont Elhelyezése"
+msgid "Find Previous"
+msgstr "Előző Keresése"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Összes Töréspont Eltávolítása"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Fájlok Szűrése..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "Kontextusérzékeny Súgó"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "Ugrás Következő Töréspontra"
+msgid "Toggle Bookmark"
+msgstr "Töréspont Elhelyezése"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "Ugrás Előző Töréspontra"
+msgid "Go to Next Bookmark"
+msgstr "Ugrás Következő Töréspontra"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Előző Keresése"
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Ugrás Előző Töréspontra"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Fájlok Szűrése..."
+msgid "Remove All Bookmarks"
+msgstr "Összes Töréspont Eltávolítása"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6885,8 +6977,23 @@ msgid "Go to Line..."
msgstr "Ugrás Sorra..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Kontextusérzékeny Súgó"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Töréspont Elhelyezése"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Összes Töréspont Eltávolítása"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Ugrás Következő Töréspontra"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Ugrás Előző Töréspontra"
#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
@@ -7131,8 +7238,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Doppler engedélyezése"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Animáció hossz változtatás"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7187,7 +7295,7 @@ msgid "Snap Nodes To Floor"
msgstr "Rácshoz illesztés"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7198,27 +7306,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7262,22 +7350,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -7333,8 +7405,9 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
-msgstr ""
+#, fuzzy
+msgid "Settings..."
+msgstr "Szerkesztő Beállítások"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7645,10 +7718,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7738,12 +7807,12 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "%d elem"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "%d elem"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7867,8 +7936,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8186,6 +8255,10 @@ msgid "TileSet"
msgstr "TileSet-re..."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Bemenet Hozzáadása"
@@ -8277,6 +8350,11 @@ msgid "Duplicate Nodes"
msgstr "Animáció kulcsok megkettőzése"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Node létrehozás"
@@ -8286,10 +8364,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -8303,6 +8377,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Node létrehozás"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Node létrehozás"
@@ -8671,7 +8750,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8680,7 +8759,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8846,6 +8925,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8871,7 +8954,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8880,7 +8963,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8889,14 +8972,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8943,6 +9026,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9159,6 +9249,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Export Sablonok Kezelése"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9306,6 +9400,15 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "Meglévő Projekt Importálása"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "'%s' nem nyitható meg."
@@ -9379,8 +9482,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9400,8 +9503,9 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "Projekt"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9425,10 +9529,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9767,6 +9867,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Bővítmények"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9819,14 +9923,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10129,6 +10225,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10256,19 +10356,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10366,6 +10466,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10563,6 +10667,10 @@ msgid "Change Shortcut"
msgstr "Horgonyok Módosítása"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Szerkesztő Beállítások"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10986,10 +11094,30 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Érvénytelen név. Nem ütközhet egy már meglévő beépített típusnévvel."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Új %s Létrehozása"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Új %s Létrehozása"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Új sokszög létrehozása a semmiből."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -11177,10 +11305,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "Tagok"
@@ -11929,22 +12053,6 @@ msgstr ""
"gyermekévé, hogy így kapjon méretet. Ellenkező esetben tegye RenderTarget-"
"té, és állítsa hozzá a belső textúráját valamilyen node-hoz kirajzolásra."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "FreeType inicializálási hiba."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Ismeretlen betűtípus formátum."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Hiba a betűtípus betöltésekor."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Érvénytelen betűtípus méret."
-
#: scene/resources/visual_shader.cpp
#, fuzzy
msgid "Input"
@@ -11981,6 +12089,52 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Nem lehet megnyitni a file_type_cache.cch fájlt írásra, a fájltípus "
+#~ "gyorsítótár nem lesz mentve!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "Nem lehet '%s'-t elérni, mivel nem létezik a fájlrendszerben!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Hiba a kép betöltésekor:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Nem létezik egyetlen pixel sem >128-as átlátszósággal a képben..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "A szülőnek nincsenek kitölthető szilárd oldalai."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "A területet nem lehetett leképezni."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Az oldalak nem tartalmaznak területet!"
+
+#~ msgid "No faces!"
+#~ msgstr "Nincsenek oldalak!"
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "Nem sikerült létrehozni a mappát."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Doppler engedélyezése"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "FreeType inicializálási hiba."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Ismeretlen betűtípus formátum."
+
+#~ msgid "Error loading font."
+#~ msgstr "Hiba a betűtípus betöltésekor."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Érvénytelen betűtípus méret."
+
#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "Előző Sík"
diff --git a/editor/translations/id.po b/editor/translations/id.po
index 7048f501b5..580631d6bc 100644
--- a/editor/translations/id.po
+++ b/editor/translations/id.po
@@ -20,11 +20,12 @@
# Alphin Albukhari <alphinalbukhari5@gmail.com>, 2019.
# I Dewa Agung Adhinata <agungnata2003@gmail.com>, 2019.
# herri siagian <herry.it.2007@gmail.com>, 2019.
+# MonsterGila <fikrirazor@outlook.co.id>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-19 13:42+0000\n"
+"PO-Revision-Date: 2019-08-29 13:35+0000\n"
"Last-Translator: Sofyan Sugianto <sofyanartem@gmail.com>\n"
"Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/"
"godot/id/>\n"
@@ -33,7 +34,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -77,7 +78,6 @@ msgid "On call to '%s':"
msgstr "Pada pemanggilan '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Bebaskan"
@@ -146,29 +146,24 @@ msgid "Anim Change Call"
msgstr "Ubah Panggilan Anim"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Ubah Waktu Keyframe Animasi"
+msgstr "Ubah Beberapa Waktu Keyframe Animasi"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Ubah Transisi Animasi"
+msgstr "Ubah Beberapa Transisi Animasi"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Ubah Transformasi Animasi"
+msgstr "Ubah Beberapa Transformasi Animasi"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Ubah Nilai Keyframe Animasi"
+msgstr "Ubah Beberapa Nilai Keyframe Animasi"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "Ubah Panggilan Anim"
+msgstr "Ubah Beberapa Panggilan Animasi"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -671,16 +666,18 @@ msgid "Line Number:"
msgstr "Nomor Baris:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "Ditemukan %d kecocokan."
+msgid "Replaced %d occurrence(s)."
+msgstr "kejadian %d diganti."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Tidak ada yang cocok"
+#, fuzzy
+msgid "%d match."
+msgstr "Ditemukan %d kecocokan."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "kejadian %d diganti."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Ditemukan %d kecocokan."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -906,8 +903,7 @@ msgstr "Favorit:"
msgid "Recent:"
msgstr "Saat ini:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1008,7 +1004,7 @@ msgstr ""
"bekerja.\n"
"Hapus saja? (tidak bisa dibatalkan/undo)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Tidak bisa menghapus:"
@@ -1044,7 +1040,7 @@ msgstr "Hapus secara permanen %d item? (Tidak dapat dikembalikan!)"
msgid "Show Dependencies"
msgstr "Tampilkan Ketergantungan"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Penjelajah Resource Orphan"
@@ -1133,14 +1129,16 @@ msgid "License"
msgstr "Lisensi"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Lisensi Pihak Ketiga"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine mengandalkan sejumlah perpustakaan bebas dan sumber terbuka "
@@ -1161,7 +1159,8 @@ msgid "Licenses"
msgstr "Lisensi"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Gagal saat membuka paket, tidak dalam bentuk zip."
#: editor/editor_asset_installer.cpp
@@ -1654,12 +1653,11 @@ msgid "New"
msgstr "Baru"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Impor"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Ekspor"
@@ -1796,30 +1794,26 @@ msgid "Move Favorite Down"
msgstr "Pindahkan Favorit Kebawah"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Pergi ke direktori atasnya."
+msgstr "Pergi ke direktori sebelumnya."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Pergi ke direktori atasnya."
+msgstr "Pergi ke direktori selanjutnya."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "Pergi ke direktori atasnya."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Cari berkas"
+msgstr "Segarkan berkas."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "Hapus favorit direktori saat ini."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
msgstr "Beralih visibilitas berkas yang tersembunyi."
@@ -2062,6 +2056,10 @@ msgstr "Bersihkan"
msgid "Clear Output"
msgstr "Bersihkan Luaran"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Ekspor proyek gagal dengan kode kesalahan %d."
@@ -2384,6 +2382,15 @@ msgid "Pick a Main Scene"
msgstr "Pilih Skena Utama"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Tutup Skena"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Tutup Skena"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Tidak dapat mengaktifkan addon plugin pada : '%s' parsing dari pengaturan "
@@ -2498,6 +2505,11 @@ msgstr "Mainkan Skena Ini"
msgid "Close Tab"
msgstr "Tutup Tab"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Tutup Tab"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Tutup Tab Lainnya"
@@ -2551,9 +2563,8 @@ msgid "Go to previously opened scene."
msgstr "Pergi ke skena yang sebelumnya dibuka."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "Salin Lokasi"
+msgstr "Salin Teks"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2583,6 +2594,10 @@ msgstr "Skena Warisan Baru..."
msgid "Open Scene..."
msgstr "Buka Skena..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Buka baru-baru ini"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Simpan Skena"
@@ -2592,14 +2607,6 @@ msgid "Save All Scenes"
msgstr "Simpan Semua Skena"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Tutup Skena"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Buka baru-baru ini"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Ubah ke..."
@@ -2629,25 +2636,37 @@ msgstr "Kembalikan Skena"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Perkakas macam-macam proyek atau lingkup skena."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Proyek"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Pengaturan Proyek"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Alat-alat"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Ekspor"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Pasang Templat Build Android"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Buka Project Data Manager"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Alat-alat"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Pasang Templat Build Android"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Penjelajah Resource Orphan"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2745,12 +2764,13 @@ msgstr ""
"Ketika penggunaan remote pada sebuah perngakat, akan lebih efisien jika "
"jaringan filesystem."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Editor"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Pengaturan Editor"
#: editor/editor_node.cpp
@@ -2786,14 +2806,16 @@ msgid "Open Editor Settings Folder"
msgstr "Buka Penyunting Direktori Pengaturan"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "Kelola Penyunting Fitur"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Mengatur Templat Ekspor"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Bantuan"
@@ -2801,12 +2823,13 @@ msgstr "Bantuan"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Cari"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Online Dokumentasi"
@@ -3084,9 +3107,8 @@ msgid "Calls"
msgstr "Panggil"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Sunting tema..."
+msgstr "Sunting Teks:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3260,7 +3282,8 @@ msgid "Import From Node:"
msgstr "Impor dari Node:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Unduh Ulang"
#: editor/export_template_manager.cpp
@@ -3277,6 +3300,10 @@ msgid "Download"
msgstr "Unduh"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(hilang)"
@@ -3340,12 +3367,10 @@ msgid "No response."
msgstr "Tidak ada respon."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Permintaan Gagal."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Mengalihkan Loop."
@@ -3359,15 +3384,22 @@ msgid "Download Complete."
msgstr "Unduhan Selesai."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Tidak dapat menyimpan tema ke dalam berkas:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Instalasi templat gagal. Arsip templat yang bermasalah dapat ditemukan di "
"'%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Kesalahan saat meminta url: "
#: editor/export_template_manager.cpp
@@ -3453,22 +3485,11 @@ msgstr "Unduh Templat"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Pilih cermin dari daftar: (Shift+Click: Buka di Peramban)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Tidak dapat membuka file_type_cache.cch untuk menulis, berkas cache tidak "
-"disimpan!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Favorit"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"'%s' tidak bisa ditelusuri karena tidak bisa ditemukan dalam berkas sistem!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Status: Gagal mengimpor berkas. Mohon perbaiki berkas dan impor ulang secara "
@@ -3503,14 +3524,14 @@ msgid "Provided name contains invalid characters."
msgstr "Nama yang dimasukkan mengandung karakter tidak valid."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Nama mengandung karakter tidak valid."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Sudah ada nama berkas atau folder seperti itu."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Nama mengandung karakter tidak valid."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Mengubah nama berkas dengan:"
@@ -3566,6 +3587,11 @@ msgstr "Gandakan..."
msgid "Move To..."
msgstr "Pindahkan ke..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Skena Baru"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Skrip Baru..."
@@ -3632,6 +3658,11 @@ msgstr "Sudah ada nama berkas atau folder seperti itu di lokasi ini."
msgid "Overwrite"
msgstr "Timpa"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Buat dari Skena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Buat Script"
@@ -3694,6 +3725,14 @@ msgid "Search complete"
msgstr "Pencarian selesai"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Tambahkan ke Grup"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Hapus dari Grup"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Nama grup sudah ada."
@@ -3701,12 +3740,23 @@ msgstr "Nama grup sudah ada."
msgid "Invalid group name."
msgstr "Nama grup tidak valid."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Kelola Grup"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Hapus Penampilan"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Kelompok"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Node tidak dalam Grup"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3719,12 +3769,13 @@ msgid "Nodes in Group"
msgstr "Node dalam Grup"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Tambahkan ke Grup"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Hapus dari Grup"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Penyunting Skrip"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3933,7 +3984,8 @@ msgid "MultiNode Set"
msgstr "Set MultiNode"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Pilih sebuah node untuk menyunting Sinyal dan Grup."
#: editor/plugin_config_dialog.cpp
@@ -4689,10 +4741,6 @@ msgid "View Files"
msgstr "Tampilkan Berkas"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Tidak dapat menjelaskan hostname:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Gangguan koneksi, silakan coba lagi."
@@ -4705,14 +4753,47 @@ msgid "No response from host:"
msgstr "Tidak ada respon dari host:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Tidak dapat menjelaskan hostname:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Permintaan gagal, return code:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Permintaan Gagal."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Tidak dapat menyimpan tema ke dalam berkas:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Permintaan gagal, terlalu banyak pengalihan"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Mengalihkan Loop."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Permintaan gagal, return code:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Waktu"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Hash unduhan buruk, berkas mungkin telah diubah."
@@ -4753,9 +4834,8 @@ msgid "Idle"
msgstr "Menganggur"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "Pasang"
+msgstr "Pasang..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -4790,8 +4870,13 @@ msgid "All"
msgstr "Semua"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Impor Ulang..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Pengaya"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4799,9 +4884,8 @@ msgid "Sort:"
msgstr "Sortir:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Reverse sorting."
-msgstr "Melakukan permintaan..."
+msgstr "Penyortiran terbalik."
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
@@ -4813,7 +4897,8 @@ msgid "Site:"
msgstr "Situs:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Dukungan..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4825,6 +4910,11 @@ msgid "Testing"
msgstr "Menguji"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Muat..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Berkas Aset ZIP"
@@ -4881,39 +4971,32 @@ msgid "Rotation Step:"
msgstr "Jangkah Perputaran:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Vertical Guide"
-msgstr "Pindahkan garis-bantu vertikal"
+msgstr "Pindahkan Panduan Vertikal"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Vertical Guide"
-msgstr "Buat panduan vertikal baru"
+msgstr "Buat Panduan Vertikal"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Vertical Guide"
-msgstr "Hapus panduan vertikal"
+msgstr "Hapus Panduan Vertikal"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Horizontal Guide"
-msgstr "Pindahkan garis-bantu horisontal"
+msgstr "Pindahkan Panduan Horisontal"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal Guide"
-msgstr "Buat panduan horizontal baru"
+msgstr "Buat Panduan Horizontal"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Horizontal Guide"
-msgstr "Hapus panduan horizontal"
+msgstr "Hapus Panduan Horizontal"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal and Vertical Guides"
-msgstr "Buat garis-bantu vertikal dan horisontal baru"
+msgstr "Buat Panduan Horisontal dan Vertikal"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move pivot"
@@ -4996,6 +5079,11 @@ msgid "Paste Pose"
msgstr "Tempel Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Bersihkan Pertulangan"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Buat Tulang Kustom dari Node"
@@ -5026,6 +5114,7 @@ msgid "Zoom Reset"
msgstr "Reset Perbesaran"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Mode Seleksi"
@@ -5047,14 +5136,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+Klik kanan: Daftar seleksi kedalaman"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Mode Pindah"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Mode Putar"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Mode Skala"
@@ -5080,6 +5172,7 @@ msgid "Toggle snapping."
msgstr "Jungkitkan Pengancingan."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Gunakan Snap"
@@ -5096,11 +5189,6 @@ msgid "Use Rotation Snap"
msgstr "Gunakan Snap Rotasi"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Atur Snap..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Snap Relatif"
@@ -5113,6 +5201,11 @@ msgid "Smart Snapping"
msgstr "Pengancingan Pintar"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Atur Snap..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "Kancingkan ke Orangtuanya"
@@ -5272,9 +5365,8 @@ msgid "Divide grid step by 2"
msgstr "Bagi langkah kisi demi 2"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Pan View"
-msgstr "Tampilan Belakang."
+msgstr "Geser Tampilan"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
@@ -5328,16 +5420,6 @@ msgstr "Atur Pegangan"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Galat saat memuat gambar:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Tidak ada piksel dengan transparansi > 128 di dalam gambar..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Muat Masker Emisi"
@@ -5459,7 +5541,7 @@ msgstr "Tahan Shift untuk menyunting tangen kurva satu-persatu"
#: editor/plugins/gi_probe_editor_plugin.cpp
msgid "Bake GI Probe"
-msgstr ""
+msgstr "Panggang GI Probe"
#: editor/plugins/gradient_editor_plugin.cpp
msgid "Gradient Edited"
@@ -5551,7 +5633,6 @@ msgid "Create Outline"
msgstr "Buat Garis Tepi"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Mesh"
msgstr "Jala"
@@ -5560,14 +5641,12 @@ msgid "Create Trimesh Static Body"
msgstr "Buat Tubuh Statis Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Create Trimesh Collision Sibling"
-msgstr "Buat Saudara Tabrakan Trimesh"
+msgstr "Buat Trimesh Collision Sibling"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Create Convex Collision Sibling(s)"
-msgstr "Buat Bidang"
+msgstr "Buat Convex Collision Sibling"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
@@ -5654,14 +5733,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Sumber permukaan tidak valid (tidak ada bidang)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Tidak dapat memetakan area."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Pilih Mesh Sumber:"
@@ -5671,19 +5742,19 @@ msgstr "Pilih Target Permukaan:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate Surface"
-msgstr ""
+msgstr "Isi Permukaan"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate MultiMesh"
-msgstr ""
+msgstr "Isi MultiMesh"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Target Surface:"
-msgstr ""
+msgstr "Permukaan Target:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Source Mesh:"
-msgstr ""
+msgstr "Sumber Mesh:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "X-Axis"
@@ -5715,7 +5786,7 @@ msgstr "Skala Acak:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate"
-msgstr ""
+msgstr "Isi"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -5745,20 +5816,27 @@ msgid "Generation Time (sec):"
msgstr "Waktu Pembuatan (detik):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Bidang tidak memiliki area!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Tidak ada bidang!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Node tidak mengandung geometri (bidang)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Node tidak mengandung geometri."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Node tidak mengandung geometri (bidang)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Node tidak mengandung geometri."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -5885,12 +5963,12 @@ msgstr "Opsi"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "Cermin Pengatur Sudut"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "Cermin Pengatur Panjang"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -6090,7 +6168,6 @@ msgid "Grid Settings"
msgstr "Pengaturan Kisi"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Pengancingan"
@@ -6196,11 +6273,8 @@ msgid "Error writing TextFile:"
msgstr "Galat saat menulis TextFile:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Galat: tidak dapat memuat berkas."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+#, fuzzy
+msgid "Could not load file at:"
msgstr "Galat tidak dapat memuat berkas."
#: editor/plugins/script_editor_plugin.cpp
@@ -6224,7 +6298,8 @@ msgid "Error Importing"
msgstr "Galat saat mengimpor"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Berkas Teks Baru..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6305,6 +6380,11 @@ msgid "Open..."
msgstr "Buka..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Buka Cepat Script..."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Simpan Semua"
@@ -6342,13 +6422,13 @@ msgid "Save Theme"
msgstr "Simpan Tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Tutup Dokumentasi"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Tutup Semua"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Tutup Dokumentasi"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Jalankan"
@@ -6436,6 +6516,11 @@ msgstr "Pengawakutu"
msgid "Search Results"
msgstr "Hasil Pencarian"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Bersihkan Scenes baru-baru ini"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "Hubungan dengan fungsi:"
@@ -6504,6 +6589,7 @@ msgid "Syntax Highlighter"
msgstr "Penyorot Sintaks"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr "Pergi Ke"
@@ -6538,22 +6624,6 @@ msgid "Toggle Comment"
msgstr "Jungkitkan Komentar"
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr "Jungkitkan Markah Buku"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "Pergi ke Markah Buku Berikutnya"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr "Pergi ke Markah Buku Sebelumnya"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "Hapus Semua Markah Buku"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Lipat/Bentangkan Baris"
@@ -6571,7 +6641,12 @@ msgstr "Duplikat ke Bawah"
#: editor/plugins/script_text_editor.cpp
msgid "Complete Symbol"
-msgstr ""
+msgstr "Simbol Lengkap"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Seleksi Skala"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
@@ -6590,29 +6665,32 @@ msgid "Auto Indent"
msgstr "Indentasi Otomatis"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Beralih Breakpoint"
+msgid "Find Previous"
+msgstr "Cari Sebelumnya"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Hapus Semua Titik Jeda"
+msgid "Find in Files..."
+msgstr "Cari Dalam Berkas..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Pergi ke Langkah Jeda Berikutnya"
+msgid "Contextual Help"
+msgstr "Bantuan Kontekstual"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Pergi ke Langkah Jeda Sebelumnya"
+msgid "Toggle Bookmark"
+msgstr "Jungkitkan Markah Buku"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Cari Sebelumnya"
+msgid "Go to Next Bookmark"
+msgstr "Pergi ke Markah Buku Berikutnya"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Cari Dalam Berkas..."
+msgid "Go to Previous Bookmark"
+msgstr "Pergi ke Markah Buku Sebelumnya"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Hapus Semua Markah Buku"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6623,8 +6701,21 @@ msgid "Go to Line..."
msgstr "Pergi ke Baris..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Bantuan Kontekstual"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Beralih Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Hapus Semua Titik Jeda"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Pergi ke Langkah Jeda Berikutnya"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Pergi ke Langkah Jeda Sebelumnya"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -6636,11 +6727,12 @@ msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
msgid "Shader"
-msgstr ""
+msgstr "Shader"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
msgstr ""
+"Kerangka ini tidak memiliki pertulangan, buatlah beberapa anak node Bone2D."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Create Rest Pose from Bones"
@@ -6648,122 +6740,115 @@ msgstr "Buat Pose Istirahat dari Pertulangan"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Rest Pose to Bones"
-msgstr ""
+msgstr "Atur Pose Istirahat ke Pertulangan"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "Singleton"
+msgstr "Skeleton2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "Buat Pose Istirahat (Dari Pertulangan)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "Atur Tulang ke Pose Istirahat"
#: editor/plugins/skeleton_editor_plugin.cpp
msgid "Create physical bones"
-msgstr ""
+msgstr "Buat tulang fisik"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Singleton"
+msgstr "Kerangka"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "Buat Subskribsi"
+msgstr "Buat kerangka fisik"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "Mainkan"
+msgstr "Mainkan IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
-msgstr ""
+msgstr "Ortogonal"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective"
-msgstr ""
+msgstr "Perspektif"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Aborted."
-msgstr ""
+msgstr "Transformasi Dibatalkan."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "X-Axis Transform."
-msgstr ""
+msgstr "Transformasi Sumbu X."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Y-Axis Transform."
-msgstr ""
+msgstr "Transformasi Sumbu Y."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Z-Axis Transform."
-msgstr ""
+msgstr "Transformasi Sumbu Z."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Plane Transform."
-msgstr ""
+msgstr "Tampilkan Transformasi Planar."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scaling: "
-msgstr ""
+msgstr "Penskalaan: "
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Translating: "
-msgstr "Transisi"
+msgstr "Mentranslasi: "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotating %s degrees."
-msgstr ""
+msgstr "Memutar %s derajat."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Keying is disabled (no key inserted)."
-msgstr ""
+msgstr "Penguncian dinonaktifkan (tidak ada kunci yang dimasukkan)."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Animation Key Inserted."
-msgstr ""
+msgstr "Kunci Animasi Dimasukkan."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Pitch"
-msgstr ""
+msgstr "Dongak"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Yaw"
-msgstr ""
+msgstr "Oleng"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
-msgstr ""
+msgstr "Objek Digambar"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Material Changes"
-msgstr "Menyimpan perubahan-perubahan lokal..."
+msgstr "Perubahan Material"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Shader Changes"
-msgstr "Ubah"
+msgstr "Perubahan Shader"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Surface Changes"
-msgstr ""
+msgstr "Perubahan Permukaan"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Draw Calls"
-msgstr ""
+msgstr "Gambarkan Panggilan"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Vertices"
-msgstr ""
+msgstr "Titik"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View."
@@ -6810,132 +6895,125 @@ msgid "Rear"
msgstr "Belakang"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Transform with View"
-msgstr "Tampilan Kanan."
+msgstr "Sejajarkan Transformasi dengan Tampilan"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Rotation with View"
-msgstr "Tampilan Kanan."
+msgstr "Sejajarkan Rotasi dengan Tampilan"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
-msgstr ""
+msgstr "Tidak ada induk untuk menginstance turunan disana."
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "This operation requires a single selected node."
-msgstr ""
+msgstr "Operasi ini membutuhkan satu node yang dipilih."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
-msgstr ""
+msgstr "Kunci Rotasi Tampilan"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
-msgstr ""
+msgstr "Tampilkan Normal"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Wireframe"
-msgstr ""
+msgstr "Tampilkan Jaring-jaring"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Overdraw"
-msgstr ""
+msgstr "Tampilkan Overdraw"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Unshaded"
-msgstr ""
+msgstr "Tampilan Tak Berbayang"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Environment"
-msgstr ""
+msgstr "Tampilkan Lingkungan"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Gizmos"
-msgstr ""
+msgstr "Tampilkan Gizmo"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Information"
-msgstr ""
+msgstr "Tampilkan Informasi"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View FPS"
-msgstr "File:"
+msgstr "Tampilkan FPS"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Half Resolution"
-msgstr "Beri Skala Seleksi"
+msgstr "Setengah Resolusi"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Audio Listener"
-msgstr ""
+msgstr "Listener Audio"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Doppler Enable"
-msgstr "Aktifkan"
+msgid "Enable Doppler"
+msgstr "Aktifkan penyaringan"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "Buat Pratinjau Mesh"
+msgstr "Pratinjau Sinematik"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
-msgstr ""
+msgstr "TampilanBebas Kiri"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Right"
-msgstr ""
+msgstr "TampilanBebas Kanan"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Freelook Forward"
-msgstr "Maju"
+msgstr "TampilanBebas Maju"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Freelook Backwards"
-msgstr "Ke belakang"
+msgstr "TampilanBebas Mundur"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
-msgstr ""
+msgstr "TampilanBebas Atas"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Freelook Down"
-msgstr "Scroll kebawah."
+msgstr "TampilanBebas Bawah"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
-msgstr ""
+msgstr "Pengubah Kecepatan TampilanBebas"
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
+"Catatan: Nilai FPS yang ditampilkan adalah framerate-nya penyunting.\n"
+"Tidak bisa digunakan sebagai indikasi kinerja game yang dapat dihandalkan."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Rotation Locked"
-msgstr ""
+msgstr "Rotasi Tampilan Terkunci"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
-msgstr ""
+msgstr "Dialog XForm"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
-msgstr ""
+msgstr "Kancingkan Node ke Lantai"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Select Mode (Q)"
-msgstr "Metode Publik:"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6943,482 +7021,422 @@ msgid ""
"Alt+Drag: Move\n"
"Alt+RMB: Depth list selection"
msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
+"Seret: Rotasi\n"
+"Alt+Seret: Geser\n"
+"Alt+Klik Kanan: Daftar seleksi mendalam"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Snap Mode (%s)"
-msgstr "Metode Publik:"
+msgid "Use Local Space"
+msgstr "Mode Ruang Lokal (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
-msgstr ""
+msgstr "Tampilan Bawah"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View"
-msgstr ""
+msgstr "Tampilan Atas"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View"
-msgstr ""
+msgstr "Tampilan Belakang"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View"
-msgstr ""
+msgstr "Tampilan Depan"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left View"
-msgstr ""
+msgstr "Tampilan Kiri"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Right View"
-msgstr ""
+msgstr "Tampilan Kanan"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Switch Perspective/Orthogonal View"
-msgstr ""
+msgstr "Beralih Tampilan Ortogonal/Perspektif"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
-msgstr ""
+msgstr "Sisipkan Kunci Animasi"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Origin"
-msgstr ""
+msgstr "Asal Fokus"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Selection"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Tool Select"
-msgstr "Semua pilihan"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
+msgstr "Pemilihan Fokus"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Freelook"
-msgstr "Mode Layar Penuh"
+msgstr "Jungkitkan Mode Tampilan Bebas"
#: editor/plugins/spatial_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform"
-msgstr ""
+msgstr "Transformasi"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Object to Floor"
-msgstr ""
+msgstr "Kancingkan Objek ke Lantai"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
-msgstr ""
+msgstr "Dialog Transformasi..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "1 Viewport"
-msgstr ""
+msgstr "1 Tampilan"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports"
-msgstr ""
+msgstr "2 Tampilan"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports (Alt)"
-msgstr ""
+msgstr "2 Tampilan (Alt)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports"
-msgstr ""
+msgstr "3 Tampilan"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports (Alt)"
-msgstr ""
+msgstr "3 Tampilan (Alt)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "4 Viewports"
-msgstr ""
+msgstr "4 Tampilan"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Gizmos"
-msgstr ""
+msgstr "Gizmo"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
-msgstr ""
+msgstr "Tampilkan Titik Asal"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Grid"
-msgstr ""
+msgstr "Tampilkan Kisi"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
-msgstr ""
+#, fuzzy
+msgid "Settings..."
+msgstr "Pengaturan"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
-msgstr ""
+msgstr "Pengaturan Pengancingan"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translate Snap:"
-msgstr ""
+msgstr "Kancing Translasi:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Snap (deg.):"
-msgstr ""
+msgstr "Kancing Rotasi (derajat):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Snap (%):"
-msgstr ""
+msgstr "Kancing Skala (%):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Viewport Settings"
-msgstr ""
+msgstr "Pengaturan Viewport"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective FOV (deg.):"
-msgstr ""
+msgstr "FOV Perspektif (derajat):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Z-Near:"
-msgstr ""
+msgstr "Tampilan Z-Terdekat:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Z-Far:"
-msgstr ""
+msgstr "Tampilan Z-Terjauh:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Change"
-msgstr ""
+msgstr "Perubahan Transformasi"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translate:"
-msgstr ""
+msgstr "Translasi:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate (deg.):"
-msgstr ""
+msgstr "Rotasi (derajat):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale (ratio):"
-msgstr ""
+msgstr "Skala (rasio):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Type"
-msgstr ""
+msgstr "Jenis Transformasi"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Pre"
-msgstr ""
+msgstr "Sebelum"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Post"
-msgstr ""
+msgstr "Sesudah"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Nameless gizmo"
-msgstr ""
+msgstr "Gizmo tak bernama"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create Mesh2D"
-msgstr "Buat Baru %s"
+msgstr "Buat Mesh2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon2D"
-msgstr "Buat Bidang"
+msgstr "Buat Polygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create CollisionPolygon2D"
-msgstr "Buat Bidang"
+msgstr "Buat CollisionPolygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create LightOccluder2D"
-msgstr "Buat Folder"
+msgstr "Buat LightOccluder2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
-msgstr ""
+msgstr "Sprite kosong!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
-msgstr ""
+msgstr "Tidak dapat mengonversi sprite menggunakan frame animasi menjadi mesh."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "Geometri tidak valid, tidak dapat diganti dengan mesh."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Mesh2D"
-msgstr "Sambungkan Ke Node:"
+msgstr "Konversikan menjadi Mesh2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create polygon."
-msgstr ""
+msgstr "Geometri tidak valid, tidak dapat membuat poligon."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Polygon2D"
-msgstr "Sambungkan Ke Node:"
+msgstr "Konversikan menjadi Polygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create collision polygon."
-msgstr ""
+msgstr "Geometri tidak valid, tidak dapat membuat collision polygon."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create CollisionPolygon2D Sibling"
-msgstr "Buat Bidang"
+msgstr "Buat CollisionPolygon2D Sibling"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create light occluder."
-msgstr ""
+msgstr "Geometri tidak valid, tidak dapat membuat light occluder."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create LightOccluder2D Sibling"
-msgstr ""
+msgstr "Buat LightOccluder2D Sibling"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite"
-msgstr ""
+msgstr "Sprite"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "Penyederhanaan: "
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Grow (Pixels): "
-msgstr ""
+msgstr "Pertumbuhan (Piksel): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "Pratinjau"
+msgstr "Perbarui Pratinjau"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Mengatur..."
+msgstr "Pengaturan:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "No Frames Selected"
-msgstr "Tidak ada berkas dipilih!"
+msgstr "Tidak ada frame yang dipilih"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add %d Frame(s)"
-msgstr ""
+msgstr "Tambah %d Frame"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frame"
-msgstr ""
+msgstr "Tambah Frame"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
-msgstr ""
+msgstr "GALAT: Tidak dapat memuat aset frame!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Resource clipboard is empty or not a texture!"
-msgstr ""
+msgstr "Papan klip sumber daya kosong atau bukan tekstur!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Paste Frame"
-msgstr ""
+msgstr "Rekat Frame"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Empty"
-msgstr ""
+msgstr "Tambah Kosong"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation FPS"
-msgstr ""
+msgstr "Ubah FPS Animasi"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "(empty)"
-msgstr ""
+msgstr "(kosong)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animations:"
-msgstr "Animasi"
+msgstr "Animasi:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "New Animation"
-msgstr "Animasi"
+msgstr "Animasi Baru"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Speed (FPS):"
-msgstr ""
+msgstr "Kecepatan (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Loop"
-msgstr ""
+msgstr "Pengulangan"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animation Frames:"
-msgstr "Nama Animasi:"
+msgstr "Frame Animasi:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add a Texture from File"
-msgstr "Tambahkan Node (Node-node) dari Tree"
+msgstr "Tambah Tekstur dari Berkas"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frames from a Sprite Sheet"
-msgstr ""
+msgstr "Tambah Frame dari Sprite Sheet"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (Before)"
-msgstr ""
+msgstr "Sisipkan Kosong (Sebelum)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (After)"
-msgstr ""
+msgstr "Sisipkan Kosong (Sesudah)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Move (Before)"
-msgstr "Salin Resource"
+msgstr "Geser (Sebelum)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Move (After)"
-msgstr ""
+msgstr "Geser (Sesudah)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select Frames"
-msgstr "Mode Seleksi"
+msgstr "Pilih Frame"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Horizontal:"
-msgstr ""
+msgstr "Horisontal:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Vertical:"
-msgstr ""
+msgstr "Vertikal:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select/Clear All Frames"
-msgstr "Pilih Semua"
+msgstr "Pilih/Hapus Semua Frame"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Create Frames from Sprite Sheet"
-msgstr "Buat dari Tema Editor Saat Ini"
+msgstr "Buat Frame dari Sprite Sheet"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "SpriteFrames"
-msgstr ""
+msgstr "SpriteFrame"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Set Region Rect"
-msgstr ""
+msgstr "Atur Kotak Region"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Set Margin"
-msgstr ""
+msgstr "Atur Batas"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
-msgstr ""
+msgstr "Mode Pengancingan:"
#: editor/plugins/texture_region_editor_plugin.cpp
#: scene/resources/visual_shader.cpp
msgid "None"
-msgstr ""
+msgstr "Tidak ada"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
-msgstr ""
+msgstr "Pengancingan Piksel"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Grid Snap"
-msgstr ""
+msgstr "Pengancingan Kisi"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Auto Slice"
-msgstr ""
+msgstr "Iris Otomatis"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Offset:"
-msgstr ""
+msgstr "Pengimbangan:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Step:"
-msgstr ""
+msgstr "Langkah:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "Pemisah:"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
-msgstr "Penyunting Daerah Tekstur"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
+msgstr "TeksturRegion"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
-msgstr ""
+msgstr "Tambahkan Semua Item"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All"
-msgstr ""
+msgstr "Tambahkan Semua"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Remove All Items"
-msgstr "Hapus Pilihan"
+msgstr "Hapus Semua Item"
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Remove All"
-msgstr "Hapus"
+msgstr "Hapus semua"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Edit Theme"
-msgstr "Sunting tema..."
+msgstr "Sunting Tema"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme editing menu."
@@ -7426,118 +7444,113 @@ msgstr "Menu untuk menyunting tema."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Class Items"
-msgstr ""
+msgstr "Tambah Item Kelas"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove Class Items"
-msgstr ""
+msgstr "Hapus Item Kelas"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create Empty Template"
-msgstr ""
+msgstr "Buat Templat Kosong"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Create Empty Editor Template"
-msgstr "Buat Templat Penyunting Kosongan"
+msgstr "Buat Templat Penyunting Kosong"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Create From Current Editor Theme"
-msgstr "Buat dari Tema Editor Saat Ini"
+msgstr "Buat dari Tema Penyunting Saat Ini"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Button"
-msgstr "Kondisikan Putar Otomatis"
+msgstr "Tombol Jungkit"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled Button"
-msgstr "Dinonaktifkan"
+msgstr "Tombol Dinonaktifkan"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Item"
-msgstr ""
+msgstr "Item"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled Item"
-msgstr "Dinonaktifkan"
+msgstr "Item yang Dinonaktifkan"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Check Item"
-msgstr ""
+msgstr "Item Check"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Checked Item"
-msgstr ""
+msgstr "Item yang Dicentang"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Radio Item"
-msgstr ""
+msgstr "Item Radio"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Checked Radio Item"
-msgstr ""
+msgstr "Item Radio yang Dicentang"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Named Sep."
-msgstr ""
+msgstr "Pemisah yang diberi nama."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Submenu"
-msgstr ""
+msgstr "Submenu"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
-msgstr ""
+#, fuzzy
+msgid "Subitem 1"
+msgstr "Item 1"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
-msgstr ""
+#, fuzzy
+msgid "Subitem 2"
+msgstr "Item 2"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has"
-msgstr ""
+msgstr "Memiliki"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Many"
-msgstr ""
+msgstr "Banyak"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled LineEdit"
-msgstr "Dinonaktifkan"
+msgstr "LineEdit Dinonaktifkan"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Tab 1"
-msgstr ""
+msgstr "Tab 1"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Tab 2"
-msgstr ""
+msgstr "Tab 2"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Tab 3"
-msgstr ""
+msgstr "Tab 3"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Editable Item"
-msgstr "Edit Variabel:"
+msgstr "Item dapat diedit"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Subtree"
-msgstr ""
+msgstr "Subpohon"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has,Many,Options"
-msgstr ""
+msgstr "Memiliki,Banyak,Opsi"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Data Type:"
-msgstr ""
+msgstr "Jenis data:"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Icon"
@@ -7545,11 +7558,11 @@ msgstr "Ikon"
#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Style"
-msgstr ""
+msgstr "Gaya"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Font"
-msgstr ""
+msgstr "Fonta"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Color"
@@ -7560,265 +7573,250 @@ msgid "Constant"
msgstr "Konstan"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Erase Selection"
-msgstr "Beri Skala Seleksi"
+msgstr "Hapus Pilihan"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "Nama tidak sah."
+msgstr "Perbaiki Tile Tidak Valid"
#: editor/plugins/tile_map_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "Beri Skala Seleksi"
+msgstr "Potong Pilihan"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
-msgstr ""
+msgstr "Cat TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Line Draw"
-msgstr "Linier"
+msgstr "Lukis Segaris"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rectangle Paint"
-msgstr ""
+msgstr "Cat Persegi Panjang"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Bucket Fill"
-msgstr ""
+msgstr "Ember Isian"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase TileMap"
-msgstr ""
+msgstr "Hapus TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "Pencarian Selanjutnya"
+msgstr "Cari Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
-msgstr ""
+msgstr "Mengubah urutan"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Disable Autotile"
-msgstr ""
+msgstr "Nonaktifkan Autotile"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Enable Priority"
-msgstr "Sunting Filter"
+msgstr "Aktifkan Prioritas"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr ""
+msgstr "Cat Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
+"Shift + Klik Kanan: Menggambar Garis\n"
+"Shift + Ctrl + Klik Kanan: Cat Persegi Panjang"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr ""
+msgstr "Pilih Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Left"
-msgstr "Mode Putar"
+msgstr "Putar ke Kiri"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Right"
-msgstr "Mode Putar"
+msgstr "Putar ke kanan"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Horizontally"
-msgstr ""
+msgstr "Balik secara Horizontal"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Vertically"
-msgstr ""
+msgstr "Balik secara Vertikal"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear Transform"
-msgstr "Ubah Transformasi Animasi"
+msgstr "Bersihkan Transformasi"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Add Texture(s) to TileSet."
-msgstr "Tambahkan Node (Node-node) dari Tree"
+msgstr "Tambahkan Tekstur ke TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected Texture from TileSet."
-msgstr "Hapus Sinyal"
+msgstr "Hapus Tekstur yang dipilih dari TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
-msgstr ""
+msgstr "Buat dari Skena"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from Scene"
-msgstr ""
+msgstr "Gabung dari Skena"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Next Coordinate"
-msgstr ""
+msgstr "Koordinat berikutnya"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the next shape, subtile, or Tile."
-msgstr ""
+msgstr "Pilih bentuk berikutnya, subtile, atau Tile."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Previous Coordinate"
-msgstr "Tab sebelumnya"
+msgstr "Koordinat Sebelumnya"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the previous shape, subtile, or Tile."
-msgstr ""
+msgstr "Pilih bentuk sebelumnya, subtile, atau Tile."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Region Mode"
-msgstr "Mode Putar"
+msgstr "Mode Wilayah"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Collision Mode"
-msgstr "Mode Interpolasi"
+msgstr "Mode Tabrakan"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Occlusion Mode"
-msgstr "Sunting Bidang"
+msgstr "Mode Oklusi"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation Mode"
-msgstr "Node Animasi"
+msgstr "Mode Navigasi"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Bitmask Mode"
-msgstr "Mode Putar"
+msgstr "Mode Bitmask"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority Mode"
-msgstr "Ekspor Projek"
+msgstr "Mode Prioritas"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Icon Mode"
-msgstr "Mode Geser Pandangan"
+msgstr "Mode Ikon"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Z Index Mode"
-msgstr "Mode Geser Pandangan"
+msgstr "Mode Indeks Z"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Copy bitmask."
-msgstr ""
+msgstr "Salin bitmask."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Paste bitmask."
-msgstr "Tempelkan Animasi"
+msgstr "Rekatkan bitmask."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Erase bitmask."
-msgstr "Beri Skala Seleksi"
+msgstr "Hapus bitmask."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new rectangle."
-msgstr "Buat Baru %s"
+msgstr "Buat persegi panjang baru."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new polygon."
-msgstr "Buat Bidang"
+msgstr "Buat poligon baru."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Keep polygon inside region Rect."
-msgstr ""
+msgstr "Jaga poligon agar tetap di dalam wilayah Rect."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
+"Aktifkan pengancingan dan tampilkan kisi (dapat dikonfigurasi melalui "
+"Inspektur)."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Display Tile Names (Hold Alt Key)"
-msgstr ""
+msgstr "Tampilkan Nama Tile (Tahan Tombol Alt)"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected texture? This will remove all tiles which use it."
-msgstr "Hapus Sinyal"
+msgstr ""
+"Hapus tekstur yang dipilih? Ini akan menghapus semua tile yang "
+"menggunakannya."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "Anda belum memilih tekstur untuk dihapus."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from scene? This will overwrite all current tiles."
-msgstr ""
+msgstr "Buat dari skena? Ini akan menimpa semua tile saat ini."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
-msgstr ""
+msgstr "Gabung dari skena?"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Texture"
-msgstr "Hapus Templat"
+msgstr "Hapus Tekstur"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "%s file(s) were not added because was already on the list."
-msgstr ""
+msgstr "Berkas %s tidak ditambahkan karena sudah ada dalam daftar."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"Seret gagang untuk menyunting Rect.\n"
+"Klik pada Tile lain untuk menyuntingnya."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete selected Rect."
-msgstr "Hapus file yang dipilih?"
+msgstr "Hapus Rect yang dipilih."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr "Simpan sumber yang sedang diatur."
+msgstr ""
+"Pilih sub-tile yang disunting saat ini.\n"
+"Klik pada Tile lain untuk menyuntingnya."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete polygon."
-msgstr "Hapus Titik"
+msgstr "Hapus poligon."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"LMB: Set bit on.\n"
"RMB: Set bit off.\n"
"Shift+LMB: Set wildcard bit.\n"
"Click on another Tile to edit it."
-msgstr "Simpan sumber yang sedang diatur."
+msgstr ""
+"Klik Kiri: Nyalakan bit.\n"
+"Klik Kanan: Matikan bit.\n"
+"Shift + Klik Kiri: Atur bit wildcard.\n"
+"Klik pada Tile lain untuk menyuntingnya."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -7826,686 +7824,680 @@ msgid ""
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
+"Pilih sub-tile untuk digunakan sebagai ikon, sub-tile juga akan digunakan "
+"pada binding autotile yang tidak valid.\n"
+"Klik pada Tile lain untuk menyuntingnya."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
msgstr ""
+"Pilih sub-tile untuk mengubah prioritasnya.\n"
+"Klik pada Tile lain untuk menyuntingnya."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its z index.\n"
"Click on another Tile to edit it."
-msgstr "Simpan sumber yang sedang diatur."
+msgstr ""
+"Pilih sub-tile untuk mengubah nilai index Z-nya.\n"
+"Klik pada Tile lain untuk menyuntingnya."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Set Tile Region"
-msgstr "Penyunting Daerah Tekstur"
+msgstr "Atur Tile Region"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Tile"
-msgstr "Buat Folder"
+msgstr "Buat Tile"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Icon"
-msgstr ""
+msgstr "Atur Ikon Tile"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Tile Bitmask"
-msgstr "Sunting Filter"
+msgstr "Sunting Bitmask Tile"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Collision Polygon"
-msgstr "Sunting poligon yang ada:"
+msgstr "Sunting Poligon Collision"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Occlusion Polygon"
-msgstr "Sunting Bidang"
+msgstr "Sunting Poligon Oklusi"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Navigation Polygon"
-msgstr "Sunting poligon yang ada:"
+msgstr "Sunting Poligon Navigasi"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Paste Tile Bitmask"
-msgstr "Tempelkan Animasi"
+msgstr "Rekatkan Bitmask Tile"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Clear Tile Bitmask"
-msgstr ""
+msgstr "Bersihkan Bitmask Tile"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Make Polygon Concave"
-msgstr ""
+msgstr "Buat Poligon Cekung"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Polygon Convex"
-msgstr "Buat Bidang"
+msgstr "Buat Poligon Cembung"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Tile"
-msgstr "Hapus Templat"
+msgstr "Hapus Tile"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Collision Polygon"
-msgstr "Hapus Bidang dan Titik"
+msgstr "Hapus Poligon Collision"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Occlusion Polygon"
-msgstr "Hapus Autoload"
+msgstr "Hapus Poligon Oklusi"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Navigation Polygon"
-msgstr "Hapus Animasi"
+msgstr "Hapus Poligon Navigasi"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Tile Priority"
-msgstr "Sunting Filter"
+msgstr "Sunting Prioritas Tile"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Z Index"
-msgstr ""
+msgstr "Sunting Index Z Tile"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Collision Polygon"
-msgstr "Buat Bidang"
+msgstr "Buat Poligon Collision"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Occlusion Polygon"
-msgstr "Buat Bidang"
+msgstr "Buat Poligon Oklusi"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr "Properti ini tidak dapat diubah."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "TileSet"
-msgstr "TileSet..."
+msgstr "TileSet"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(Hanya GLES3)"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add input +"
-msgstr "Tambah Masukan"
+msgstr "Tambah masukan +"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add output +"
-msgstr "Tambah Masukan"
+msgstr "Tambah keluaran +"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar"
-msgstr "Skala:"
+msgstr "Skalar"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector"
-msgstr "Inspektur"
+msgstr "Vektor"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean"
-msgstr ""
+msgstr "Boolean"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add input port"
-msgstr "Tambah Masukan"
+msgstr "Tambah port masukan"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add output port"
-msgstr ""
+msgstr "Tambah port keluaran"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port type"
-msgstr "Ubah Tipe Nilai Array"
+msgstr "Ubah jenis port masukan"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change output port type"
-msgstr "Ubah Tipe Nilai Array"
+msgstr "Ubah jenis port keluaran"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port name"
-msgstr "Ubah Nilai Array"
+msgstr "Ubah nama port masukan"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change output port name"
-msgstr "Ubah Nilai Array"
+msgstr "Ubah nama port keluaran"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove input port"
-msgstr "Hapus Sinyal"
+msgstr "Hapus port masukan"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove output port"
-msgstr "Hapus Sinyal"
+msgstr "Hapus port keluaran"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Set expression"
-msgstr "Ubah Pernyataan"
+msgstr "Tetapkan ekspresi"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Resize VisualShader node"
-msgstr "Hapus Variabel"
+msgstr "Atur ulang ukuran node VisualShader"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Uniform Name"
-msgstr ""
+msgstr "Tetapkan Nama Uniform"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Set Input Default Port"
-msgstr "Jadikan Baku untuk '%s'"
+msgstr "Atur Port Masukan Baku"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Node to Visual Shader"
-msgstr ""
+msgstr "Tambah Node ke Visual Shader"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Duplicate Nodes"
-msgstr "Duplikat Key"
+msgstr "Duplikat Node"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
-msgid "Delete Nodes"
-msgstr "Metode Publik:"
+msgid "Paste Nodes"
+msgstr "Path ke Node:"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Visual Shader Input Type Changed"
-msgstr ""
+msgid "Delete Nodes"
+msgstr "Hapus Node"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
+msgid "Visual Shader Input Type Changed"
+msgstr "Tipe Input Visual Shader Berubah"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
-msgstr ""
+msgstr "Titik"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Fragment"
-msgstr "Argumen:"
+msgstr "Fragmen"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "Kanan"
+msgstr "Cahaya"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Buat Node Shader"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
-msgstr "Buat Folder"
+msgstr "Buat Node Shader"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color function."
-msgstr "Tambahkan Fungsi"
+msgstr "Fungsi warna."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
-msgstr ""
+msgstr "Operator warna."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Grayscale function."
-msgstr "Buat Fungsi"
+msgstr "Fungsi grayscale."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts HSV vector to RGB equivalent."
-msgstr ""
+msgstr "Konversikan vektor HSV menjadi setara dengan RGB."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts RGB vector to HSV equivalent."
-msgstr ""
+msgstr "Konversikan vektor RGB menjadi setara HSV."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Sepia function."
-msgstr "Namai kembali Fungsi"
+msgstr "Fungsi sepia."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Burn operator."
-msgstr ""
+msgstr "Operator terbakar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Darken operator."
-msgstr ""
+msgstr "Operator gelapkan."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Difference operator."
-msgstr "Hanya yang berbeda"
+msgstr "Operator perbedaan."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Dodge operator."
-msgstr ""
+msgstr "Operator dodge."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "HardLight operator"
-msgstr ""
+msgstr "Operator HardLight"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Lighten operator."
-msgstr ""
+msgstr "Operator terangkan."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Overlay operator."
-msgstr ""
+msgstr "Operator overlay."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Screen operator."
-msgstr ""
+msgstr "Operator layar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "SoftLight operator."
-msgstr ""
+msgstr "Operator SoftLight."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color constant."
-msgstr "Konstan"
+msgstr "Konstanta warna."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color uniform."
-msgstr "Ubah Transformasi Animasi"
+msgstr "Warna seragam."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
-msgstr ""
+msgstr "Mengembalikan hasil boolean dari perbandingan %s antara dua parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Equal (==)"
-msgstr ""
+msgstr "Sama dengan (==)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than (>)"
-msgstr ""
+msgstr "Lebih Besar Dari (>)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than or Equal (>=)"
-msgstr ""
+msgstr "Lebih Besar dari atau Sama dengan (> =)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided scalars are equal, greater or "
"less."
msgstr ""
+"Mengembalikan vektor terkait jika skalar yang disediakan sama, lebih besar "
+"atau kurang."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF and a scalar "
"parameter."
msgstr ""
+"Mengembalikan hasil boolean dari perbandingan antara INF dan parameter "
+"skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between NaN and a scalar "
"parameter."
msgstr ""
+"Mengembalikan hasil boolean dari perbandingan antara NaN dan parameter "
+"skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
-msgstr ""
+msgstr "Kurang dari (<)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than or Equal (<=)"
-msgstr ""
+msgstr "Kurang dari atau Sama dengan (<=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Not Equal (!=)"
-msgstr ""
+msgstr "Tidak sama dengan (!=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided boolean value is true or false."
msgstr ""
+"Mengembalikan vektor terkait jika nilai boolean yang diberikan benar atau "
+"salah."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the comparison between two parameters."
-msgstr ""
+msgstr "Mengembalikan hasil boolean dari perbandingan antara dua parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF (or NaN) and a "
"scalar parameter."
msgstr ""
+"Mengembalikan hasil boolean dari perbandingan antara INF (atau NaN) dan "
+"parameter skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean constant."
-msgstr ""
+msgstr "Konstanta Boolean."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean uniform."
-msgstr ""
+msgstr "Seragam Boolean."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for all shader modes."
-msgstr ""
+msgstr "Parameter masukan '% s' untuk semua mode shader."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Input parameter."
-msgstr "Snap ke orang-tua"
+msgstr "Parameter masukan."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader modes."
-msgstr ""
+msgstr "Parameter input '%s' untuk mode shader titik dan fragmen."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment and light shader modes."
-msgstr ""
+msgstr "Parameter masukan '%s' untuk mode shader fragmen dan cahaya."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment shader mode."
-msgstr ""
+msgstr "Parameter masukan '%s' untuk mode shader fragmen."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for light shader mode."
-msgstr ""
+msgstr "Parameter masukan '%s' untuk mode shader cahaya."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex shader mode."
-msgstr ""
+msgstr "Parameter masukan '%s' untuk mode shader titik."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader mode."
-msgstr ""
+msgstr "Parameter masukan '%s' untuk mode shader titik dan fragmen."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar function."
-msgstr "Seleksi Skala"
+msgstr "Fungsi skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar operator."
-msgstr ""
+msgstr "Operator skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "E constant (2.718282). Represents the base of the natural logarithm."
-msgstr ""
+msgstr "Konstanta E (2.718282). Mewakili basis dari logaritma natural."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Epsilon constant (0.00001). Smallest possible scalar number."
-msgstr ""
+msgstr "Konstanta Epsilon (0.00001). Angka skalar terkecil yang mungkin."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Phi constant (1.618034). Golden ratio."
-msgstr ""
+msgstr "Konstanta Phi (1.618034). Rasio emas."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/4 constant (0.785398) or 45 degrees."
-msgstr ""
+msgstr "Konstanta Pi/4 (0.785398) atau 45 derajat."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/2 constant (1.570796) or 90 degrees."
-msgstr ""
+msgstr "Konstanta Pi/2 (1.570796) atau 90 derajat."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi constant (3.141593) or 180 degrees."
-msgstr ""
+msgstr "Konstanta pi (3.141593) atau 180 derajat."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Tau constant (6.283185) or 360 degrees."
-msgstr ""
+msgstr "Konstanta Tau (6.283185) atau 360 derajat."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sqrt2 constant (1.414214). Square root of 2."
-msgstr ""
+msgstr "Konstanta Sqrt2 (1.414214). Akar kuadrat dari 2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the absolute value of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai absolut dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-cosine of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai arc-cosinus dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai cosinus hiperbolik invers dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-sine of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai arc-sinus dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic sine of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai sinus hiperbolik invers dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai arc-tangen dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameters."
-msgstr ""
+msgstr "Mengembalikan nilai arc-tangen dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic tangent of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai hiperbolik tangen invers dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Finds the nearest integer that is greater than or equal to the parameter."
msgstr ""
+"Mencari bilangan bulat terdekat yang lebih besar dari atau sama dengan "
+"parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Constrains a value to lie between two further values."
-msgstr ""
+msgstr "Batasi nilai untuk berada di antara dua nilai selanjutnya."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the cosine of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai cosinus dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai cosinus hiperbolik dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
-msgstr ""
+msgstr "Mengubah kuantitas dalam radian menjadi derajat."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-e Exponential."
-msgstr ""
+msgstr "Eksponensial Basis-E."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 Exponential."
-msgstr ""
+msgstr "Eksponensial Basis-2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer less than or equal to the parameter."
msgstr ""
+"Mencari bilangan bulat terdekat kurang dari atau sama dengan parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Computes the fractional part of the argument."
-msgstr ""
+msgstr "Hitung bagian pecahan dari argumen."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse of the square root of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai invers dari akar kuadrat dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Natural logarithm."
-msgstr ""
+msgstr "Logaritma natural."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 logarithm."
-msgstr ""
+msgstr "Logaritma basis-2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the greater of two values."
-msgstr ""
+msgstr "Mengembalikan nilai yang lebih besar dari dua nilai."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the lesser of two values."
-msgstr ""
+msgstr "Mengembalikan nilai terendah dari 2 nilai."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two scalars."
-msgstr ""
+msgstr "Interpolasi linier antara dua skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the opposite value of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai lawan dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - scalar"
-msgstr ""
+msgstr "1.0 - skalar"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the value of the first parameter raised to the power of the second."
msgstr ""
+"Mengembalikan nilai parameter pertama yang dinaikkan ke pangkat parameter "
+"kedua."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in degrees to radians."
-msgstr ""
+msgstr "Mengubah kuantitas dalam derajat ke radian."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / scalar"
-msgstr ""
+msgstr "1.0 / skalar"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer to the parameter."
-msgstr ""
+msgstr "Mencari bilangan bulat terdekat menuju ke parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest even integer to the parameter."
-msgstr ""
+msgstr "Mencari bilangan bulat genap terdekat menuju ke parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
-msgstr ""
+msgstr "Patok nilai antara 0,0 dan 1,0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Extracts the sign of the parameter."
-msgstr ""
+msgstr "Ekstrak tanda parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the sine of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai sinus dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic sine of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai sinus hiperbolik dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the square root of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai akar kuadrat dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"Fungsi SmoothStep( skalar(tepi0), skalar(tepi1), skalar(x) ).\n"
+"\n"
+"Mengembalikan 0.0 jika 'x' lebih kecil dari 'tepi0' dan 1.0 jika x lebih "
+"besar dari 'tepi1'. Jika tidak, nilai balik diinterpolasi antara 0.0 dan 1.0 "
+"menggunakan polinomial Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Fungsi Step( skalar(tepi), skalar(x) ).\n"
+"\n"
+"Mengembalikan nilai 0.0 jika 'x' lebih kecil dari 'tepi' dan sebaliknya 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the tangent of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai tangen dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic tangent of the parameter."
-msgstr ""
+msgstr "Mengembalikan nilai hiperbolik tangen dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the truncated value of the parameter."
-msgstr ""
+msgstr "Mencari nilai terpotong dari parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds scalar to scalar."
-msgstr ""
+msgstr "Menambahkan skalar ke skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides scalar by scalar."
-msgstr ""
+msgstr "Membagi skalar dengan skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies scalar by scalar."
-msgstr ""
+msgstr "Mengalikan skalar dengan skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two scalars."
-msgstr ""
+msgstr "Mengembalikan nilai sisa dari dua skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts scalar from scalar."
-msgstr ""
+msgstr "Kurangi skalar dari skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar constant."
-msgstr ""
+msgstr "Konstanta skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar uniform."
-msgstr "Ubah Transformasi Animasi"
+msgstr "Seragam skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the cubic texture lookup."
-msgstr ""
+msgstr "Lakukan pencarian tekstur kubik."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the texture lookup."
-msgstr ""
+msgstr "Lakukan pencarian tekstur."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Cubic texture uniform lookup."
-msgstr "Format Tekstur"
+msgstr "Pencarian seragam tekstur kubik."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "2D texture uniform lookup."
-msgstr "Format Tekstur"
+msgstr "Pencarian seragam tekstur 2D."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "2D texture uniform lookup with triplanar."
-msgstr "Format Tekstur"
+msgstr "Pencarian seragam tekstur 2D dengan triplanar."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform function."
-msgstr "Buat Bidang"
+msgstr "Fungsi Transformasi."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8517,73 +8509,77 @@ msgid ""
"whose number of rows is the number of components in 'c' and whose number of "
"columns is the number of components in 'r'."
msgstr ""
+"Menghitung produk terluar dari sepasang vektor.\n"
+"\n"
+"OuterProduct memperlakukan parameter pertama 'c' sebagai vektor kolom "
+"(matriks dengan satu kolom) dan parameter kedua 'r' sebagai vektor baris "
+"(matriks dengan satu baris) dan melakukan perkalian matriks aljabar linier "
+"'c * r', menghasilkan matriks yang banyak barisnya adalah banyak komponen "
+"dalam 'c' dan yang banyak kolomnya adalah banyak komponen dalam 'r'."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes transform from four vectors."
-msgstr ""
+msgstr "Menyusun transformasi dari empat vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes transform to four vectors."
-msgstr ""
+msgstr "Mengurai transformasi menjadi empat vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the determinant of a transform."
-msgstr ""
+msgstr "Menghitung determinan dari transformasi."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the inverse of a transform."
-msgstr ""
+msgstr "Menghitung invers transformasi."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the transpose of a transform."
-msgstr ""
+msgstr "Menghitung transpos transformasi."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies transform by transform."
-msgstr ""
+msgstr "Mengalikan transformasi dengan transformasi."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by transform."
-msgstr ""
+msgstr "Mengalikan vektor dengan transformasi."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform constant."
-msgstr "Buat Bidang"
+msgstr "Konstanta Transformasi."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform uniform."
-msgstr "Buat Bidang"
+msgstr "Seragam Transformasi."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector function."
-msgstr "Hapus Fungsi"
+msgstr "Fungsi vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector operator."
-msgstr ""
+msgstr "Operator vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes vector from three scalars."
-msgstr ""
+msgstr "Menyusun vektor dari tiga skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes vector to three scalars."
-msgstr ""
+msgstr "Mengurai vektor menjadi tiga skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the cross product of two vectors."
-msgstr ""
+msgstr "Menghitung cross product dari dua vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the distance between two points."
-msgstr ""
+msgstr "Mengembalikan jarak antara dua titik."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the dot product of two vectors."
-msgstr ""
+msgstr "Menghitung dot product dari dua vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8592,96 +8588,128 @@ msgid ""
"incident vector, and Nref, the reference vector. If the dot product of I and "
"Nref is smaller than zero the return value is N. Otherwise -N is returned."
msgstr ""
+"Mengembalikan vektor yang menunjuk ke arah yang sama dengan vektor "
+"referensi. Fungsi ini memiliki tiga parameter vektor: N, vektor untuk "
+"berorientasi, I, vektor insiden, dan Nref, vektor referensi. Jika dot "
+"product dari I dan Nref lebih kecil dari nol, nilai pengembaliannya adalah "
+"N. Jika tidak -N yang dikembalikan."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the length of a vector."
-msgstr ""
+msgstr "Menghitung panjang vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two vectors."
-msgstr ""
+msgstr "Interpolasi linier antara dua vektor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Interpolasi linier antara dua vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
-msgstr ""
+msgstr "Menghitung produk normalisasi vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - vector"
-msgstr ""
+msgstr "1.0 - vektor"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / vector"
-msgstr ""
+msgstr "1.0 / vektor"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the vector that points in the direction of reflection ( a : incident "
"vector, b : normal vector )."
msgstr ""
+"Mengembalikan vektor yang menunjuk ke arah refleksi (a: vektor insiden, b: "
+"vektor normal)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the vector that points in the direction of refraction."
-msgstr ""
+msgstr "Mengembalikan vektor yang menunjuk ke arah refraksi."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"Fungsi SmoothStep( vektor(tepi0), vektor(tepi1), vektor (x)).\n"
+"\n"
+"Mengembalikan nilai 0.0 jika 'x' lebih kecil dari 'tepi0' dan 1.0 jika 'x' "
+"lebih besar dari 'tepi1'. Jika tidak, nilai balik diinterpolasi antara 0.0 "
+"dan 1.0 menggunakan polinomial Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"Fungsi SmoothStep( skalar(tepi0), skalar(tepi1), skalar(x) ).\n"
+"\n"
+"Mengembalikan 0.0 jika 'x' lebih kecil dari 'tepi0' dan 1.0 jika x lebih "
+"besar dari 'tepi1'. Jika tidak, nilai balik diinterpolasi antara 0.0 dan 1.0 "
+"menggunakan polinomial Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Fungsi Step( vektor(tepi), vektor(x)).\n"
+"\n"
+"Mengembalikan nilai 0.0 jika 'x' lebih kecil dari 'tepi' dan sebaliknya 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Fungsi Step( skalar(tepi), vektor(x)).\n"
+"\n"
+"Mengembalikan nilai 0.0 jika 'x' lebih kecil dari 'tepi' dan sebaliknya 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds vector to vector."
-msgstr ""
+msgstr "Menambahkan vektor ke vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides vector by vector."
-msgstr ""
+msgstr "Membagi vektor dengan vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by vector."
-msgstr ""
+msgstr "Mengalikan vektor dengan vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two vectors."
-msgstr ""
+msgstr "Mengembalikan nilai sisa dari dua vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts vector from vector."
-msgstr ""
+msgstr "Kurangi vektor dari vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector constant."
-msgstr ""
+msgstr "Konstanta vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector uniform."
-msgstr ""
+msgstr "Seragam vektor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8689,91 +8717,112 @@ msgid ""
"output ports. This is a direct injection of code into the vertex/fragment/"
"light function, do not use it to write the function declarations inside."
msgstr ""
+"Ekspresi Bahasa Godot Shader Kustom, dengan jumlah khusus port masukan dan "
+"keluaran. Ini adalah injeksi langsung kode ke fungsi titik/fragmen/cahaya, "
+"jangan menggunakannya untuk menulis deklarasi fungsi di dalamnya."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns falloff based on the dot product of surface normal and view "
"direction of camera (pass associated inputs to it)."
msgstr ""
+"Mengembalikan nilai falloff berdasarkan dot product dari nilai normal "
+"permukaan dan arah pandangan kamera (berikan masukan yang terkait dengannya)."
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(Fragment/Light mode only) Scalar derivative function."
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(Fragment/Light mode only) Scalar derivative function."
+msgstr "(Khusus mode Fragmen / Cahaya) Fungsi skalar turunan."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Vector derivative function."
-msgstr ""
+msgstr "(Khusus mode Fragmen / Cahaya) Fungsi vektor turunan."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
"differencing."
msgstr ""
+"(Khusus mode Fragmen/Cahaya) (Vektor) Turunan dalam 'x' menggunakan "
+"perbedaan lokal."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
"differencing."
msgstr ""
+"(Khusus mode Fragmen/Cahaya) (Skalar) Turunan dalam 'x' menggunakan "
+"perbedaan lokal."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
"differencing."
msgstr ""
+"(Khusus mode Fragmen/Cahaya) (Vektor) Turunan dalam 'y' menggunakan "
+"perbedaan lokal."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
"differencing."
msgstr ""
+"(Khusus mode Fragmen/Cahaya) (Skalar) Turunan dalam 'y' menggunakan "
+"perbedaan lokal."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
+"(Khusus mode Fragmen/Cahaya) (Vektor) Jumlah dari turunan absolut dari 'x' "
+"dan 'y'."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
+"(Khusus mode Fragmen/Cahaya) (Skalar) Jumlah dari turunan absolut dari 'x' "
+"dan 'y'."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "VisualShader"
-msgstr ""
+msgstr "ShaderVisual"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Edit Visual Property"
-msgstr "Sunting Filter"
+msgstr "Sunting Properti Visual"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Visual Shader Mode Changed"
-msgstr "Ubah"
+msgstr "Mode Shader Visual Berubah"
#: editor/project_export.cpp
-#, fuzzy
msgid "Runnable"
-msgstr "Aktifkan"
+msgstr "Dapat dijalankan"
#: editor/project_export.cpp
-#, fuzzy
msgid "Delete patch '%s' from list?"
-msgstr "Hapus Penampilan"
+msgstr "Hapus entri penambalan '%s' dari daftar?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Delete preset '%s'?"
-msgstr "Hapus file yang dipilih?"
+msgstr "Hapus preset '%s'?"
#: editor/project_export.cpp
msgid ""
"Failed to export the project for platform '%s'.\n"
"Export templates seem to be missing or invalid."
msgstr ""
+"Gagal mengekspor proyek untuk platform '%s'.\n"
+"Templat Ekspor kelihatannya belum terpasang atau tidak valid."
#: editor/project_export.cpp
msgid ""
@@ -8781,203 +8830,203 @@ msgid ""
"This might be due to a configuration issue in the export preset or your "
"export settings."
msgstr ""
+"Gagal mengekspor proyek untuk platform '%s'.\n"
+"Ini mungkin disebabkan oleh masalah konfigurasi dalam preset ekspor atau "
+"pengaturan ekspor Anda."
#: editor/project_export.cpp
msgid "Release"
-msgstr ""
+msgstr "Rilis"
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "Mengekspor untuk %s"
+msgstr "Mengekspor Semua"
#: editor/project_export.cpp
-#, fuzzy
msgid "The given export path doesn't exist:"
-msgstr "File tidak ada."
+msgstr "Lokasi ekspor yang diberikan tidak ada:"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing/corrupted:"
-msgstr ""
+msgstr "Templat ekspor untuk platform ini tidak ada / rusak:"
#: editor/project_export.cpp
msgid "Presets"
-msgstr ""
+msgstr "Prasetel"
#: editor/project_export.cpp editor/project_settings_editor.cpp
msgid "Add..."
-msgstr ""
+msgstr "Tambahkan..."
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Path"
-msgstr "Ekspor Projek"
+msgstr "Lokasi Ekspor"
#: editor/project_export.cpp
msgid "Resources"
-msgstr ""
+msgstr "Sumber Daya"
#: editor/project_export.cpp
msgid "Export all resources in the project"
-msgstr ""
+msgstr "Ekspor semua sumber daya dalam proyek"
#: editor/project_export.cpp
msgid "Export selected scenes (and dependencies)"
-msgstr ""
+msgstr "Ekspor skena terpilih (dan dependensinya)"
#: editor/project_export.cpp
msgid "Export selected resources (and dependencies)"
-msgstr ""
+msgstr "Expor sumber daya terpilih (dan dependensinya)"
#: editor/project_export.cpp
msgid "Export Mode:"
-msgstr ""
+msgstr "Mode Ekspor:"
#: editor/project_export.cpp
msgid "Resources to export:"
-msgstr ""
+msgstr "Sumber daya yang akan diexpor:"
#: editor/project_export.cpp
msgid ""
"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)"
msgstr ""
+"Penyaringan untuk mengekspor berkas non-sumber (dipisahkan koma, contoh: *."
+"json, *.txt)"
#: editor/project_export.cpp
msgid ""
"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)"
msgstr ""
+"Penyaringan untuk mengecualikan berkas dalam proyek (dipisahkan koma, "
+"contoh: *.json, *.txt)"
#: editor/project_export.cpp
-#, fuzzy
msgid "Patches"
-msgstr "Kecocokan:"
+msgstr "Tambalan"
#: editor/project_export.cpp
msgid "Make Patch"
-msgstr ""
+msgstr "Buat Tambalan"
#: editor/project_export.cpp
msgid "Features"
-msgstr ""
+msgstr "Fitur"
#: editor/project_export.cpp
msgid "Custom (comma-separated):"
-msgstr ""
+msgstr "Ubah suaian (dipisahkan koma):"
#: editor/project_export.cpp
-#, fuzzy
msgid "Feature List:"
-msgstr "Daftar Fungsi:"
+msgstr "Daftar Fitur:"
#: editor/project_export.cpp
msgid "Script"
msgstr "Skrip"
#: editor/project_export.cpp
-#, fuzzy
msgid "Script Export Mode:"
-msgstr "Ekspor Projek"
+msgstr "Mode Ekspor Skrip:"
#: editor/project_export.cpp
msgid "Text"
-msgstr ""
+msgstr "Teks"
#: editor/project_export.cpp
msgid "Compiled"
-msgstr ""
+msgstr "Dikompilasi"
#: editor/project_export.cpp
msgid "Encrypted (Provide Key Below)"
-msgstr ""
+msgstr "Dienkripsi (Sertakan Kunci Berikut)"
#: editor/project_export.cpp
msgid "Invalid Encryption Key (must be 64 characters long)"
-msgstr ""
+msgstr "Kunci Enkripsi Tidak Valid (panjangnya harus 64 karakter)"
#: editor/project_export.cpp
msgid "Script Encryption Key (256-bits as hex):"
-msgstr ""
+msgstr "Kunci Enkripsi Skrip (256-bit berbentuk heksa):"
#: editor/project_export.cpp
msgid "Export PCK/Zip"
-msgstr ""
+msgstr "Ekspor PCK/Zip"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "Ekspor Projek"
+msgstr "Mode ekspor?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "Ekspor"
+msgstr "Ekspor Semua"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
-msgstr ""
+msgstr "Tidak ada templat ekspor untuk platform ini:"
+
+#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Mengatur Templat Ekspor"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export With Debug"
-msgstr "Ekspor Tile Set"
+msgstr "Ekspor dengan Awakutu"
#: editor/project_manager.cpp
-#, fuzzy
msgid "The path does not exist."
-msgstr "File tidak ada."
+msgstr "Lokasi ini tidak ada."
#: editor/project_manager.cpp
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr ""
+msgstr "Berkas proyek '.zip' tidak valid, tidak berisi berkas 'project.godot'."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
-msgstr ""
+msgstr "Silakan pilih direktori kosong."
#: editor/project_manager.cpp
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr ""
+msgstr "Silakan pilih berkas 'project.godot' atau '.zip'."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "Direktori ini sudah berisi proyek Godot."
#: editor/project_manager.cpp
-#, fuzzy
msgid "New Game Project"
-msgstr "Projek Baru Permainan"
+msgstr "Proyek Baru Permainan"
#: editor/project_manager.cpp
msgid "Imported Project"
-msgstr ""
+msgstr "Proyek yang Diimpor"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid Project Name."
-msgstr "Nama Projek:"
+msgstr "Nama Proyek Tidak Valid."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Couldn't create folder."
msgstr "Tidak dapat membuat folder."
#: editor/project_manager.cpp
msgid "There is already a folder in this path with the specified name."
-msgstr ""
+msgstr "Sudah ada direktori di lokasi ini dengan nama yang diberikan."
#: editor/project_manager.cpp
msgid "It would be a good idea to name your project."
-msgstr ""
+msgstr "Sebaiknya berikan nama untuk proyek Anda."
#: editor/project_manager.cpp
msgid "Invalid project path (changed anything?)."
-msgstr ""
+msgstr "Lokasi proyek tidak valid (mengubah sesuatu?)."
#: editor/project_manager.cpp
msgid ""
"Couldn't load project.godot in project path (error %d). It may be missing or "
"corrupted."
msgstr ""
+"Tidak dapat memuat project.godot dalam lokasi proyek (galat %d). Mungkin "
+"berkas itu tidak ada atau rusak."
#: editor/project_manager.cpp
msgid "Couldn't edit project.godot in project path."
@@ -8985,16 +9034,15 @@ msgstr "Tidak dapat menyunting project.godot dalam lokasi proyek."
#: editor/project_manager.cpp
msgid "Couldn't create project.godot in project path."
-msgstr ""
+msgstr "Tidak dapat membuat project.godot dalam lokasi proyek."
#: editor/project_manager.cpp
msgid "The following files failed extraction from package:"
-msgstr ""
+msgstr "Berkas berikut gagal diekstrak dari paket:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Rename Project"
-msgstr "Projek Baru Permainan"
+msgstr "Ubah Nama Proyek"
#: editor/project_manager.cpp
msgid "Import Existing Project"
@@ -9014,7 +9062,7 @@ msgstr "Buat & Ubah"
#: editor/project_manager.cpp
msgid "Install Project:"
-msgstr ""
+msgstr "Pasang Proyek:"
#: editor/project_manager.cpp
msgid "Install & Edit"
@@ -9029,17 +9077,16 @@ msgid "Project Path:"
msgstr "Lokasi Projek:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Lokasi Projek:"
+msgstr "Lokasi Pemasangan Proyek:"
#: editor/project_manager.cpp
msgid "Renderer:"
-msgstr ""
+msgstr "Perender:"
#: editor/project_manager.cpp
msgid "OpenGL ES 3.0"
-msgstr ""
+msgstr "OpenGL ES 3.0"
#: editor/project_manager.cpp
msgid ""
@@ -9048,10 +9095,14 @@ msgid ""
"Incompatible with older hardware\n"
"Not recommended for web games"
msgstr ""
+"Kualitas visual lebih tinggi\n"
+"Semua fitur tersedia\n"
+"Tidak kompatibel dengan perangkat lama\n"
+"Tidak direkomendasikan untuk permainan berbasis web"
#: editor/project_manager.cpp
msgid "OpenGL ES 2.0"
-msgstr ""
+msgstr "OpenGL ES 2.0"
#: editor/project_manager.cpp
msgid ""
@@ -9060,24 +9111,35 @@ msgid ""
"Works on most hardware\n"
"Recommended for web games"
msgstr ""
+"Kualitas visual lebih rendah\n"
+"Beberapa fitur tidak tersedia\n"
+"Bekerja di sebagian besar perangkat\n"
+"Direkomendasikan untuk permainan berbasis web"
#: editor/project_manager.cpp
msgid "Renderer can be changed later, but scenes may need to be adjusted."
-msgstr ""
+msgstr "Perender dapat diubah nanti, tapi skena mungkin perlu disesuaikan."
#: editor/project_manager.cpp
msgid "Unnamed Project"
-msgstr ""
+msgstr "Proyek Tanpa Nama"
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "Impor Projek yang Sudah Ada"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
-msgstr "Menyambungkan..."
+msgstr "Tidak dapat membuka proyek di '%s'."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Are you sure to open more than one project?"
-msgstr "Apakah Anda yakin membuka lebih dari satu projek?"
+msgstr "Apakah Anda yakin membuka lebih dari satu proyek?"
#: editor/project_manager.cpp
msgid ""
@@ -9091,6 +9153,15 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
+"Berkas pengaturan proyek berikut tidak mencantumkan versi Godot mana ketika "
+"itu dibuat.\n"
+"\n"
+"%s\n"
+"\n"
+"Jika Anda memutuskan untuk membukanya, proyek ini akan dikonversi ke format "
+"berkas pengaturan Godot saat ini.\n"
+"Peringatan: Anda tidak akan lagi bisa membuka proyek ini menggunakan versi "
+"Godot sebelumnya."
#: editor/project_manager.cpp
msgid ""
@@ -9103,12 +9174,22 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
+"Berkas pengaturan proyek berikut dihasilkan oleh Godot versi lebih lama, dan "
+"perlu dikonversi untuk versi ini.\n"
+"\n"
+"%s\n"
+"\n"
+"Apakah Anda ingin mengonversinya?\n"
+"Peringatan: Anda tidak akan lagi bisa membuka proyek ini menggunakan Godot "
+"versi sebelumnya."
#: editor/project_manager.cpp
msgid ""
"The project settings were created by a newer engine version, whose settings "
"are not compatible with this version."
msgstr ""
+"Pengaturan proyek dibuat oleh versi mesin yang lebih baru, yang mana "
+"pengaturannya tidak kompatibel dengan versi ini."
#: editor/project_manager.cpp
msgid ""
@@ -9125,49 +9206,63 @@ msgid ""
"Can't run project: Assets need to be imported.\n"
"Please edit the project to trigger the initial import."
msgstr ""
+"Tidak dapat menjalankan proyek: Aset perlu diimpor.\n"
+"Silakan sunting proyek untuk memicu pengimporan awal."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Are you sure to run %d projects at once?"
-msgstr "Apakah Anda yakin menjalankan lebih dari satu projek?"
+msgstr "Apakah Anda yakin menjalankan %d proyek sekaligus?"
#: editor/project_manager.cpp
msgid ""
"Remove %d projects from the list?\n"
"The project folders' contents won't be modified."
msgstr ""
+"Hapus %d proyek dalam daftar?\n"
+"Konten di folder proyek tidak akan dimodifikasi."
#: editor/project_manager.cpp
msgid ""
"Remove this project from the list?\n"
"The project folder's contents won't be modified."
msgstr ""
+"Hapus proyek ini dalam daftar?\n"
+"Konten di folder proyek tidak akan dimodifikasi."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
+"Hapus %d proyek dalam daftar?\n"
+"Konten di folder proyek tidak akan dimodifikasi."
#: editor/project_manager.cpp
msgid ""
"Language changed.\n"
"The interface will update after restarting the editor or project manager."
msgstr ""
+"Bahasa diubah.\n"
+"Antarmuka akan diperbarui setelah menjalankan ulang penyunting atau manajer "
+"proyek."
#: editor/project_manager.cpp
msgid ""
"Are you sure to scan %s folders for existing Godot projects?\n"
"This could take a while."
msgstr ""
+"Apakah Anda yakin untuk memindai %s folder untuk proyek Godot yang ada?\n"
+"Ini bisa memakan waktu yang lama."
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Manajer Proyek"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Daftar Projek"
+#, fuzzy
+msgid "Projects"
+msgstr "Proyek"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9182,41 +9277,36 @@ msgid "New Project"
msgstr "Projek Baru"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Remove Missing"
-msgstr "Hapus Sinyal"
+msgstr "Hapus yang Tidak Ada"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Templates"
-msgstr "Hapus Pilihan"
-
-#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Keluar"
+msgstr "Templat"
#: editor/project_manager.cpp
msgid "Restart Now"
-msgstr ""
+msgstr "Mulai ulang Sekarang"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Can't run project"
-msgstr "Menyambungkan..."
+msgstr "Tidak dapat menjalankan proyek"
#: editor/project_manager.cpp
msgid ""
"You currently don't have any projects.\n"
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+"Saat ini Anda tidak memiliki proyek.\n"
+"Apakah Anda ingin menjelajahi contoh proyek resmi di Pustaka Aset?"
#: editor/project_settings_editor.cpp
msgid "Key "
-msgstr ""
+msgstr "Kunci "
#: editor/project_settings_editor.cpp
msgid "Joy Button"
-msgstr ""
+msgstr "Tombol Joystick"
#: editor/project_settings_editor.cpp
msgid "Joy Axis"
@@ -9224,36 +9314,35 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Mouse Button"
-msgstr ""
+msgstr "Tombol Mouse"
#: editor/project_settings_editor.cpp
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
+"Nama aksi tidak valid. Tidak boleh kosong atau mengandung '/', ':', '=', "
+"'\\' atau '\"'"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "KESALAHAN: Nama animasi sudah ada!"
+msgstr "Sudah ada aksi dengan nama '%s'."
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
-msgstr ""
+msgstr "Ubah nama Input Action Event"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Ubah Nama Animasi:"
+msgstr "Ubah deadzone Aksi"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
-msgstr ""
+msgstr "Tambah Input Action Event"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "Perangkat"
+msgstr "Semua Perangkat"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -9269,55 +9358,51 @@ msgstr "Alt+"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Control+"
-msgstr ""
+msgstr "Kontrol+"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Press a Key..."
-msgstr ""
+msgstr "Tekan Tombol..."
#: editor/project_settings_editor.cpp
msgid "Mouse Button Index:"
-msgstr ""
+msgstr "Indeks Tombol Mouse:"
#: editor/project_settings_editor.cpp
msgid "Left Button"
-msgstr ""
+msgstr "Tombol Kiri"
#: editor/project_settings_editor.cpp
msgid "Right Button"
-msgstr ""
+msgstr "Tombol Kanan"
#: editor/project_settings_editor.cpp
msgid "Middle Button"
-msgstr ""
+msgstr "Tombol Tengah"
#: editor/project_settings_editor.cpp
msgid "Wheel Up Button"
-msgstr ""
+msgstr "Tombol Gulir ke atas"
#: editor/project_settings_editor.cpp
msgid "Wheel Down Button"
-msgstr ""
+msgstr "Tombol Gulir ke bawah"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "Tombol Kiri."
+msgstr "Tombol Gulir ke kiri"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "Tombol Kanan."
+msgstr "Tombol Gulir ke kanan"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Tombol"
+msgstr "Tombol X 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Tombol"
+msgstr "Tombol X 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -9547,6 +9632,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Pengaya"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9605,14 +9694,6 @@ msgstr "Metode Publik:"
msgid "Select Method"
msgstr "Metode Publik:"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -9911,6 +9992,11 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Ubah nama port keluaran"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10040,19 +10126,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10153,6 +10239,11 @@ msgid "Error loading script from %s"
msgstr "Error memuat font."
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Timpa"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10356,6 +10447,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Pengaturan Editor"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10802,10 +10897,30 @@ msgid "Set Variable Type"
msgstr "Edit Variabel:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Tidak boleh sama dengan nama tipe bawaan yang ada."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Buat persegi panjang baru."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Variabel-variabel:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Buat persegi panjang baru."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Buat poligon baru."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Nama bukan sebuah pengidentifikasi yang sah:"
@@ -11008,11 +11123,6 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
-msgid "Paste Nodes"
-msgstr "Path ke Node:"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
msgstr "Anggota"
@@ -11766,8 +11876,9 @@ msgid "HSV"
msgstr ""
#: scene/gui/color_picker.cpp
+#, fuzzy
msgid "Raw"
-msgstr ""
+msgstr "Mentah"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
@@ -11858,22 +11969,6 @@ msgstr ""
"tidak, jadikan sebagai RenderTarget dan tetapkan tekstur internal nya ke "
"beberapa node untuk ditampilkan."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Error menginisialisasi FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Format font tidak diketahui."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Error memuat font."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Ukuran font tidak sah."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Masukan"
@@ -11912,6 +12007,99 @@ msgstr "Variasi hanya bisa ditetapkan dalam fungsi vertex."
msgid "Constants cannot be modified."
msgstr "Konstanta tidak dapat dimodifikasi."
+#~ msgid "No Matches"
+#~ msgstr "Tidak ada yang cocok"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Tidak dapat membuka file_type_cache.cch untuk menulis, berkas cache tidak "
+#~ "disimpan!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "'%s' tidak bisa ditelusuri karena tidak bisa ditemukan dalam berkas "
+#~ "sistem!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Galat saat memuat gambar:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Tidak ada piksel dengan transparansi > 128 di dalam gambar..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Induk tidak memiliki sisi yang solid untuk diisi."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Tidak dapat memetakan area."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Bidang tidak memiliki area!"
+
+#~ msgid "No faces!"
+#~ msgstr "Tidak ada bidang!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Galat: tidak dapat memuat berkas."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Aktifkan Efek Doppler"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Pilih Mode (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Mode Geser (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Mode Rotasi (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Mode Skala (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Koordinat Lokal"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Mode Pengancingan (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Alat Pilih"
+
+#~ msgid "Tool Move"
+#~ msgstr "Alat Geser"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Alat Rotasi"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Alat Skala"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "Hapus semua proyek yang hilang dalam daftar? (folder konten tidak akan "
+#~ "dimodifikasi)"
+
+#~ msgid "Project List"
+#~ msgstr "Daftar Projek"
+
+#~ msgid "Exit"
+#~ msgstr "Keluar"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Error menginisialisasi FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Format font tidak diketahui."
+
+#~ msgid "Error loading font."
+#~ msgstr "Error memuat font."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Ukuran font tidak sah."
+
#~ msgid "Previous Folder"
#~ msgstr "Direktori Sebelumnya"
@@ -12406,9 +12594,6 @@ msgstr "Konstanta tidak dapat dimodifikasi."
#~ msgid "Pick New Name and Location For:"
#~ msgstr "Tentukan Nama dan Lokasi Baru untuk:"
-#~ msgid "Re-Import..."
-#~ msgstr "Impor Ulang..."
-
#, fuzzy
#~ msgid "Texture Options"
#~ msgstr "Opsi Tekstur"
diff --git a/editor/translations/is.po b/editor/translations/is.po
index 98d0678673..7a5faac0b8 100644
--- a/editor/translations/is.po
+++ b/editor/translations/is.po
@@ -59,7 +59,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr ""
@@ -663,15 +662,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -896,8 +895,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -991,7 +989,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -1028,7 +1026,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr "Breyta"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1117,14 +1115,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1141,7 +1139,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1626,12 +1624,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2023,6 +2020,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2320,6 +2321,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2413,6 +2422,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2498,20 +2511,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2544,24 +2553,33 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Breyta..."
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2641,13 +2659,14 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
-msgstr ""
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
+msgstr "Stillið breyting á:"
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2682,14 +2701,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2697,12 +2716,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3141,7 +3161,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3158,6 +3178,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3219,12 +3243,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3238,13 +3260,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3329,19 +3355,11 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3374,11 +3392,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3438,6 +3456,10 @@ msgstr "Hreyfimynd Tvöfalda Lykla"
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3501,6 +3523,10 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "Create Scene"
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3561,6 +3587,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3568,12 +3602,21 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Anim DELETE-lyklar"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3586,12 +3629,13 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
+#, fuzzy
+msgid "Group Editor"
+msgstr "Breyta"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3797,7 +3841,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4550,10 +4594,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4566,14 +4606,42 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4650,8 +4718,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4672,7 +4743,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4684,6 +4755,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4842,6 +4917,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Breyta umbreytingu"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4871,6 +4951,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4891,14 +4972,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -4922,6 +5006,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4938,11 +5023,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4955,6 +5035,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5162,16 +5247,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5485,14 +5560,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5576,19 +5643,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5919,7 +5990,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6025,11 +6095,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6053,7 +6119,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6134,6 +6200,10 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6171,11 +6241,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6263,6 +6333,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6329,6 +6403,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6363,92 +6438,97 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
+msgid "Fold/Unfold Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
+msgid "Fold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
+msgid "Unfold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
+msgid "Clone Down"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
+msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Val á kvarða"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
+msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6686,7 +6766,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6740,7 +6820,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6751,27 +6831,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6815,22 +6875,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6885,7 +6929,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7183,10 +7227,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7273,11 +7313,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7397,8 +7437,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7690,6 +7730,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7770,6 +7814,11 @@ msgid "Duplicate Nodes"
msgstr "Tvíteknir lyklar"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Anim DELETE-lyklar"
@@ -7779,10 +7828,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7795,6 +7840,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8155,7 +8204,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8164,7 +8213,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8324,6 +8373,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8349,7 +8402,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8358,7 +8411,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8367,14 +8420,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8419,6 +8472,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8626,6 +8686,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8772,6 +8836,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8841,8 +8913,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8865,8 +8937,9 @@ msgid "Project Manager"
msgstr "Verkefna Stjóri"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "Verkefna Stjóri"
#: editor/project_manager.cpp
msgid "Scan"
@@ -8890,10 +8963,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9228,6 +9297,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9280,14 +9353,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -9575,6 +9640,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9693,19 +9762,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9796,6 +9865,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -9984,6 +10057,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10397,10 +10474,27 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Val á kvarða"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10585,10 +10679,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11318,22 +11408,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
diff --git a/editor/translations/it.po b/editor/translations/it.po
index 9773fd2a13..fa32a7d606 100644
--- a/editor/translations/it.po
+++ b/editor/translations/it.po
@@ -43,7 +43,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-29 19:20+0000\n"
+"PO-Revision-Date: 2019-08-04 14:23+0000\n"
"Last-Translator: No <kingofwizards.kw7@gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/"
"godot/it/>\n"
@@ -96,7 +96,6 @@ msgid "On call to '%s':"
msgstr "Alla chiamata di '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Libero"
@@ -165,29 +164,24 @@ msgid "Anim Change Call"
msgstr "Cambia chiamata animazione"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Anim Cambia Tempo Keyframe"
+msgstr "Anim Cambio Multiplo Tempo Keyframe"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Cambia transizione dell'animazione"
+msgstr "Animazione Cambio Multiplo Transizione"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Cambia trasformazione dell'animazione"
+msgstr "Animazione Cambio Multiplo Trasformazione"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Cambia valore fotogramma chiave dell'animazione"
+msgstr "Animazione Cambio Multiplo Valore Keyframe"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "Cambia chiamata animazione"
+msgstr "Animazione Cambio Multiplo Chiamata"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -691,16 +685,18 @@ msgid "Line Number:"
msgstr "Numero linea:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "Trovata/e %d corrispondenza/e."
+msgid "Replaced %d occurrence(s)."
+msgstr "Rimpiazzate %d occorrenze."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Nessuna corrispondenza"
+#, fuzzy
+msgid "%d match."
+msgstr "Trovata/e %d corrispondenza/e."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Rimpiazzate %d occorrenze."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Trovata/e %d corrispondenza/e."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -927,8 +923,7 @@ msgstr "Preferiti:"
msgid "Recent:"
msgstr "Recenti:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1029,7 +1024,7 @@ msgstr ""
"esse funzionino.\n"
"Rimuoverli comunque? (non annullabile)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Impossibile rimuovere:"
@@ -1065,7 +1060,7 @@ msgstr "Eliminare permanentemente %d elementi? (Non annullabile!)"
msgid "Show Dependencies"
msgstr "Mostra Dipendenze"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Esplora risorse orfane"
@@ -1154,14 +1149,16 @@ msgid "License"
msgstr "Licenza"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Licenza di terze parti"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine si basa su parecchie librerie libere ed open source, tutte "
@@ -1182,7 +1179,8 @@ msgid "Licenses"
msgstr "Licenze"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Errore nell'apertura del pacchetto, non è in formato zip."
#: editor/editor_asset_installer.cpp
@@ -1678,12 +1676,11 @@ msgid "New"
msgstr "Nuovo"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importa"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Esporta"
@@ -1820,30 +1817,26 @@ msgid "Move Favorite Down"
msgstr "Sposta preferito in giù"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Va' alla cartella superiore."
+msgstr "Vai alla cartella precedente."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Va' alla cartella superiore."
+msgstr "Vai alla cartella successiva."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "Va' alla cartella superiore."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Cerca file"
+msgstr "Ricarica files."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "Aggiungi/rimuovi cartella attuale dai preferiti."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
msgstr "Attiva/disattiva visibilità dei file nascosti."
@@ -2086,6 +2079,11 @@ msgstr "Rimuovi tutto"
msgid "Clear Output"
msgstr "Svuota output"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "Finestra"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Esportazione progetto fallita con codice di errore %d."
@@ -2414,6 +2412,15 @@ msgid "Pick a Main Scene"
msgstr "Scegli una scena principale"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Chiudi scena"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Chiudi scena"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Impossibile abilitare il componente aggiuntivo in: '%s' lettura della "
@@ -2532,6 +2539,11 @@ msgstr "Esegui Scena"
msgid "Close Tab"
msgstr "Chiudi scheda"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Chiudi scheda"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Chiudi le altre schede"
@@ -2616,6 +2628,10 @@ msgstr "Nuova scena ereditata..."
msgid "Open Scene..."
msgstr "Apri scena..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Apri recente"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Salva scena"
@@ -2625,14 +2641,6 @@ msgid "Save All Scenes"
msgstr "Salva tutte le scene"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Chiudi scena"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Apri recente"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Converti in..."
@@ -2662,25 +2670,36 @@ msgstr "Ripristina scena"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Strumenti di progetto o scena vari."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Progetto"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Impostazioni progetto"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Strumenti"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr "Esporta..."
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Installa Android Build Template"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Apri la cartella del progetto"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Strumenti"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Installa Android Build Template"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Esplora risorse orfane"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2778,12 +2797,13 @@ msgstr ""
"Quando usata in remoto su un dispositivo, sarà più efficiente con un "
"filesystem in rete."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Editor"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Impostazioni editor"
#: editor/editor_node.cpp
@@ -2820,14 +2840,16 @@ msgid "Open Editor Settings Folder"
msgstr "Apri cartella impostazioni editor"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "Gestisci le funzionalità dell'editor"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Gestisci template d'esportazione"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Aiuto"
@@ -2835,12 +2857,13 @@ msgstr "Aiuto"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Cerca"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Documentazione online"
@@ -3121,9 +3144,8 @@ msgid "Calls"
msgstr "Chiamate"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Modifica Tema"
+msgstr "Modifica Testo:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3297,7 +3319,8 @@ msgid "Import From Node:"
msgstr "Importa Da Nodo:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Ri-Scarica"
#: editor/export_template_manager.cpp
@@ -3314,6 +3337,10 @@ msgid "Download"
msgstr "Scarica"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Mancante)"
@@ -3377,12 +3404,10 @@ msgid "No response."
msgstr "Nessuna risposta."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Richiesta fallita."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Ridirigi Loop."
@@ -3396,15 +3421,22 @@ msgid "Download Complete."
msgstr "Download Completato."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Impossibile salvare il tema su file:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Installazione dei template fallita. Gli archivi dei template che danno "
"problemi possono essere trovati in '%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Errore nella richiesta url: "
#: editor/export_template_manager.cpp
@@ -3489,22 +3521,11 @@ msgstr "Scarica Template"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Seleziona mirror dalla lista: (Shift+Click: Apri in Browser)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Impossibile aprire file_type_cache.cch per scrittura, non salvo la cache dei "
-"tipi di file!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Preferiti"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"Impossibile navigare a '%s' perché non è stato trovato nel file system!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Stato: Importazione file fallita. Si prega di riparare il file e "
@@ -3539,14 +3560,14 @@ msgid "Provided name contains invalid characters."
msgstr "Il nome fornito contiene caratteri non validi."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Il nome contiene caratteri non validi."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Un file o cartella con questo nome é già esistente."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Il nome contiene caratteri non validi."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Rinomina file:"
@@ -3602,6 +3623,11 @@ msgstr "Duplica..."
msgid "Move To..."
msgstr "Sposta in..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Nuova scena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Nuovo Script..."
@@ -3667,6 +3693,11 @@ msgstr "C'è già un file o una cartella con lo stesso nome in questo percorso."
msgid "Overwrite"
msgstr "Sovrascrivi"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Crea da Scena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Crea Script"
@@ -3729,6 +3760,14 @@ msgid "Search complete"
msgstr "Ricerca completata"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Aggiungi a Gruppo"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Rimuovi da Gruppo"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Il nome del gruppo è già esistente."
@@ -3736,12 +3775,23 @@ msgstr "Il nome del gruppo è già esistente."
msgid "Invalid group name."
msgstr "Nome del gruppo non valido."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Gestisci Gruppi"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Elimina Gruppo Immagini"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Gruppi"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Nodi non in Gruppo"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3754,12 +3804,12 @@ msgid "Nodes in Group"
msgstr "Nodi in Gruppo"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Aggiungi a Gruppo"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Rimuovi da Gruppo"
+msgid "Group Editor"
+msgstr "Editor Gruppo"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3967,7 +4017,8 @@ msgid "MultiNode Set"
msgstr "MultiNode Set"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Seleziona un Nodo per modificare Segnali e Gruppi."
#: editor/plugin_config_dialog.cpp
@@ -4732,10 +4783,6 @@ msgid "View Files"
msgstr "Vedi Files"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Impossibile risolvere l'hostname:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Errore di connessione, si prega di riprovare."
@@ -4748,14 +4795,47 @@ msgid "No response from host:"
msgstr "Nessuna risposta dall'host:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Impossibile risolvere l'hostname:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Richiesta fallita, codice di return:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Richiesta fallita."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Impossibile salvare il tema su file:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Richiesta fallita, troppi ridirezionamenti"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Ridirigi Loop."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Richiesta fallita, codice di return:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Tempo"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Hash di download non buono, si presume il file sia stato manipolato."
@@ -4832,8 +4912,13 @@ msgid "All"
msgstr "Tutti"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Re-Importa..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Plugins"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4841,9 +4926,8 @@ msgid "Sort:"
msgstr "Ordina:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Reverse sorting."
-msgstr "Richiedendo..."
+msgstr "Ordinamento inverso."
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
@@ -4855,7 +4939,8 @@ msgid "Site:"
msgstr "Sito:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Supporta..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4867,6 +4952,11 @@ msgid "Testing"
msgstr "Testing"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Carica..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "ZIP File degli Asset"
@@ -5033,6 +5123,11 @@ msgid "Paste Pose"
msgstr "Incolla Posa"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Rimuovi ossa"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Crea Ossa personalizzate a partire da uno o più Nodi"
@@ -5063,6 +5158,7 @@ msgid "Zoom Reset"
msgstr "Ripristino Zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Modalità di Selezione"
@@ -5085,14 +5181,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+RMB: Selezione Lista Profondità"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Modalità Movimento"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Modalità Rotazione"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Modalità Scala"
@@ -5118,6 +5217,7 @@ msgid "Toggle snapping."
msgstr "Abilita snapping."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Usa lo Snap"
@@ -5134,11 +5234,6 @@ msgid "Use Rotation Snap"
msgstr "Usa lo Snap di Rotazione"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Configura Snap..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Snap Relativo"
@@ -5151,6 +5246,11 @@ msgid "Smart Snapping"
msgstr "Snapping intelligente"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Configura Snap..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "Snap al Genitore"
@@ -5365,16 +5465,6 @@ msgstr "Imposta Maniglia"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Errore di caricamento immagine:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Nessun pixel con trasparenza >128 nell'immagine..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Carica Maschera Emissione"
@@ -5688,14 +5778,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Sorgente superficie invalida (nessuna faccia)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "Il genitore non ha facce solde da popolare."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Impossibile mappare l'area."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Seleziona una Mesh Sorgente:"
@@ -5781,20 +5863,27 @@ msgid "Generation Time (sec):"
msgstr "Tempo di Generazione (sec):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Le facce non contengono area!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Il nodo non contiene geometria (facce)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Nessuna faccia!"
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Il nodo non contiene geometria."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Il nodo non contiene geometria (facce)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Il nodo non contiene geometria."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6128,7 +6217,6 @@ msgid "Grid Settings"
msgstr "Impostazioni Griglia"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Snap"
@@ -6234,12 +6322,9 @@ msgid "Error writing TextFile:"
msgstr "Errore scrittura TextFile:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Errore: impossibile caricare il file."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "Errore: impossibile caricare il file."
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "Impossibile trovare tile:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6262,7 +6347,8 @@ msgid "Error Importing"
msgstr "Errore di Importazione"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Nuovo TextFile..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6343,6 +6429,11 @@ msgid "Open..."
msgstr "Apri..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Apri Script"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Salva Tutto"
@@ -6380,13 +6471,13 @@ msgid "Save Theme"
msgstr "Salva Tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Chiudi Documentazione"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Chiudi Tutto"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Chiudi Documentazione"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Esegui"
@@ -6474,6 +6565,11 @@ msgstr "Debugger"
msgid "Search Results"
msgstr "Cerca Risultati"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Rimuovi scene recenti"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "Connessioni al metodo:"
@@ -6541,6 +6637,7 @@ msgid "Syntax Highlighter"
msgstr "Evidenziatore di Sintassi"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr "Vai a"
@@ -6575,22 +6672,6 @@ msgid "Toggle Comment"
msgstr "Cambia a Commento"
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr "Abilita/Disabilita Segnalibri"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "Vai al Segnalibri Successivo"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr "Vai al Segnalibri Precedente"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "Rimuovi tutti i Segnalibri"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Piega/Dispiega Linea"
@@ -6611,6 +6692,11 @@ msgid "Complete Symbol"
msgstr "Completa Simbolo"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Scala selezione"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Taglia Spazi in Coda"
@@ -6627,29 +6713,32 @@ msgid "Auto Indent"
msgstr "Auto Indenta"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Abilita Breakpoint"
+msgid "Find Previous"
+msgstr "Trova Precedente"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Rimuovi Tutti i Breakpoints"
+msgid "Find in Files..."
+msgstr "Cerca nei File..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Vai a Breakpoint Successivo"
+msgid "Contextual Help"
+msgstr "Aiuto Contestuale"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Vai a Breakpoint Precedente"
+msgid "Toggle Bookmark"
+msgstr "Abilita/Disabilita Segnalibri"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Trova Precedente"
+msgid "Go to Next Bookmark"
+msgstr "Vai al Segnalibri Successivo"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Cerca nei File..."
+msgid "Go to Previous Bookmark"
+msgstr "Vai al Segnalibri Precedente"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Rimuovi tutti i Segnalibri"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6660,8 +6749,21 @@ msgid "Go to Line..."
msgstr "Vai a Linea..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Aiuto Contestuale"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Abilita Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Rimuovi Tutti i Breakpoints"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Vai a Breakpoint Successivo"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Vai a Breakpoint Precedente"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -6840,14 +6942,12 @@ msgid "Rear"
msgstr "Retro"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Transform with View"
-msgstr "Allinea alla Vista"
+msgstr "Allinea Trasformazione con la Vista"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Rotation with View"
-msgstr "Allinea Selezione Con Vista"
+msgstr "Allinea Rotazione con la Vista"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -6902,8 +7002,9 @@ msgid "Audio Listener"
msgstr "Listener Audio"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Abilita Doppler"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Abilita filtraggio"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6959,8 +7060,8 @@ msgid "Snap Nodes To Floor"
msgstr "Sposta i Nodi sul Pavimento"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Modalità di Selezione (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6973,30 +7074,11 @@ msgstr ""
"Alt+RMB: Selezione Lista Profondità"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Modalità Movimento (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Modalità Rotazione (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Modalità Scala (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Coordinate locali"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Modalità Spazio Locale (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Modalità Snap (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Vista dal Basso"
@@ -7037,22 +7119,6 @@ msgid "Focus Selection"
msgstr "Centra a Selezione"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Strumento Seleziona"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Strumento Sposta"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Strumento Ruota"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Strumento Scala"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Abilita/Disabilita Vista libera"
@@ -7107,7 +7173,8 @@ msgstr "Visualizza Griglia"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Impostazioni"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7402,10 +7469,6 @@ msgid "TextureRegion"
msgstr "TextureRegion"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "Impossibile salvare il tema su file:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Aggiungi Tutti gli Elementi"
@@ -7490,11 +7553,13 @@ msgid "Submenu"
msgstr "Sottomenù"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+#, fuzzy
+msgid "Subitem 1"
msgstr "Elemento 1"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+#, fuzzy
+msgid "Subitem 2"
msgstr "Elemento 2"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7611,9 +7676,10 @@ msgid "Paint Tile"
msgstr "Disegna Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Shift + PDM: Traccia una linea\n"
"Shift + Ctrl + PDM: Colora il rettangolo"
@@ -7913,6 +7979,10 @@ msgid "TileSet"
msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(Solo GLES3)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr "Aggiungi Input +"
@@ -7989,6 +8059,11 @@ msgid "Duplicate Nodes"
msgstr "Duplica Nodi"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Incolla Nodi"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "Elimina Nodi"
@@ -7997,10 +8072,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "Tipo di Input Visual Shader Cambiato"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr "(Solo GLES3)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "Vertice"
@@ -8013,6 +8084,11 @@ msgid "Light"
msgstr "Luce"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Crea Nodo Shader"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr "Crea Nodo Shader"
@@ -8131,7 +8207,6 @@ msgid "Less Than or Equal (<=)"
msgstr "Minore o Uguale (<=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Not Equal (!=)"
msgstr "Non Uguale (!=)"
@@ -8379,10 +8454,11 @@ msgid "Returns the square root of the parameter."
msgstr "Ritorna la radice quadrata del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8393,10 +8469,11 @@ msgstr ""
"usando i polinomi di Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
@@ -8451,19 +8528,16 @@ msgid "Perform the texture lookup."
msgstr "Esegue la ricerca di texture."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Cubic texture uniform lookup."
-msgstr "Controllo dinamico dell'uniforme della texture cubica."
+msgstr "Controllo dell'uniforme della texture cubica."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "2D texture uniform lookup."
-msgstr "Controllo dinamico dell'uniforme della texture 2D."
+msgstr "Controllo dell'uniforme della texture 2D."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "2D texture uniform lookup with triplanar."
-msgstr "Controllo dinamico dell'uniforme della texture cubica con triplanar."
+msgstr "Controllo dell'uniforme della texture cubica con triplanar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform function."
@@ -8552,7 +8626,6 @@ msgid "Calculates the dot product of two vectors."
msgstr "Calcola il prodotto scalare di due vettori."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Returns the vector that points in the same direction as a reference vector. "
"The function has three vector parameters : N, the vector to orient, I, the "
@@ -8561,8 +8634,8 @@ msgid ""
msgstr ""
"Ritorna un vettore che punta nella stessa direzione di quello di "
"riferimento. La funzione ha tre vettori parametro: N, il vettore da "
-"orientare; I, il vettore incidente; ed Nref, il vettore di riferimento. Se "
-"il prodotto scalare di I ed Nref è minore di zero, il valore di ritorno è N. "
+"orientare; I, quello incidente; ed Nref, il vettore di riferimento. Se il "
+"prodotto scalare di I ed Nref è minore di zero, il valore di ritorno è N. "
"Altrimenti il ritorno sarà -N."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8574,6 +8647,11 @@ msgid "Linear interpolation between two vectors."
msgstr "Interpolazione lineare tra due vettori."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Interpolazione lineare tra due vettori."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr "Calcola il prodotto di normalizzazione del vettore."
@@ -8586,7 +8664,6 @@ msgid "1.0 / vector"
msgstr "1.0 / vettore"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Returns the vector that points in the direction of reflection ( a : incident "
"vector, b : normal vector )."
@@ -8595,15 +8672,15 @@ msgstr ""
"incidente, b : vettore normale )."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the vector that points in the direction of refraction."
msgstr "Ritorna un vettore che punta nella direzione della refrazione."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8614,10 +8691,11 @@ msgstr ""
"polinomiali di Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8628,20 +8706,22 @@ msgstr ""
"polinomiali di Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
"Ritorna 0.0 se 'x' è minore di 'edge', altrimenti 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
@@ -8695,69 +8775,67 @@ msgstr ""
"superfice e direzione della telecamera (passa gli input associati ad essa)."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
-msgstr "(solo GLES3) (Solo modalità Fragment/Light) Fuzione derivata scalare."
+msgstr "(Solo modalità Fragment/Light) Fuzione derivata scalare."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "(Fragment/Light mode only) Vector derivative function."
-msgstr ""
-"(solo GLES3) (Solo modalità Fragment/Light) Fuzione derivata vettoriale."
+msgstr "(Solo modalità Fragment/Light) Fuzione derivata vettoriale."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
"differencing."
msgstr ""
-"(solo GLES3) (Solo modalità Fragment/Light) (Vettore) Derivata in 'x' usando "
-"la differenziazione locale."
+"(Solo modalità Fragment/Light) (Vettore) Derivata in 'x' usando la "
+"differenziazione locale."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
"differencing."
msgstr ""
-"(solo GLES3) (Solo modalità Fragment/Light) (Scalare) Derivata in 'x' usando "
-"la differeziazione locale."
+"(Solo modalità Fragment/Light) (Scalare) Derivata in 'x' usando la "
+"differeziazione locale."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
"differencing."
msgstr ""
-"(solo GLES3) (soltanto modalità Fragment/Light) (Vettore) Derivata in 'y' "
-"usando la differenziazione locale."
+"(Soltanto modalità Fragment/Light) (Vettore) Derivata in 'y' usando la "
+"differenziazione locale."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
"differencing."
msgstr ""
-"(solo GLES3) (soltanto modalità Fragment/Light) (Scalare) Derivata in 'y' "
-"usando la differenziazione locale."
+"(Soltanto modalità Fragment/Light) (Scalare) Derivata in 'y' usando la "
+"differenziazione locale."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
-"(solo GLES3) (soltanto modalità Fragment/Light) (Vettore) Somma delle "
-"derivate assolute in 'x' ed 'y'."
+"(Soltanto modalità Fragment/Light) (Vettore) Somma delle derivate assolute "
+"in 'x' ed 'y'."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
-"(solo GLES3) (soltanto modalità Fragment/Light) (Scalare) Somma delle "
-"derivate assolute in 'x' ed 'y'."
+"(Soltanto modalità Fragment/Light) (Scalare) Somma delle derivate assolute "
+"in 'x' ed 'y'."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "VisualShader"
@@ -8933,6 +9011,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Le export templates per questa piattaforma sono mancanti:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Gestisci template d'esportazione"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "Esporta Con Debug"
@@ -9092,6 +9174,15 @@ msgid "Unnamed Project"
msgstr "Progetto Senza Nome"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Importa Progetto Esistente"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "Impossibile aprire il progetto a '%s'."
@@ -9188,12 +9279,13 @@ msgstr ""
"I contenuti della cartella di progetto non saranno modificati."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
-"Rimuovere tutti i progetti mancanti dalla lista?\n"
-"(Il contenuto delle cartelle di progetto non saranno modificati)"
+"Rimuovere %d progetti dalla lista?\n"
+"I contenuti delle cartelle di progetto non saranno modificati."
#: editor/project_manager.cpp
msgid ""
@@ -9218,8 +9310,9 @@ msgid "Project Manager"
msgstr "Gestore dei progetti"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Lista Progetti"
+#, fuzzy
+msgid "Projects"
+msgstr "Progetto"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9242,10 +9335,6 @@ msgid "Templates"
msgstr "Templates"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Esci"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Riavvia Ora"
@@ -9585,6 +9674,10 @@ msgstr "Lingue:"
msgid "AutoLoad"
msgstr "AutoLoad"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Plugins"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Zero"
@@ -9637,14 +9730,6 @@ msgstr "Seleziona il Metodo Virtuale"
msgid "Select Method"
msgstr "Seleziona Metodo"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "Impossibile eseguire lo strumento di PVRTC:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr "Impossibile ricaricare l'immagine convertita usando il tool PVRTC:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "Rinomina in Blocco"
@@ -9940,6 +10025,11 @@ msgid "Remove Node(s)"
msgstr "Rimuovi nodo(i)"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Cambia Nome porta Input"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9984,9 +10074,8 @@ msgid "Extend Script"
msgstr "Estendi Script"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
-msgstr "Reparent Nodo"
+msgstr "Reparent a Nuovo Nodo"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -10061,24 +10150,27 @@ msgid "Node configuration warning:"
msgstr "Avviso confugurazione nodo:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"Il nodo ha connessione(i) e gruppo(i).\n"
"Fai clic per mostrare i segnali dock."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"Il nodo ha connessioni.\n"
"Fai click per mostrare il dock segnali."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"Il nodo e in un gruppo.\n"
@@ -10177,6 +10269,11 @@ msgid "Error loading script from %s"
msgstr "Errore caricamento script da %s"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Sovrascrivi"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "N/A"
@@ -10205,9 +10302,8 @@ msgid "Script is valid."
msgstr "Lo script è valido."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr "Consentiti: a-z, A-Z, 0-9 e _"
+msgstr "Consentiti: a-z, A-Z, 0-9, _ e ."
#: editor/script_create_dialog.cpp
msgid "Built-in script (into scene file)."
@@ -10366,6 +10462,10 @@ msgid "Change Shortcut"
msgstr "Cambia Scorciatoia"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Impostazioni editor"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Scorciatoie"
@@ -10783,10 +10883,30 @@ msgid "Set Variable Type"
msgstr "Imposta Tipo di Variabile"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Non deve essere in conflitto con un nome di tipo built-in esistente."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Crea un nuovo rettangolo."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Valiabili:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Crea un nuovo rettangolo."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Crea un nuovo poligono."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Il nome non è un identificatore valido:"
@@ -10975,10 +11095,6 @@ msgid "Cut Nodes"
msgstr "Taglia Nodi"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Incolla Nodi"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "Modifica Membro"
@@ -11881,22 +11997,6 @@ msgstr ""
"Control, in modo che possa ottenere una dimensione. Altrimenti, renderlo un "
"RenderTarget e assegnare alla sua texture interna qualche nodo da mostrare."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Errore inizializzazione FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Formato font sconosciuto."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Errore caricamento font."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Dimensione font Invalida."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Ingresso"
@@ -11910,9 +12010,8 @@ msgid "Invalid source for shader."
msgstr "Sorgente non valida per la shader."
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid comparison function for that type."
-msgstr "Sorgente non valida per la shader."
+msgstr "Funzione di confronto non valida per quel tipo."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
@@ -11930,6 +12029,107 @@ msgstr "Varyings può essere assegnato soltanto nella funzione del vertice."
msgid "Constants cannot be modified."
msgstr "Le constanti non possono essere modificate."
+#~ msgid "No Matches"
+#~ msgstr "Nessuna corrispondenza"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Impossibile aprire file_type_cache.cch per scrittura, non salvo la cache "
+#~ "dei tipi di file!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "Impossibile navigare a '%s' perché non è stato trovato nel file system!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Errore di caricamento immagine:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Nessun pixel con trasparenza >128 nell'immagine..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Il genitore non ha facce solde da popolare."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Impossibile mappare l'area."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Le facce non contengono area!"
+
+#~ msgid "No faces!"
+#~ msgstr "Nessuna faccia!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Errore: impossibile caricare il file."
+
+#~ msgid "Error could not load file."
+#~ msgstr "Errore: impossibile caricare il file."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Abilita Doppler"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Modalità di Selezione (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Modalità Movimento (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Modalità Rotazione (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Modalità Scala (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Coordinate locali"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Modalità Snap (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Strumento Seleziona"
+
+#~ msgid "Tool Move"
+#~ msgstr "Strumento Sposta"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Strumento Ruota"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Strumento Scala"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "Rimuovere tutti i progetti mancanti dalla lista?\n"
+#~ "(Il contenuto delle cartelle di progetto non saranno modificati)"
+
+#~ msgid "Project List"
+#~ msgstr "Lista Progetti"
+
+#~ msgid "Exit"
+#~ msgstr "Esci"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "Impossibile eseguire lo strumento di PVRTC:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr "Impossibile ricaricare l'immagine convertita usando il tool PVRTC:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Errore inizializzazione FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Formato font sconosciuto."
+
+#~ msgid "Error loading font."
+#~ msgstr "Errore caricamento font."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Dimensione font Invalida."
+
#~ msgid "Previous Folder"
#~ msgstr "Cartella precedente"
@@ -12534,9 +12734,6 @@ msgstr "Le constanti non possono essere modificate."
#~ msgid "Erase selection"
#~ msgstr "Cancella selezione"
-#~ msgid "Could not find tile:"
-#~ msgstr "Impossibile trovare tile:"
-
#~ msgid "Item name or ID:"
#~ msgstr "Nome elemento o ID:"
@@ -12807,9 +13004,6 @@ msgstr "Le constanti non possono essere modificate."
#~ msgid "Info"
#~ msgstr "Info"
-#~ msgid "Re-Import..."
-#~ msgstr "Re-Importa..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "Nessuna bit mask da importare!"
@@ -13203,9 +13397,6 @@ msgstr "Le constanti non possono essere modificate."
#~ msgid "Stereo"
#~ msgstr "Stereo"
-#~ msgid "Window"
-#~ msgstr "Finestra"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Scalando a %s%%."
@@ -13436,9 +13627,6 @@ msgstr "Le constanti non possono essere modificate."
#~ msgid "Add Image Group"
#~ msgstr "Aggiungi Gruppo Immagini"
-#~ msgid "Delete Image Group"
-#~ msgstr "Elimina Gruppo Immagini"
-
#~ msgid "Project Export Settings"
#~ msgstr "Impostazioni Esportazione Progetto"
@@ -13523,9 +13711,6 @@ msgstr "Le constanti non possono essere modificate."
#~ msgid "Export Project PCK"
#~ msgstr "Esporta Progetto PCK"
-#~ msgid "Export..."
-#~ msgstr "Esporta..."
-
#~ msgid "Project Export"
#~ msgstr "Esportazione Progetto"
@@ -13628,9 +13813,6 @@ msgstr "Le constanti non possono essere modificate."
#~ msgid "Deploy File Server Clients"
#~ msgstr "Distribuisci i Client del File Server"
-#~ msgid "Group Editor"
-#~ msgstr "Editor Gruppo"
-
#~ msgid "%d frames"
#~ msgstr "%d frames"
diff --git a/editor/translations/ja.po b/editor/translations/ja.po
index 689a7f3e2b..3e529af0cb 100644
--- a/editor/translations/ja.po
+++ b/editor/translations/ja.po
@@ -15,7 +15,7 @@
# Tohru Ike (rokujyouhitoma) <rokujyouhitomajp@gmail.com>, 2017-2018.
# yu tang <0011solo@gmail.com>, 2018.
# zukkun <zukkun@gmail.com>, 2018.
-# sugusan <sugusan.development@gmail.com>, 2018.
+# sugusan <sugusan.development@gmail.com>, 2018, 2019.
# Nathan Lovato <nathan.lovato.art@gmail.com>, 2018.
# nyanode <akaruooyagi@yahoo.co.jp>, 2018.
# nitenook <admin@alterbaum.net>, 2018, 2019.
@@ -23,12 +23,15 @@
# Hidetsugu Takahashi <manzyun@gmail.com>, 2019.
# Wataru Onuki <watonu@magadou.com>, 2019.
# John Smith <weblater_jp@susa.eek.jp>, 2019.
+# Takuya Watanabe <watanabe@zblog.sakura.ne.jp>, 2019.
+# Sodium11 <Sodium11.for.gitserver@gmail.com>, 2019.
+# leela <53352@protonmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-29 19:20+0000\n"
-"Last-Translator: John Smith <weblater_jp@susa.eek.jp>\n"
+"PO-Revision-Date: 2019-08-29 13:35+0000\n"
+"Last-Translator: leela <53352@protonmail.com>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/"
"godot/ja/>\n"
"Language: ja\n"
@@ -36,7 +39,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -78,7 +81,6 @@ msgid "On call to '%s':"
msgstr "'%s' ã¸ã®å‘¼ã³å‡ºã—:"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "解放"
@@ -209,9 +211,8 @@ msgid "Animation length (frames)"
msgstr "アニメーションã®é•·ã• (フレーム)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (seconds)"
-msgstr "アニメーションã®é•·ã• (ç§’)"
+msgstr "アニメーションã®é•·ã•(ç§’)"
#: editor/animation_track_editor.cpp
msgid "Add Track"
@@ -432,9 +433,8 @@ msgid "Add Transform Track Key"
msgstr "変æ›ãƒˆãƒ©ãƒƒã‚¯ã‚­ãƒ¼ã‚’追加"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track Key"
-msgstr "トラックを追加"
+msgstr "トラックキーを追加"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
@@ -625,7 +625,7 @@ msgstr "ã™ã¹ã¦ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’クリーンアップ"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation(s) (NO UNDO!)"
-msgstr "ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ï¼ˆã€Œå…ƒã«æˆ»ã™ã€ä¸å¯!)"
+msgstr "アニメーションをクリーンアップ (å…ƒã«æˆ»ã›ã¾ã›ã‚“!)"
#: editor/animation_track_editor.cpp
msgid "Clean-Up"
@@ -649,9 +649,8 @@ msgid "Copy"
msgstr "コピー"
#: editor/animation_track_editor_plugins.cpp
-#, fuzzy
msgid "Add Audio Track Clip"
-msgstr "オーディオクリップ:"
+msgstr "オーディオトラッククリップã®è¿½åŠ "
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
@@ -682,16 +681,18 @@ msgid "Line Number:"
msgstr "行番å·:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "ï¼…dä»¶ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚"
+msgid "Replaced %d occurrence(s)."
+msgstr "%d 箇所を置æ›ã—ã¾ã—ãŸã€‚"
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "一致ãªã—"
+#, fuzzy
+msgid "%d match."
+msgstr "ï¼…dä»¶ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d 箇所を置æ›ã—ã¾ã—ãŸã€‚"
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "ï¼…dä»¶ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -916,8 +917,7 @@ msgstr "ãŠæ°—ã«å…¥ã‚Š:"
msgid "Recent:"
msgstr "最近:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -945,22 +945,20 @@ msgid "Dependencies For:"
msgstr "次ã®ä¾å­˜é–¢ä¿‚:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will only take effect when reloaded."
msgstr ""
"シーン '%s' ã¯ç¾åœ¨ç·¨é›†ä¸­ã§ã™ã€‚\n"
-"å†èª­è¾¼ã¿ã—ãªã„é™ã‚Šã€å¤‰æ›´ã¯å映ã•れã¾ã›ã‚“。"
+"変更ã¯å†èª­è¾¼ã¿å¾Œã«å映ã•れã¾ã™ã€‚"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Resource '%s' is in use.\n"
"Changes will only take effect when reloaded."
msgstr ""
"リソース '%s' ã¯ä½¿ç”¨ä¸­ã§ã™ã€‚\n"
-"変更ã¯å†èª­è¾¼ã¿æ™‚ã«é©ç”¨ã•れã¾ã™ã€‚"
+"変更ã¯å†èª­è¾¼ã¿å¾Œã«å映ã•れã¾ã™ã€‚"
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -1008,7 +1006,7 @@ msgstr "次ã®ã‚ªãƒ¼ãƒŠãƒ¼:"
#: editor/dependency_editor.cpp
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr "é¸æŠžã—ãŸãƒ•ァイルをプロジェクトã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹?(å…ƒã«æˆ»ã›ã¾ã›ã‚“)"
+msgstr "é¸æŠžã—ãŸãƒ•ァイルをプロジェクトã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹? (å…ƒã«æˆ»ã›ã¾ã›ã‚“)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1017,9 +1015,9 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
"除去ã—よã†ã¨ã—ã¦ã„るファイルã¯ä»–ã®ãƒªã‚½ãƒ¼ã‚¹ã®å‹•作ã«å¿…è¦ã§ã™ã€‚\n"
-"無視ã—ã¦é™¤åŽ»ã—ã¾ã™ã‹ï¼Ÿï¼ˆã€Œå…ƒã«æˆ»ã™ã€ä¸å¯ï¼‰"
+"無視ã—ã¦é™¤åŽ»ã—ã¾ã™ã‹ï¼Ÿ (å…ƒã«æˆ»ã›ã¾ã›ã‚“)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "除去ä¸å¯:"
@@ -1049,13 +1047,13 @@ msgstr "読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ï¼"
#: editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr "%d 個ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’完全ã«å‰Šé™¤ã—ã¾ã™ã‹?ï¼ˆã€Œå…ƒã«æˆ»ã™ã€ä¸å¯!)"
+msgstr "%d 個ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’完全ã«å‰Šé™¤ã—ã¾ã™ã‹?ï¼ˆå…ƒã«æˆ»ã›ã¾ã›ã‚“!)"
#: editor/dependency_editor.cpp
msgid "Show Dependencies"
msgstr "ä¾å­˜é–¢ä¿‚を表示"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "孤立リソース エクスプローラー"
@@ -1144,23 +1142,26 @@ msgid "License"
msgstr "ライセンス"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
-msgstr "サードパーティ ライセンス"
+#, fuzzy
+msgid "Third-party Licenses"
+msgstr "サードパーティーライセンス"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
-"Godot Engineã¯ã€MITライセンスã¨äº’æ›æ€§ã®ã‚ã‚‹ã€å¤šæ•°ã®ã‚µãƒ¼ãƒ‰ãƒ‘ーティ製ã®ãƒ•リーãŠ"
-"よã³ã‚ªãƒ¼ãƒ—ンソースライブラリã«ä¾å­˜ã—ã¦ã„ã¾ã™ã€‚ 以下ã¯ã€ã‚µãƒ¼ãƒ‰ãƒ‘ーティ製コン"
-"ãƒãƒ¼ãƒãƒ³ãƒˆã®å„著作権ãŠã‚ˆã³ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ¡é …ã®ç·è¦§ã§ã™ã€‚"
+"Godot Engineã¯ã€MITãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã®æ¡é …ã¨äº’æ›æ€§ã®ã‚ã‚‹ã€å¤šæ•°ã®ã‚µãƒ¼ãƒ‰ãƒ‘ーティã®ãƒ•"
+"リーãŠã‚ˆã³ã‚ªãƒ¼ãƒ—ンソースライブラリを利用ã—ã¦ã„ã¾ã™ã€‚ 以下ã¯ã€ãã®ã‚ˆã†ãªã™ã¹ã¦"
+"ã®ã‚µãƒ¼ãƒ‰ãƒ‘ーティコンãƒãƒ¼ãƒãƒ³ãƒˆã®ãれãžã‚Œã®è‘—作権表示ã¨ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ¡é …を網羅ã—"
+"ãŸãƒªã‚¹ãƒˆã§ã™ã€‚"
#: editor/editor_about.cpp
msgid "All Components"
-msgstr "全コンãƒãƒ¼ãƒãƒ³ãƒˆ"
+msgstr "å…¨ã¦ã®ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆ"
#: editor/editor_about.cpp
msgid "Components"
@@ -1171,7 +1172,8 @@ msgid "Licenses"
msgstr "ライセンス"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "パッケージファイルを開ã‘ã¾ã›ã‚“ã§ã—ãŸã€‚zip å½¢å¼ã§ã¯ã‚りã¾ã›ã‚“。"
#: editor/editor_asset_installer.cpp
@@ -1588,7 +1590,7 @@ msgstr "ファイルシステムã¨ã‚¤ãƒ³ãƒãƒ¼ãƒˆãƒ‰ãƒƒã‚¯"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
-msgstr "プロファイル '%s'を消去ã—ã¾ã™ã‹ï¼Ÿ(å…ƒã«æˆ»ã›ã¾ã›ã‚“)"
+msgstr "プロファイル '%s'を消去ã—ã¾ã™ã‹? (å…ƒã«æˆ»ã›ã¾ã›ã‚“)"
#: editor/editor_feature_profile.cpp
msgid "Profile must be a valid filename and must not contain '.'"
@@ -1644,9 +1646,8 @@ msgstr ""
"ンãƒãƒ¼ãƒˆã¯ä¸­æ­¢ã•れã¾ã—ãŸã€‚"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Error saving profile to path: '%s'."
-msgstr "テンプレート %s 読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼"
+msgstr "指定ã•れãŸãƒ‘スã¸ã®ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: '%s'."
#: editor/editor_feature_profile.cpp
msgid "Unset"
@@ -1666,12 +1667,11 @@ msgid "New"
msgstr "æ–°è¦"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "インãƒãƒ¼ãƒˆ"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "エクスãƒãƒ¼ãƒˆ"
@@ -1680,33 +1680,28 @@ msgid "Available Profiles:"
msgstr "利用å¯èƒ½ãªãƒ—ロファイル:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options"
-msgstr "クラスã®èª¬æ˜Ž"
+msgstr "クラスオプション"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "New profile name:"
-msgstr "æ–°ã—ã„åå‰:"
+msgstr "æ–°ã—ã„プロファイルã®åå‰:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Erase Profile"
-msgstr "タイルマップを消去"
+msgstr "プロファイルを消去"
#: editor/editor_feature_profile.cpp
msgid "Import Profile(s)"
msgstr "プロファイルã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Export Profile"
-msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
+msgstr "プロファイルã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Manage Editor Feature Profiles"
-msgstr "エクスãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レートã®ç®¡ç†"
+msgstr "エディタ機能ã®ãƒ—ロファイルã®ç®¡ç†"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select Current Folder"
@@ -1813,33 +1808,28 @@ msgid "Move Favorite Down"
msgstr "ãŠæ°—ã«å…¥ã‚Šã‚’下ã¸"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "親フォルダã¸ç§»å‹•ã™ã‚‹ã€‚"
+msgstr "å‰ã®ãƒ•ォルダã¸ç§»å‹•ã™ã‚‹ã€‚"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "親フォルダã¸ç§»å‹•ã™ã‚‹ã€‚"
+msgstr "次ã®ãƒ•ォルダã¸ç§»å‹•ã™ã‚‹ã€‚"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "親フォルダã¸ç§»å‹•ã™ã‚‹ã€‚"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "ファイル検索"
+msgstr "ファイル更新。"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "(Un)favorite current folder."
-msgstr "フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
+msgstr "ç¾åœ¨ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’ãŠæ°—ã«å…¥ã‚Šã«ã™ã‚‹/ãŠæ°—ã«å…¥ã‚Šã‹ã‚‰å¤–ã™ã€‚"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "éš ã—ファイルã®åˆ‡ã‚Šæ›¿ãˆ"
+msgstr "éš ã—ファイルã®è¡¨ç¤º/éžè¡¨ç¤ºã‚’切り替ãˆã¾ã™ã€‚"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
@@ -2063,9 +2053,8 @@ msgid "Output:"
msgstr "出力:"
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "é¸æŠžã—ã¦ã„ã‚‹ã‚‚ã®ã‚’削除"
+msgstr "é¸æŠžç¯„å›²ã‚’ã‚³ãƒ”ãƒ¼"
#: editor/editor_log.cpp editor/editor_profiler.cpp
#: editor/editor_properties.cpp
@@ -2081,6 +2070,11 @@ msgstr "クリア"
msgid "Clear Output"
msgstr "出力をクリア"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "ウィンドウ"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãŒã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ %d ã§å¤±æ•—ã—ã¾ã—ãŸã€‚"
@@ -2278,12 +2272,11 @@ msgstr "シーンを開ã"
#: editor/editor_node.cpp
msgid "Open Base Scene"
-msgstr "基本シーンを開ã"
+msgstr "ベースã®ã‚·ãƒ¼ãƒ³ã‚’é–‹ã"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "シーンã®ã‚¯ã‚¤ãƒƒã‚¯ã‚ªãƒ¼ãƒ—ン..."
+msgstr "クイックオープン..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
@@ -2302,14 +2295,12 @@ msgid "Save changes to '%s' before closing?"
msgstr "é–‰ã˜ã‚‹å‰ã«ã€'%s' ã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Saved %s modified resource(s)."
-msgstr "リソースã®èª­è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
+msgstr "ï¼…s個ã®å¤‰æ›´ã•れãŸãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã—ã¾ã—ãŸã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "A root node is required to save the scene."
-msgstr "大ããªãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ãŸã‚ã«ä¸€ã¤ãƒ•ァイルãŒå¿…è¦ã§ã™"
+msgstr "シーンをä¿å­˜ã™ã‚‹ã«ã¯ãƒ«ãƒ¼ãƒˆãƒŽãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™ã€‚"
#: editor/editor_node.cpp
msgid "Save Scene As..."
@@ -2361,7 +2352,7 @@ msgstr "å…ƒã«æˆ»ã™"
#: editor/editor_node.cpp
msgid "This action cannot be undone. Revert anyway?"
-msgstr "ã“ã®æ“作ã¯ã€Œå…ƒã«æˆ»ã™ã€ã¯ã§ãã¾ã›ã‚“。ãれã§ã‚‚å…ƒã«æˆ»ã—ã¾ã™ã‹ï¼Ÿ"
+msgstr "ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。ãれã§ã‚‚å…ƒã«æˆ»ã—ã¾ã™ã‹?"
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2405,6 +2396,15 @@ msgid "Pick a Main Scene"
msgstr "メインシーンをé¸ã¶"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "シーンを閉ã˜ã‚‹"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "シーンを閉ã˜ã‚‹"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr "アドオンプラグインを有効ã«ã§ãã¾ã›ã‚“: '%s' 設定ã®è§£æžã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
@@ -2518,6 +2518,11 @@ msgstr "シーンをプレイ"
msgid "Close Tab"
msgstr "タブを閉ã˜ã‚‹"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "タブを閉ã˜ã‚‹"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "ä»–ã®ã‚¿ãƒ–ã‚’é–‰ã˜ã‚‹"
@@ -2527,9 +2532,8 @@ msgid "Close Tabs to the Right"
msgstr "タブをå³ã«é–‰ã˜ã‚‹"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "ã™ã¹ã¦é–‰ã˜ã‚‹"
+msgstr "ã™ã¹ã¦ã®ã‚¿ãƒ–ã‚’é–‰ã˜ã‚‹"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2603,6 +2607,10 @@ msgstr "æ–°ã—ã„継承ã—ãŸã‚·ãƒ¼ãƒ³..."
msgid "Open Scene..."
msgstr "シーンを開ã..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "最近開ã„ãŸã‚·ãƒ¼ãƒ³ã‚’é–‹ã"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "シーンをä¿å­˜"
@@ -2612,14 +2620,6 @@ msgid "Save All Scenes"
msgstr "å…¨ã¦ã®ã‚·ãƒ¼ãƒ³ã‚’ä¿å­˜"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "シーンを閉ã˜ã‚‹"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "最近開ã„ãŸã‚·ãƒ¼ãƒ³ã‚’é–‹ã"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "変æ›..."
@@ -2649,25 +2649,37 @@ msgstr "ã‚·ãƒ¼ãƒ³ã‚’å…ƒã«æˆ»ã™"
msgid "Miscellaneous project or scene-wide tools."
msgstr "ãã®ä»–ã®ãƒ—ロジェクトã¾ãŸã¯ã‚·ãƒ¼ãƒ³å…¨ä½“ã®ãƒ„ール。"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "プロジェクト"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "プロジェクト設定"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "ツール"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "エクスãƒãƒ¼ãƒˆ"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Androidビルドテンプレートã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "プロジェクトã®ãƒ‡ãƒ¼ã‚¿ãƒ•ォルダを開ã"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "ツール"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Androidビルドテンプレートã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "孤立リソース エクスプローラー"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2764,12 +2776,13 @@ msgstr ""
"るよã†ã«ãªã‚Šã¾ã™ã€‚\n"
"リモート実行ã®å ´åˆã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ•ァイルシステムを使ã†ã¨ã‚ˆã‚ŠåŠ¹æžœçš„ã§ã™ã€‚"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "エディタ"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "エディタ設定"
#: editor/editor_node.cpp
@@ -2806,14 +2819,15 @@ msgstr "エディタ設定ã®ãƒ•ォルダを開ã"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
-msgstr "エクスãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レートã®ç®¡ç†"
+msgid "Manage Editor Features..."
+msgstr "エディタ機能ã®ç®¡ç†"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "エクスãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レートã®ç®¡ç†"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "ヘルプ"
@@ -2821,12 +2835,13 @@ msgstr "ヘルプ"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "検索"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "オンラインドキュメント"
@@ -2942,9 +2957,8 @@ msgstr ""
"ãã ã•ã„。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Templates"
-msgstr "エクスãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レートã®ç®¡ç†"
+msgstr "テンプレートã®ç®¡ç†"
#: editor/editor_node.cpp
msgid ""
@@ -3106,9 +3120,8 @@ msgid "Calls"
msgstr "呼出ã—"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "テーマを編集..."
+msgstr "テキストを編集:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3281,7 +3294,8 @@ msgid "Import From Node:"
msgstr "ノードã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆ:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "å†ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰"
#: editor/export_template_manager.cpp
@@ -3290,7 +3304,7 @@ msgstr "アンインストール"
#: editor/export_template_manager.cpp
msgid "(Installed)"
-msgstr "(インストール済)"
+msgstr "(インストール済)"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3298,12 +3312,16 @@ msgid "Download"
msgstr "ダウンロード"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(見ã¤ã‹ã‚Šã¾ã›ã‚“)"
#: editor/export_template_manager.cpp
msgid "(Current)"
-msgstr "(ç¾åœ¨ã®ï¼‰"
+msgstr "(ç¾åœ¨)"
#: editor/export_template_manager.cpp
msgid "Retrieving mirrors, please wait..."
@@ -3361,12 +3379,10 @@ msgid "No response."
msgstr "応答ãŒã‚りã¾ã›ã‚“。"
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "リクエストã¯å¤±æ•—ã—ã¾ã—ãŸã€‚"
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "リダイレクトã®ãƒ«ãƒ¼ãƒ—。"
@@ -3380,15 +3396,22 @@ msgid "Download Complete."
msgstr "ダウンロードãŒå®Œäº†ã—ã¾ã—ãŸã€‚"
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "ファイルã«ãƒ†ãƒ¼ãƒžã‚’ä¿å­˜ã§ãã¾ã›ã‚“:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"テンプレートã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ å•題ã®ãƒ†ãƒ³ãƒ—レートã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–㯠"
"'%s' ã«ã‚りã¾ã™ã€‚"
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "URL リクエストã®ã‚¨ãƒ©ãƒ¼: "
#: editor/export_template_manager.cpp
@@ -3438,9 +3461,8 @@ msgid "SSL Handshake Error"
msgstr "SSL ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚¨ãƒ©ãƒ¼"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Uncompressing Android Build Sources"
-msgstr "アセットを展開"
+msgstr "Androidビルドソースã®è§£å‡"
#: editor/export_template_manager.cpp
msgid "Current Version:"
@@ -3474,23 +3496,11 @@ msgstr "テンプレートをダウンロード"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "リストã‹ã‚‰ãƒŸãƒ©ãƒ¼ã‚’é¸æŠž: (Shift+クリック: ブラウザã§é–‹ã)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"書ãå‡ºã—æ™‚ã«file_type_cache.cchを確èªã§ãã¾ã›ã‚“。ファイルタイプã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’"
-"ä¿å­˜ã§ãã¾ã›ã‚“!\n"
-"ファイルタイプキャッシュをä¿å­˜ã›ãšã« file_type_cache.cch を書込ã¿ç”¨ã«é–‹ãã“ã¨"
-"ã¯ã§ãã¾ã›ã‚“ï¼"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "ãŠæ°—ã«å…¥ã‚Š"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "ファイルシステム上㧠'%s' を見ã¤ã‘られãªã„ãŸã‚移動ã§ãã¾ã›ã‚“ï¼"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"ステータス: ファイルã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ファイルを修正ã—ã¦æ‰‹å‹•ã§å†ã‚¤"
@@ -3525,14 +3535,14 @@ msgid "Provided name contains invalid characters."
msgstr "åå‰ã«ä½¿ç”¨ã§ããªã„文字ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "åå‰ã«ä½¿ç”¨ã§ããªã„文字ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚"
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "åŒåã®ãƒ•ァイルã¾ãŸã¯ãƒ•ォルダãŒã‚りã¾ã™ã€‚"
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "åå‰ã«ä½¿ç”¨ã§ããªã„文字ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚"
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "ファイルåを変更:"
@@ -3549,9 +3559,8 @@ msgid "Duplicating folder:"
msgstr "フォルダを複製:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Inherited Scene"
-msgstr "æ–°ã—ã„継承ã—ãŸã‚·ãƒ¼ãƒ³..."
+msgstr "æ–°ã—ã„継承ã—ãŸã‚·ãƒ¼ãƒ³"
#: editor/filesystem_dock.cpp
msgid "Open Scenes"
@@ -3589,6 +3598,11 @@ msgstr "複製..."
msgid "Move To..."
msgstr "移動..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "æ–°è¦ã‚·ãƒ¼ãƒ³"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト..."
@@ -3615,14 +3629,12 @@ msgid "Rename"
msgstr "åå‰ã®å¤‰æ›´"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Previous Folder/File"
-msgstr "å‰ã®åºŠé¢"
+msgstr "å‰ã®ãƒ•ォルダ/ファイル"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Next Folder/File"
-msgstr "次ã®åºŠé¢"
+msgstr "次ã®ãƒ•ォルダ/ファイル"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
@@ -3657,6 +3669,11 @@ msgstr "ã“ã®ãƒ‘スã«ã¯ã€æ—¢ã«åŒåã®ãƒ•ァイルã‹ãƒ•ォルダãŒã‚り
msgid "Overwrite"
msgstr "上書ã"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "シーンã‹ã‚‰ç”Ÿæˆ"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "スクリプト作æˆ"
@@ -3707,7 +3724,7 @@ msgstr "ç½®æ›: "
#: editor/find_in_files.cpp
msgid "Replace all (no undo)"
-msgstr "ã™ã¹ã¦ç½®æ›ï¼ˆã€Œå…ƒã«æˆ»ã™ã€ä¸å¯ï¼‰"
+msgstr "ã™ã¹ã¦ç½®æ› (å…ƒã«æˆ»ã›ã¾ã›ã‚“)"
#: editor/find_in_files.cpp
msgid "Searching..."
@@ -3718,6 +3735,14 @@ msgid "Search complete"
msgstr "検索完了"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "グループã«è¿½åŠ "
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "グループã‹ã‚‰é™¤åŽ»"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "グループåãŒæ—¢ã«ã‚りã¾ã™ã€‚"
@@ -3725,12 +3750,23 @@ msgstr "グループåãŒæ—¢ã«ã‚りã¾ã™ã€‚"
msgid "Invalid group name."
msgstr "無効ãªã‚°ãƒ«ãƒ¼ãƒ—åã§ã™ã€‚"
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "グループã®ç®¡ç†"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "レイアウトã®å‰Šé™¤"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "グループ"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "グループã«ãªã„ノード"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3743,12 +3779,13 @@ msgid "Nodes in Group"
msgstr "グループ内ノード"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "グループã«è¿½åŠ "
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "グループã‹ã‚‰é™¤åŽ»"
+#, fuzzy
+msgid "Group Editor"
+msgstr "スクリプトエディタ"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3956,7 +3993,8 @@ msgid "MultiNode Set"
msgstr "マルãƒãƒŽãƒ¼ãƒ‰ セット"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "シグナルã¨ã‚°ãƒ«ãƒ¼ãƒ—を編集ã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠžã€‚"
#: editor/plugin_config_dialog.cpp
@@ -4046,19 +4084,16 @@ msgstr "読ã¿è¾¼ã‚€.."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Move Node Point"
-msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’移動"
+msgstr "ノードãƒã‚¤ãƒ³ãƒˆã‚’移動"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace1D Limits"
-msgstr "ブレンド時間ã®å¤‰æ›´"
+msgstr "BlendSpace1Dã®åˆ¶é™ã‚’変更ã™ã‚‹"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace1D Labels"
-msgstr "ブレンド時間ã®å¤‰æ›´"
+msgstr "BlendSpace1Dã®ãƒ©ãƒ™ãƒ«ã‚’変更ã™ã‚‹"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4068,20 +4103,17 @@ msgstr "ã“ã®ã‚¿ã‚¤ãƒ—ã®ãƒŽãƒ¼ãƒ‰ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。ルートノード
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Node Point"
-msgstr "ノードを追加"
+msgstr "ノードãƒã‚¤ãƒ³ãƒˆã‚’追加"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Animation Point"
-msgstr "アニメーションを追加"
+msgstr "アニメーションãƒã‚¤ãƒ³ãƒˆã‚’追加"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Remove BlendSpace1D Point"
-msgstr "パスã®ãƒã‚¤ãƒ³ãƒˆã‚’除去"
+msgstr "BlendSpace1Dã®ãƒã‚¤ãƒ³ãƒˆã‚’削除"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Move BlendSpace1D Node Point"
@@ -4131,24 +4163,20 @@ msgid "Triangle already exists."
msgstr "ä¸‰è§’å½¢ãŒæ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Triangle"
-msgstr "変数を追加"
+msgstr "三角形を追加"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace2D Limits"
-msgstr "ブレンド時間ã®å¤‰æ›´"
+msgstr "BlendSpace2Dã®åˆ¶é™ã‚’変更ã™ã‚‹"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace2D Labels"
-msgstr "ブレンド時間ã®å¤‰æ›´"
+msgstr "BlendSpace2Dã®ãƒ©ãƒ™ãƒ«ã‚’変更ã™ã‚‹"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Remove BlendSpace2D Point"
-msgstr "パスã®ãƒã‚¤ãƒ³ãƒˆã‚’除去"
+msgstr "BlendSpace2Dã®ãƒã‚¤ãƒ³ãƒˆã‚’削除ã™ã‚‹"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Remove BlendSpace2D Triangle"
@@ -4185,9 +4213,8 @@ msgid "Blend:"
msgstr "ブレンド:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Parameter Changed"
-msgstr "マテリアルã®å¤‰æ›´"
+msgstr "パラメータãŒå¤‰æ›´ã•れã¾ã—ãŸ"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -4199,9 +4226,8 @@ msgid "Output node can't be added to the blend tree."
msgstr "出力ノードをブレンドツリーã«è¿½åŠ ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Add Node to BlendTree"
-msgstr "シーンã‹ã‚‰ã®ãƒŽãƒ¼ãƒ‰"
+msgstr "BlendTreeã«ãƒŽãƒ¼ãƒ‰ã‚’追加"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -4226,9 +4252,8 @@ msgid "Nodes Disconnected"
msgstr "切断ã•れã¾ã—ãŸ"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Set Animation"
-msgstr "æ–°è¦ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³"
+msgstr "アニメーションを設定"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -4241,14 +4266,12 @@ msgid "Delete Node(s)"
msgstr "ノードを削除"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Filter On/Off"
-msgstr "ã“ã®ãƒˆãƒ©ãƒƒã‚¯ã® オン/オフ を切り替ãˆã€‚"
+msgstr "フィルター㮠オン/オフ を切り替ãˆ"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Change Filter"
-msgstr "ブレンドã™ã‚‹æ™‚間を変更"
+msgstr "フィルターを変更"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
@@ -4270,9 +4293,8 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Renamed"
-msgstr "ノードå"
+msgstr "ノードã®åå‰ãŒå¤‰æ›´ã•れã¾ã—ãŸ"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -4420,9 +4442,8 @@ msgid "Enable Onion Skinning"
msgstr "オニオンスキンを有効ã«ã™ã‚‹"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Onion Skinning Options"
-msgstr "オニオンスキン"
+msgstr "オニオンスキンオプション"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Directions"
@@ -4497,14 +4518,12 @@ msgid "Cross-Animation Blend Times"
msgstr "アニメーション間ã®ãƒ–レンド時間"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Move Node"
-msgstr "追加ã—ãŸã‚­ãƒ¼ã‚’移動"
+msgstr "ノードを移動"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Add Transition"
-msgstr "翻訳を追加"
+msgstr "トランジションを追加"
#: editor/plugins/animation_state_machine_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -4540,14 +4559,12 @@ msgid "No playback resource set at path: %s."
msgstr "パス( %s )ã«å†ç”Ÿãƒªã‚½ãƒ¼ã‚¹ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“。"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Removed"
-msgstr "å–り除ã„ãŸã®ã¯:"
+msgstr "ノードãŒå‰Šé™¤ã•れã¾ã—ãŸ"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition Removed"
-msgstr "トランジション ノード"
+msgstr "トランジションãŒå‰Šé™¤ã•れã¾ã—ãŸ"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set Start Node (Autoplay)"
@@ -4737,10 +4754,6 @@ msgid "View Files"
msgstr "ファイルを表示"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "ホストåを解決ã§ãã¾ã›ã‚“:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "接続エラー。å†è©¦è¡Œã—ã¦ãã ã•ã„。"
@@ -4753,14 +4766,47 @@ msgid "No response from host:"
msgstr "ホストã‹ã‚‰å¿œç­”ãŒã‚りã¾ã›ã‚“:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "ホストåを解決ã§ãã¾ã›ã‚“:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "リクエスト失敗。リターンコード:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "リクエストã¯å¤±æ•—ã—ã¾ã—ãŸã€‚"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "ファイルã«ãƒ†ãƒ¼ãƒžã‚’ä¿å­˜ã§ãã¾ã›ã‚“:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "リクエスト失敗。リダイレクトéŽå¤š"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "リダイレクトã®ãƒ«ãƒ¼ãƒ—。"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "リクエスト失敗。リターンコード:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "時間"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
"ダウンロードãƒãƒƒã‚·ãƒ¥ãŒä¸æ­£ã§ã™ã€‚ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ”¹ã–ã‚“ ã•れã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。"
@@ -4838,8 +4884,13 @@ msgid "All"
msgstr "ã™ã¹ã¦"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆ..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "プラグイン"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4860,7 +4911,8 @@ msgid "Site:"
msgstr "サイト:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "サãƒãƒ¼ãƒˆ..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4872,6 +4924,11 @@ msgid "Testing"
msgstr "テスト中"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "読ã¿è¾¼ã‚€.."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "アセットã®zipファイル"
@@ -5036,6 +5093,11 @@ msgid "Paste Pose"
msgstr "ãƒãƒ¼ã‚ºã‚’貼り付ã‘"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "ボーンをクリアã™ã‚‹"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "ノードã‹ã‚‰ã‚«ã‚¹ã‚¿ãƒ ãƒœãƒ¼ãƒ³ã‚’作æˆ"
@@ -5064,6 +5126,7 @@ msgid "Zoom Reset"
msgstr "ズームをリセット"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "é¸æŠžãƒ¢ãƒ¼ãƒ‰"
@@ -5082,19 +5145,21 @@ msgstr ""
"(移動中)。"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Alt+RMB: Depth list selection"
-msgstr "Alt+å³ã‚¯ãƒªãƒƒã‚¯: デプス(深ã•)リストã®é¸æŠž"
+msgstr "Alt+å³ã‚¯ãƒªãƒƒã‚¯: 奥行ã(被写界深度)リストã®é¸æŠž"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "移動モード"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "回転モード"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "スケールモード"
@@ -5120,6 +5185,7 @@ msgid "Toggle snapping."
msgstr "スナッピングを切り替ãˆã‚‹ã€‚"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "スナップを使ã†"
@@ -5136,11 +5202,6 @@ msgid "Use Rotation Snap"
msgstr "回転スナップを使ã†"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "スナップã®è¨­å®š..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "相対スナップ"
@@ -5153,6 +5214,11 @@ msgid "Smart Snapping"
msgstr "スマートスナップ"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "スナップã®è¨­å®š..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "親ã«ã‚¹ãƒŠãƒƒãƒ—"
@@ -5271,9 +5337,8 @@ msgid "Scale mask for inserting keys."
msgstr "キーを挿入ã™ã‚‹ãŸã‚ã®ã‚¹ã‚±ãƒ¼ãƒ«ãƒžã‚¹ã‚¯ã€‚"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys (based on mask)."
-msgstr "キーを (既存ã®ãƒˆãƒ©ãƒƒã‚¯ã«) 挿入"
+msgstr "(マスクã«åŸºã¥ã„ã¦)キーを挿入。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5288,14 +5353,12 @@ msgstr ""
"åˆã‚ã¦ã‚­ãƒ¼ã‚’æ‰‹å‹•ã§æŒ¿å…¥ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Auto Insert Key"
-msgstr "アニメーションキーを挿入"
+msgstr "自動挿入キー"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert Key (Existing Tracks)"
-msgstr "キーを (既存ã®ãƒˆãƒ©ãƒƒã‚¯ã«) 挿入"
+msgstr "(既存ã®ãƒˆãƒ©ãƒƒã‚¯ã«)キーを挿入"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Copy Pose"
@@ -5341,9 +5404,8 @@ msgid "Error instancing scene from %s"
msgstr "%sã‹ã‚‰ã‚·ãƒ¼ãƒ³ã‚’インスタンス化処ç†ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Change Default Type"
-msgstr "é…列ã®å€¤ã®ç¨®é¡žã®å¤‰æ›´"
+msgstr "デフォルトã®åž‹ã‚’変更"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5371,16 +5433,6 @@ msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’設定ã™ã‚‹"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "ç”»åƒèª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "ç”»åƒå†…ã«é€æ˜Žåº¦ãŒ128以上ã®ãƒ”クセルãŒã‚りã¾ã›ã‚“..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
#, fuzzy
msgid "Load Emission Mask"
msgstr "発光(Emission)マスクを読ã¿è¾¼ã‚€"
@@ -5472,14 +5524,12 @@ msgid "Load Curve Preset"
msgstr "カーブã®ãƒ—リセットを読ã¿è¾¼ã‚€"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Add Point"
-msgstr "点を追加"
+msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’追加"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Remove Point"
-msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’除去"
+msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’削除"
#: editor/plugins/curve_editor_plugin.cpp
#, fuzzy
@@ -5544,9 +5594,8 @@ msgid "Create Static Convex Body"
msgstr "é™çš„凸状ボディを生æˆ"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "This doesn't work on scene root!"
-msgstr "シーンã®ãƒ«ãƒ¼ãƒˆã§ã¯æ©Ÿèƒ½ã—ã¾ã›ã‚“!"
+msgstr "シーンã®ãƒ«ãƒ¼ãƒˆã§ã¯ç„¡åйã§ã™!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
@@ -5583,9 +5632,8 @@ msgid "Model has no UV in this layer"
msgstr "モデルã«ã¯ã“ã®ãƒ¬ã‚¤ãƒ¤ãƒ¼ã«UVãŒã‚りã¾ã›ã‚“"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "MeshInstance lacks a Mesh!"
-msgstr "メッシュインスタンスã®ãƒ¡ãƒƒã‚·ãƒ¥ãŒå­˜åœ¨ã—ã¾ã›ã‚“"
+msgstr "メッシュインスタンスã«ãƒ¡ãƒƒã‚·ãƒ¥ãŒä¸è¶³ã—ã¦ã„ã¾ã™!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh has not surface to create outlines from!"
@@ -5666,10 +5714,10 @@ msgid "Update from Scene"
msgstr "シーンã‹ã‚‰ã‚¢ãƒƒãƒ—デート"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "No mesh source specified (and no MultiMesh set in node)."
msgstr ""
-"メッシュã®ã‚½ãƒ¼ã‚¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“(MultiMesh setã‚‚ node内ã«å­˜åœ¨ã—ã¾ã›ã‚“)"
+"メッシュã®ã‚½ãƒ¼ã‚¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“(ノードã«MultiMeshãŒè¨­å®šã•れã¦ã„ã¾ã›"
+"ん)。"
#: editor/plugins/multimesh_editor_plugin.cpp
#, fuzzy
@@ -5707,16 +5755,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "無効ãªã‚µãƒ¼ãƒ•ェスソースã§ã™ (é¢ãŒã‚りã¾ã›ã‚“)。"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
-msgid "Parent has no solid faces to populate."
-msgstr "åˆæœŸå€¤ã‚’設定ã™ã‚‹å¡—りã¤ã¶ã—é¢ãŒã€è¦ªã«ã‚りã¾ã›ã‚“."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
-msgid "Couldn't map area."
-msgstr "エリアをマッピングã§ãã¾ã›ã‚“"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "ã‚½ãƒ¼ã‚¹ãƒ¡ãƒƒã‚·ãƒ¥ã‚’é¸æŠž:"
@@ -5730,9 +5768,8 @@ msgid "Populate Surface"
msgstr "サーフェスã«åˆæœŸå€¤ã‚’設定"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Populate MultiMesh"
-msgstr "マルãƒãƒ¡ãƒƒã‚·ãƒ¥ã«åˆæœŸå€¤ã‚’設定"
+msgstr "マルãƒãƒ¡ãƒƒã‚·ãƒ¥ã®è¨­å®š"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Target Surface:"
@@ -5764,14 +5801,12 @@ msgid "Random Rotation:"
msgstr "ランダムãªå›žè»¢:"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Random Tilt:"
-msgstr "ランダムãªãƒ†ã‚£ãƒ«ãƒˆ:"
+msgstr "ランダムãªå‚¾ã:"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Random Scale:"
-msgstr "縮尺をランダムã«å¤‰æ›´:"
+msgstr "ランダムãªç¸®å°º:"
#: editor/plugins/multimesh_editor_plugin.cpp
#, fuzzy
@@ -5808,20 +5843,27 @@ msgid "Generation Time (sec):"
msgstr "ç”Ÿæˆæ™‚é–“ (ç§’):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "é¢ã«ã‚¨ãƒªã‚¢ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "é¢ãŒã‚りã¾ã›ã‚“!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "ノードã¯ã‚¸ã‚ªãƒ¡ãƒˆãƒªãƒ¼ (é¢) ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“。"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "ノードã¯ã‚¸ã‚ªãƒ¡ãƒˆãƒªãƒ¼ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“。"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "ノードã¯ã‚¸ã‚ªãƒ¡ãƒˆãƒªãƒ¼ (é¢) ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“。"
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "ノードã¯ã‚¸ã‚ªãƒ¡ãƒˆãƒªãƒ¼ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“。"
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
@@ -5871,14 +5913,12 @@ msgid "Remove Point from Curve"
msgstr "曲線ã‹ã‚‰ãƒã‚¤ãƒ³ãƒˆã‚’除去"
#: editor/plugins/path_2d_editor_plugin.cpp
-#, fuzzy
msgid "Remove Out-Control from Curve"
-msgstr "Out-ãƒãƒ³ãƒ‰ãƒ«ã‚’曲線ã‹ã‚‰é™¤åŽ»"
+msgstr "曲線ã‹ã‚‰Out-Controlを削除"
#: editor/plugins/path_2d_editor_plugin.cpp
-#, fuzzy
msgid "Remove In-Control from Curve"
-msgstr "In-ãƒãƒ³ãƒ‰ãƒ«ã‚’曲線ã‹ã‚‰é™¤åŽ»"
+msgstr "曲線ã‹ã‚‰In-Controlを削除"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -5886,24 +5926,20 @@ msgid "Add Point to Curve"
msgstr "点を曲線ã«è¿½åŠ "
#: editor/plugins/path_2d_editor_plugin.cpp
-#, fuzzy
msgid "Split Curve"
-msgstr "曲線を閉ã˜ã‚‹"
+msgstr "曲線を分割ã™ã‚‹"
#: editor/plugins/path_2d_editor_plugin.cpp
-#, fuzzy
msgid "Move Point in Curve"
-msgstr "曲線ã®ãƒã‚¤ãƒ³ãƒˆã‚’移動"
+msgstr "曲線内ã®ãƒã‚¤ãƒ³ãƒˆã‚’移動"
#: editor/plugins/path_2d_editor_plugin.cpp
-#, fuzzy
msgid "Move In-Control in Curve"
-msgstr "曲線ã®In-ãƒãƒ³ãƒ‰ãƒ«ã‚’移動ã™ã‚‹"
+msgstr "曲線内ã®In-Controlを移動ã™ã‚‹"
#: editor/plugins/path_2d_editor_plugin.cpp
-#, fuzzy
msgid "Move Out-Control in Curve"
-msgstr "曲線ã®Out-ãƒãƒ³ãƒ‰ãƒ«ã‚’移動ã™ã‚‹"
+msgstr "曲線内ã®Out-Controlを移動ã™ã‚‹"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -5921,9 +5957,8 @@ msgid "Click: Add Point"
msgstr "クリック: 点を追加"
#: editor/plugins/path_2d_editor_plugin.cpp
-#, fuzzy
msgid "Left Click: Split Segment (in curve)"
-msgstr "分割ã™ã‚‹(曲線を)"
+msgstr "左クリック:セグメントを分割ã™ã‚‹(曲線内)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -5976,7 +6011,7 @@ msgstr "カーブãƒã‚¤ãƒ³ãƒˆã®ä½ç½®ã‚’設定"
#: editor/plugins/path_editor_plugin.cpp
#, fuzzy
msgid "Set Curve In Position"
-msgstr "曲線ã®In-ãƒãƒ³ãƒ‰ãƒ«ã®ä½ç½®ã‚’指定"
+msgstr "曲線ã®ä½ç½®ã‚’設定"
#: editor/plugins/path_editor_plugin.cpp
#, fuzzy
@@ -5984,7 +6019,6 @@ msgid "Set Curve Out Position"
msgstr "曲線ã®Out-ãƒãƒ³ãƒ‰ãƒ«ã®ä½ç½®ã‚’指定"
#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
msgid "Split Path"
msgstr "パスを分割"
@@ -6001,12 +6035,10 @@ msgid "Remove In-Control Point"
msgstr "曲線ã®In-ãƒãƒ³ãƒ‰ãƒ«ã‚’除去"
#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
msgid "Split Segment (in curve)"
-msgstr "分割ã™ã‚‹(曲線を)"
+msgstr "セグメントを分割ã™ã‚‹(曲線内)"
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move Joint"
msgstr "ジョイントを移動"
@@ -6066,9 +6098,8 @@ msgid "Transform UV Map"
msgstr "UVマップをトランスフォーム"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Transform Polygon"
-msgstr "トランスフォーム"
+msgstr "ãƒãƒªã‚´ãƒ³ã®å¤‰æ›"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Paint Bone Weights"
@@ -6099,7 +6130,6 @@ msgid "Bones"
msgstr "ボーン"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Move Points"
msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’移動"
@@ -6124,7 +6154,6 @@ msgid "Rotate Polygon"
msgstr "ãƒãƒªã‚´ãƒ³ã‚’回転"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Scale Polygon"
msgstr "ãƒãƒªã‚´ãƒ³ã®ç¸®å°ºã‚’変更"
@@ -6153,12 +6182,10 @@ msgid "Radius:"
msgstr "åŠå¾„:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Polygon->UV"
msgstr "ãƒãƒªã‚´ãƒ³->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "UV->Polygon"
msgstr "UV->ãƒãƒªã‚´ãƒ³"
@@ -6171,7 +6198,6 @@ msgid "Grid Settings"
msgstr "スナップã®è¨­å®š"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "スナップ"
@@ -6204,9 +6230,8 @@ msgid "Grid Step Y:"
msgstr "グリッドã®ã‚¹ãƒ†ãƒƒãƒ— Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "ãƒãƒªã‚´ãƒ³ã®ç¸®å°ºã‚’変更"
+msgstr "ボーンをãƒãƒªã‚´ãƒ³ã«åŒæœŸã•ã›ã‚‹"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
@@ -6254,9 +6279,8 @@ msgid "Load Resource"
msgstr "リソースを読ã¿è¾¼ã‚€"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#, fuzzy
msgid "ResourcePreloader"
-msgstr "リソースã®ãƒ‘ス"
+msgstr "リソースプリローダー"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
@@ -6279,39 +6303,33 @@ msgid "Error writing TextFile:"
msgstr "ãƒ†ã‚­ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "エラー: ファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "エラー:ファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚"
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "タイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
msgstr "ファイルã®ä¿å­˜ã‚¨ãƒ©ãƒ¼!"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error while saving theme."
-msgstr "テーマをä¿å­˜ã™ã‚‹é€”中ã§ã®ã‚¨ãƒ©ãƒ¼"
+msgstr "テーマをä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Saving"
-msgstr "ä¿å­˜ã‚¨ãƒ©ãƒ¼"
+msgstr "ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error importing theme."
-msgstr "テーマをインãƒãƒ¼ãƒˆä¸­ã®ã‚¨ãƒ©ãƒ¼"
+msgstr "テーマをインãƒãƒ¼ãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Importing"
-msgstr "インãƒãƒ¼ãƒˆã®ã‚¨ãƒ©ãƒ¼"
+msgstr "インãƒãƒ¼ãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "æ–°è¦ãƒ†ã‚­ã‚¹ãƒˆãƒ•ァイル..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6327,9 +6345,8 @@ msgid "Import Theme"
msgstr "テーマã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error while saving theme"
-msgstr "テーマをä¿å­˜ã™ã‚‹é€”中ã§ã®ã‚¨ãƒ©ãƒ¼"
+msgstr "テーマã®ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving"
@@ -6340,9 +6357,8 @@ msgid "Save Theme As..."
msgstr "テーマをåå‰ã‚’ã¤ã‘ã¦ä¿å­˜..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "%s Class Reference"
-msgstr " クラスリファレンス"
+msgstr "%s クラスリファレンス"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -6394,6 +6410,11 @@ msgid "Open..."
msgstr "é–‹ã..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "スクリプトを開ã"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "ã™ã¹ã¦ä¿å­˜"
@@ -6431,13 +6452,13 @@ msgid "Save Theme"
msgstr "テーマをä¿å­˜"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "ドキュメントを閉ã˜ã‚‹"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "ã™ã¹ã¦é–‰ã˜ã‚‹"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "ドキュメントを閉ã˜ã‚‹"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "実行"
@@ -6472,9 +6493,8 @@ msgid "Debug with External Editor"
msgstr "外部エディタã§ãƒ‡ãƒãƒƒã‚°"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open Godot online documentation."
-msgstr "Godotã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³æ–‡æ›¸ã‚’é–‹ã"
+msgstr "Godotã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’é–‹ã"
#: editor/plugins/script_editor_plugin.cpp
msgid "Request Docs"
@@ -6502,12 +6522,11 @@ msgid "Discard"
msgstr "破棄"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid ""
"The following files are newer on disk.\n"
"What action should be taken?:"
msgstr ""
-"次ã®ãƒ•ァイルã¯ã€ã‚ˆã‚Šæ–°ã—ã„版ãŒãƒ‡ã‚£ã‚¹ã‚¯ã«å­˜åœ¨ã—ã¾ã™\n"
+"以下ã®ãƒ•ァイルより新ã—ã„ã‚‚ã®ãŒãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã«å­˜åœ¨ã—ã¾ã™ã€‚\n"
"ã©ã†ã—ã¾ã™ã‹?:"
#: editor/plugins/script_editor_plugin.cpp
@@ -6528,35 +6547,37 @@ msgstr "デãƒãƒƒã‚¬"
msgid "Search Results"
msgstr "æ¤œç´¢çµæžœ"
-#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "最近開ã„ãŸã‚·ãƒ¼ãƒ³ã®å±¥æ­´ã‚’クリア"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
-msgstr "ãƒŽãƒ¼ãƒ‰ã«æŽ¥ç¶š:"
+msgstr "メソッドã¸ã®æŽ¥ç¶š:"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Source"
-msgstr "ソース:"
+msgstr "ソース"
#: editor/plugins/script_text_editor.cpp
msgid "Signal"
msgstr "シグナル"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Target"
-msgstr "ターゲットã®ãƒ‘ス:"
+msgstr "ターゲット"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid ""
"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
-msgstr "'%s' ã‚’ '%s' ã«æŽ¥ç¶š"
+msgstr ""
+"ノード'ï¼…s'ã‹ã‚‰ãƒŽãƒ¼ãƒ‰'ï¼…s'ã¸é€ã‚‹ã‚·ã‚°ãƒŠãƒ«'ï¼…s'ã®ãƒ¡ã‚½ãƒƒãƒ‰'ï¼…s'ã¸ã®æŽ¥ç¶šãŒè¦‹ã¤ã‹"
+"りã¾ã›ã‚“。"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "ライン:"
+msgstr "ライン"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
@@ -6599,6 +6620,7 @@ msgid "Syntax Highlighter"
msgstr "シンタックスãƒã‚¤ãƒ©ã‚¤ãƒˆ"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6633,26 +6655,6 @@ msgid "Toggle Comment"
msgstr "コメントã®åˆ‡ã‚Šæ›¿ãˆ"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "フリールックã®åˆ‡ã‚Šæ›¿ãˆ"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "次ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã«ç§»å‹•"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "å‰ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã«ç§»å‹•"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "ã™ã¹ã¦ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’除去"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "行を折りãŸãŸã‚€/展開ã™ã‚‹"
@@ -6673,6 +6675,11 @@ msgid "Complete Symbol"
msgstr "シンボルを補完"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "スケールã®é¸æŠž"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "末尾ã®ç©ºç™½ã‚’å–り除ã"
@@ -6689,29 +6696,32 @@ msgid "Auto Indent"
msgstr "自動インデント"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "ブレークãƒã‚¤ãƒ³ãƒˆã‚’切り替ãˆ"
+msgid "Find Previous"
+msgstr "å‰ã‚’検索"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "ã™ã¹ã¦ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã‚’消去"
+msgid "Find in Files..."
+msgstr "複数ファイル内を検索..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "次ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã«ç§»å‹•"
+msgid "Contextual Help"
+msgstr "コンテキストヘルプ"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "å‰ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã«ç§»å‹•"
+msgid "Toggle Bookmark"
+msgstr "ブックマークã®åˆ‡ã‚Šæ›¿ãˆ"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "å‰ã‚’検索"
+msgid "Go to Next Bookmark"
+msgstr "次ã®ãƒ–ックマークã«ç§»å‹•"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "複数ファイル内を検索..."
+msgid "Go to Previous Bookmark"
+msgstr "å‰ã®ãƒ–ックマークã«ç§»å‹•"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "ã™ã¹ã¦ã®ãƒ–ックマークを削除"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6722,18 +6732,29 @@ msgid "Go to Line..."
msgstr "行ã«ç§»å‹•..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Contextual Help"
-msgstr "文脈å‚照ヘルプ"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "ブレークãƒã‚¤ãƒ³ãƒˆã‚’切り替ãˆ"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "ã™ã¹ã¦ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã‚’消去"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "次ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã«ç§»å‹•"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "å‰ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã«ç§»å‹•"
#: editor/plugins/shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"This shader has been modified on on disk.\n"
"What action should be taken?"
msgstr ""
-"次ã®ãƒ•ァイルã¯ã€ã‚ˆã‚Šæ–°ã—ã„版ãŒãƒ‡ã‚£ã‚¹ã‚¯ã«å­˜åœ¨ã—ã¾ã™\n"
-"ã©ã†ã—ã¾ã™ã‹?:"
+"ã“ã®ã‚·ã‚§ãƒ¼ãƒ€ã¯ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã§ä¿®æ­£ã•れã¦ã„ã¾ã™ã€‚\n"
+"ã©ã†ã—ã¾ã™ã‹?"
#: editor/plugins/shader_editor_plugin.cpp
msgid "Shader"
@@ -6744,18 +6765,16 @@ msgid "This skeleton has no bones, create some children Bone2D nodes."
msgstr "ã“ã®skeletonã«ã¯ãƒœãƒ¼ãƒ³ãŒã‚りã¾ã›ã‚“。å­Bone2Dノードを追加ã—ã¦ãã ã•ã„。"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Rest Pose from Bones"
-msgstr "メッシュã‹ã‚‰æ”¾å‡ºç‚¹ã‚’生æˆ"
+msgstr "ボーンã‹ã‚‰ãƒ¬ã‚¹ãƒˆãƒãƒ¼ã‚ºã‚’作æˆ"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Rest Pose to Bones"
msgstr "ボーンã¸ãƒ¬ã‚¹ãƒˆãƒ»ãƒãƒ¼ã‚ºã‚’設定ã™ã‚‹"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "スケルトン..."
+msgstr "スケルトン2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
@@ -6766,24 +6785,20 @@ msgid "Set Bones to Rest Pose"
msgstr "レスト・ãƒãƒ¼ã‚ºã¸ãƒœãƒ¼ãƒ³ã‚’設定ã™ã‚‹"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "ナビメッシュ(ナビゲーションメッシュ)ã®ç”Ÿæˆ"
+msgstr "物ç†ãƒœãƒ¼ãƒ³ã‚’作æˆã™ã‚‹"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "スケルトン..."
+msgstr "スケルトン"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "アウトラインを生æˆ"
+msgstr "物ç†ã‚¹ã‚±ãƒ«ãƒˆãƒ³ã‚’作æˆã™ã‚‹"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "実行"
+msgstr "IK(Inverse kinematics)を実行ã™ã‚‹"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -6794,9 +6809,8 @@ msgid "Perspective"
msgstr "é€è¦–投影"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Transform Aborted."
-msgstr "トランスフォームã¯ä¸­æ­¢ã•れã¾ã—ãŸ."
+msgstr "変æ›ã¯ä¸­æ­¢ã•れã¾ã—ãŸ."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "X-Axis Transform."
@@ -6815,9 +6829,8 @@ msgid "View Plane Transform."
msgstr "ビュー平é¢ãƒˆãƒ©ãƒ³ã‚¹ãƒ•ォーム."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Scaling: "
-msgstr "縮尺:"
+msgstr "縮尺: "
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -6833,9 +6846,8 @@ msgid "Keying is disabled (no key inserted)."
msgstr "キーã¯ç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™ï¼ˆã‚­ãƒ¼ã¯æŒ¿å…¥ã•れã¦ã„ã¾ã›ã‚“)."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key Inserted."
-msgstr "アニメーションã®ã‚­ãƒ¼ãŒæŒ¿å…¥ã•れã¦ã„ã¾ã™."
+msgstr "ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚­ãƒ¼ãŒæŒ¿å…¥ã•れã¾ã—ãŸã€‚"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Pitch"
@@ -6914,24 +6926,20 @@ msgid "Rear"
msgstr "後é¢"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Transform with View"
-msgstr "シーンビューã«ã‚«ãƒ¡ãƒ©ã‚’åˆã‚ã›ã‚‹ï¼ˆAlign With View)"
+msgstr "変æ›ã‚’ビューã«åˆã‚ã›ã‚‹"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Rotation with View"
-msgstr "é¸æŠžã‚’ãƒ“ãƒ¥ãƒ¼ã«æ•´åˆ—"
+msgstr "回転をビューã«åˆã‚ã›ã‚‹"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "No parent to instance a child at."
msgstr "å­ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’生æˆã™ã‚‹ãŸã‚ã®è¦ªãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "This operation requires a single selected node."
-msgstr "一ã¤ãƒŽãƒ¼ãƒ‰ã‚’指定ã—ãªã„ã¨ã€ã“ã®æ“作ã¯ã§ãã¾ã›ã‚“"
+msgstr "å˜ä¸€ã®é¸æŠžã•れãŸãƒŽãƒ¼ãƒ‰ãŒãªã„ã¨ã€ã“ã®æ“作ã¯è¡Œãˆã¾ã›ã‚“"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
@@ -6979,13 +6987,12 @@ msgstr "オーディオリスナー"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Doppler Enable"
-msgstr "有効ã«ã™ã‚‹"
+msgid "Enable Doppler"
+msgstr "フィルタリングを有効化"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "メッシュライブラリを生æˆ"
+msgstr "ã‚·ãƒãƒžãƒ†ã‚£ãƒƒã‚¯ãƒ—レビュー"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -7039,42 +7046,25 @@ msgid "Snap Nodes To Floor"
msgstr "Snapモード:"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "é¸æŠžãƒ¢ãƒ¼ãƒ‰ (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid ""
"Drag: Rotate\n"
"Alt+Drag: Move\n"
"Alt+RMB: Depth list selection"
-msgstr "Alt+å³ã‚¯ãƒªãƒƒã‚¯: デプス(深ã•)リストã®é¸æŠž"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "移動モード (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "回転モード (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "スケールモード (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "ローカル座標系"
+msgstr ""
+"ドラッグ:回転\n"
+"Alt+ドラッグ:移動\n"
+"Alt+å³ã‚¯ãƒªãƒƒã‚¯: 奥行ãリストã®é¸æŠž"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "ローカル空間モード (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "スナップモード (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "下é¢å›³"
@@ -7099,9 +7089,8 @@ msgid "Right View"
msgstr "å³å´é¢å›³"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Switch Perspective/Orthogonal View"
-msgstr "é€è¦–投影/並行投影ã®åˆ‡ã‚Šæ›¿ãˆ"
+msgstr "é€è¦–図/正投影図ã®åˆ‡ã‚Šæ›¿ãˆ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
@@ -7116,30 +7105,13 @@ msgid "Focus Selection"
msgstr "é¸æŠžã«ãƒ•ォーカス"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "é¸æŠžãƒ„ãƒ¼ãƒ«"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "移動ツール"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "回転ツール"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "スケールツール"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "フリールックã®åˆ‡ã‚Šæ›¿ãˆ"
#: editor/plugins/spatial_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform"
-msgstr "トランスフォーム"
+msgstr "変æ›"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7147,9 +7119,8 @@ msgid "Snap Object to Floor"
msgstr "オブジェクトを底é¢ã«ã‚¹ãƒŠãƒƒãƒ—"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Transform Dialog..."
-msgstr "トランスフォームã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°..."
+msgstr "変æ›ã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "1 Viewport"
@@ -7189,7 +7160,8 @@ msgstr "ビューã®ã‚°ãƒªãƒƒãƒ‰"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "設定"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7205,9 +7177,8 @@ msgid "Rotate Snap (deg.):"
msgstr "スナップã®å›žè»¢ï¼ˆåº¦ï¼‰:"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Scale Snap (%):"
-msgstr "スナップã®å¤§ãã•(%):"
+msgstr "ã‚¹ãƒŠãƒƒãƒ—ã®æ‹¡å¤§/縮å°(%):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Viewport Settings"
@@ -7219,11 +7190,11 @@ msgstr "視野角(度):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Z-Near:"
-msgstr ""
+msgstr "Z-Nearを表示:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Z-Far:"
-msgstr ""
+msgstr "Z-Farを表示:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Change"
@@ -7239,9 +7210,8 @@ msgid "Rotate (deg.):"
msgstr "回転(度):"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Scale (ratio):"
-msgstr "縮尺(比):"
+msgstr "縮尺(比):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Type"
@@ -7260,29 +7230,24 @@ msgid "Nameless gizmo"
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create Mesh2D"
-msgstr "アウトラインメッシュを生æˆ"
+msgstr "メッシュ2Dを作æˆ"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon2D"
-msgstr "Polygon3Dを生æˆ"
+msgstr "Polygon2Dを作æˆ"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create CollisionPolygon2D"
-msgstr "コリジョン ãƒãƒªã‚´ãƒ³ã‚’生æˆ"
+msgstr "CollisionPolygon2Dを作æˆ"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create LightOccluder2D"
-msgstr "オクルーダーãƒãƒªã‚´ãƒ³ã‚’生æˆ"
+msgstr "LightOccluder2Dを作æˆ"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "ä¿å­˜ã™ã‚‹ãƒ‘スãŒã‚りã¾ã›ã‚“!"
+msgstr "スプライトã¯ç©ºã§ã™!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
@@ -7293,36 +7258,32 @@ msgid "Invalid geometry, can't replace by mesh."
msgstr "ジオメトリãŒç„¡åйã§ã™ã€‚メッシュã«ç½®ãæ›ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Mesh2D"
-msgstr "2Dメッシュã«å¤‰æ›"
+msgstr "メッシュ2Dã«å¤‰æ›"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create polygon."
msgstr "ジオメトリãŒç„¡åйã§ã™ã€‚ãƒãƒªã‚´ãƒ³ã‚’作æˆã§ãã¾ã›ã‚“。"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Polygon2D"
-msgstr "ãƒãƒªã‚´ãƒ³ã‚’移動"
+msgstr "Polygon2Dã«å¤‰æ›"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create collision polygon."
msgstr "ジオメトリãŒç„¡åйã§ã™ã€‚è¡çªãƒãƒªã‚´ãƒ³ã‚’作æˆã§ãã¾ã›ã‚“。"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create CollisionPolygon2D Sibling"
-msgstr "コリジョン ãƒãƒªã‚´ãƒ³ã‚’生æˆ"
+msgstr "CollisionPolygon2Dã®å…„弟を作æˆã™ã‚‹"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create light occluder."
msgstr "ジオメトリãŒç„¡åйã§ã™ã€‚ライトオクールダーを作æˆã§ãã¾ã›ã‚“。"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create LightOccluder2D Sibling"
-msgstr "オクルーダーãƒãƒªã‚´ãƒ³ã‚’生æˆ"
+msgstr "LightOccluder2Dã®å…„弟を作æˆã™ã‚‹"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite"
@@ -7333,9 +7294,8 @@ msgid "Simplification: "
msgstr "簡略化:"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Grow (Pixels): "
-msgstr "スナップ機能(ピクセルå˜ä½ï¼‰:"
+msgstr "拡大(ピクセル): "
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Update Preview"
@@ -7346,28 +7306,24 @@ msgid "Settings:"
msgstr "設定:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "No Frames Selected"
-msgstr "é¸æŠžå¯¾è±¡ã‚’ãƒ•ãƒ¬ãƒ¼ãƒ ã®ä¸­å¤®ã«"
+msgstr "フレームãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add %d Frame(s)"
-msgstr "フレームを追加"
+msgstr "%dフレームを追加"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frame"
msgstr "フレームを追加"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "ERROR: Couldn't load frame resource!"
msgstr "エラー:フレームリソースを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Resource clipboard is empty or not a texture!"
-msgstr "リソースクリップボードã¯ç©ºã‹ã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ä»¥å¤–ã§ã™!"
+msgstr "リソースクリップボードã¯ç©ºã‹ã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ä»¥å¤–ã®ã‚‚ã®ã§ã™!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Paste Frame"
@@ -7406,9 +7362,8 @@ msgid "Animation Frames:"
msgstr "アニメーション フレーム:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add a Texture from File"
-msgstr "シーンã‹ã‚‰ã®ãƒŽãƒ¼ãƒ‰"
+msgstr "ファイルã‹ã‚‰ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’追加ã™ã‚‹"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frames from a Sprite Sheet"
@@ -7423,19 +7378,16 @@ msgid "Insert Empty (After)"
msgstr "空を挿入 (後)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Move (Before)"
-msgstr "ノードを除去"
+msgstr "移動(å‰)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Move (After)"
-msgstr "å·¦ã«ç§»å‹•"
+msgstr "移動(後)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select Frames"
-msgstr "スタックフレーム"
+msgstr "ãƒ•ãƒ¬ãƒ¼ãƒ ã‚’é¸æŠž"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Horizontal:"
@@ -7447,29 +7399,24 @@ msgid "Vertical:"
msgstr "頂点"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select/Clear All Frames"
-msgstr "ã™ã¹ã¦é¸æŠž"
+msgstr "ã™ã¹ã¦ã®ãƒ•ãƒ¬ãƒ¼ãƒ ã‚’é¸æŠž/消去"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Create Frames from Sprite Sheet"
-msgstr "シーンã‹ã‚‰ç”Ÿæˆ"
+msgstr "スプライトシートã‹ã‚‰ãƒ•レームを作æˆ"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "SpriteFrames"
-msgstr "スタックフレーム"
+msgstr "スプライトフレーム"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "Set Region Rect"
-msgstr "テクスãƒãƒ£ã€€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³"
+msgstr "矩形ã®é ˜åŸŸã‚’設定"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "Set Margin"
-msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’設定ã™ã‚‹"
+msgstr "マージンを設定ã™ã‚‹"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
@@ -7506,13 +7453,8 @@ msgid "Sep.:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
-msgstr "テクスãƒãƒ£ã€€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "ファイルã«ãƒ†ãƒ¼ãƒžã‚’ä¿å­˜ã§ãã¾ã›ã‚“:"
+msgstr "テクスãƒãƒ£é ˜åŸŸ"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
@@ -7531,9 +7473,8 @@ msgid "Remove All"
msgstr "ã™ã¹ã¦é™¤åŽ»"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Edit Theme"
-msgstr "テーマを編集..."
+msgstr "テーマを編集"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme editing menu."
@@ -7556,28 +7497,24 @@ msgid "Create Empty Editor Template"
msgstr "空ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ†ãƒ³ãƒ—レートを生æˆ"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Create From Current Editor Theme"
-msgstr "空ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ†ãƒ³ãƒ—レートを生æˆ"
+msgstr "ç¾åœ¨ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ†ãƒ¼ãƒžã‹ã‚‰ä½œæˆ"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Button"
-msgstr "マウスボタン"
+msgstr "ボタンã®åˆ‡ã‚Šæ›¿ãˆ"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled Button"
-msgstr "中央ボタン"
+msgstr "ボタンを無効ã«ã™ã‚‹"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Item"
msgstr "アイテム"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled Item"
-msgstr "無効"
+msgstr "アイテムを無効ã«ã™ã‚‹"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Check Item"
@@ -7607,13 +7544,13 @@ msgstr "サブメニュー"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
-msgstr "アイテム"
+msgid "Subitem 1"
+msgstr "アイテム 1"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
-msgstr "アイテム"
+msgid "Subitem 2"
+msgstr "アイテム 2"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has"
@@ -7624,9 +7561,8 @@ msgid "Many"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled LineEdit"
-msgstr "無効"
+msgstr "ライン編集を無効ã«ã™ã‚‹"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Tab 1"
@@ -7641,9 +7577,8 @@ msgid "Tab 3"
msgstr "タブ3"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Editable Item"
-msgstr "編集å¯èƒ½ãªå­"
+msgstr "編集å¯èƒ½ãªã‚¢ã‚¤ãƒ†ãƒ "
#: editor/plugins/theme_editor_plugin.cpp
msgid "Subtree"
@@ -7655,9 +7590,8 @@ msgid "Has,Many,Options"
msgstr "オプション"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Data Type:"
-msgstr "データã®åž‹(Type):"
+msgstr "データã®åž‹:"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Icon"
@@ -7680,29 +7614,25 @@ msgid "Constant"
msgstr "コンスタント"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Erase Selection"
-msgstr "é¸æŠžã‚’æ¶ˆåŽ»"
+msgstr "é¸æŠžå¯¾è±¡ã‚’æ¶ˆåŽ»"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "無効ãªåå‰ã§ã™."
+msgstr "無効ãªã‚¿ã‚¤ãƒ«ã‚’修正"
#: editor/plugins/tile_map_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "é¸æŠžå¯¾è±¡ã‚’ä¸­å¤®ã«"
+msgstr "é¸æŠžå¯¾è±¡ã‚’åˆ‡ã‚Šå–り"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr "タイルマップを塗る"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Line Draw"
-msgstr "等速"
+msgstr "ç›´ç·šã‚’æç”»"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rectangle Paint"
@@ -7726,23 +7656,22 @@ msgid "Transpose"
msgstr "転置"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Disable Autotile"
-msgstr "自動スライス"
+msgstr "オートタイルを無効ã«ã™ã‚‹"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Enable Priority"
-msgstr "タイル プロパティを編集"
+msgstr "優先順ä½ã‚’有効化"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
msgstr "タイルを塗る"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Shift+å³ãƒžã‚¦ã‚¹ãƒœã‚¿ãƒ³:ç·šã®æç”»\n"
"Shift+Ctrl+å³ãƒžã‚¦ã‚¹ãƒœã‚¿ãƒ³:矩形ペイント"
@@ -7752,14 +7681,12 @@ msgid "Pick Tile"
msgstr "ã‚¿ã‚¤ãƒ«ã‚’é¸æŠž"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Left"
-msgstr "回転モード"
+msgstr "å·¦ã«å›žè»¢"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Right"
-msgstr "å³ã«ç§»å‹•"
+msgstr "å³ã«å›žè»¢"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Horizontally"
@@ -7770,19 +7697,16 @@ msgid "Flip Vertically"
msgstr "上下å転"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear Transform"
-msgstr "トランスフォーム"
+msgstr "変æ›ã‚’クリア"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Add Texture(s) to TileSet."
-msgstr "シーンã‹ã‚‰ã®ãƒŽãƒ¼ãƒ‰"
+msgstr "テクスãƒãƒ£ã‚’タイルセットã«è¿½åŠ ã™ã‚‹"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected Texture from TileSet."
-msgstr "パスã®ãƒã‚¤ãƒ³ãƒˆã‚’除去"
+msgstr "é¸æŠžã—ãŸãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’タイルセットã‹ã‚‰å‰Šé™¤ã™ã‚‹"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -7793,27 +7717,24 @@ msgid "Merge from Scene"
msgstr "シーンã‹ã‚‰ãƒžãƒ¼ã‚¸"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Next Coordinate"
-msgstr "次ã®åºŠé¢"
+msgstr "次ã®åº§æ¨™"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the next shape, subtile, or Tile."
msgstr "次ã®ã‚·ã‚§ã‚¤ãƒ—ã€ã‚µãƒ–タイルã€ã¾ãŸã¯ã‚¿ã‚¤ãƒ«ã‚’é¸æŠžã—ã¾ã™ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Previous Coordinate"
-msgstr "å‰ã®åºŠé¢"
+msgstr "å‰ã®åº§æ¨™"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the previous shape, subtile, or Tile."
msgstr "å‰ã®ã‚·ã‚§ã‚¤ãƒ—ã€ã‚µãƒ–タイルã€ã¾ãŸã¯ã‚¿ã‚¤ãƒ«ã‚’é¸æŠžã—ã¾ã™ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Region Mode"
-msgstr "実行モード:"
+msgstr "領域モード"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -7821,32 +7742,28 @@ msgid "Collision Mode"
msgstr "補間モード"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Occlusion Mode"
-msgstr "オクルージョン ãƒãƒªã‚´ãƒ³ã‚’編集"
+msgstr "オクルージョンモード"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation Mode"
-msgstr "ナビゲーションメッシュを生æˆ"
+msgstr "ナビゲーションモード"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Bitmask Mode"
msgstr "ビットマスクモード"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority Mode"
-msgstr "エクスãƒãƒ¼ãƒˆã®ãƒ¢ãƒ¼ãƒ‰:"
+msgstr "優先モード"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Icon Mode"
msgstr "アイコンモード"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Z Index Mode"
-msgstr "パンモード"
+msgstr "Zインデックスモード"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Copy bitmask."
@@ -7857,9 +7774,8 @@ msgid "Paste bitmask."
msgstr "ビットマスクを貼り付ã‘。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Erase bitmask."
-msgstr "点を消ã™ã€‚"
+msgstr "ビットマスクを消去"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -7898,14 +7814,12 @@ msgstr ""
"シーンã‹ã‚‰ä½œæˆã—ã¾ã™ã‹?ã“れã«ã‚ˆã‚Šã€ç¾åœ¨ã®ã™ã¹ã¦ã®ã‚¿ã‚¤ãƒ«ãŒä¸Šæ›¸ãã•れã¾ã™ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Merge from scene?"
msgstr "シーンã‹ã‚‰ãƒžãƒ¼ã‚¸ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Texture"
-msgstr "テンプレートを除去"
+msgstr "テクスãƒãƒ£ã‚’削除"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "%s file(s) were not added because was already on the list."
@@ -7916,31 +7830,36 @@ msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"四角形を編集ã™ã‚‹ãŸã‚ãƒãƒ³ãƒ‰ãƒ«ã‚’ドラッグã—ã¾ã™ã€‚編集ã®ãŸã‚別ã®ã‚¿ã‚¤ãƒ«ã‚’クリック"
+"ã—ã¾ã™ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete selected Rect."
-msgstr "é¸æŠžã—ãŸãƒ•ァイルを削除ã—ã¾ã™ã‹ï¼Ÿ"
+msgstr "é¸æŠžã—ãŸçŸ©å½¢ã‚’削除ã™ã‚‹ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr "ç¾åœ¨ç·¨é›†ä¸­ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã™ã‚‹"
+msgstr ""
+"ç¾åœ¨ç·¨é›†ä¸­ã®ã‚µãƒ–ã‚¿ã‚¤ãƒ«ã‚’é¸æŠžã—ã¾ã™ã€‚\n"
+"別ã®ã‚¿ã‚¤ãƒ«ã‚’クリックã—ã¦ç·¨é›†ã—ã¾ã™ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Delete polygon."
msgstr "ãƒãƒªã‚´ãƒ³ã‚’削除。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"LMB: Set bit on.\n"
"RMB: Set bit off.\n"
"Shift+LMB: Set wildcard bit.\n"
"Click on another Tile to edit it."
-msgstr "ç¾åœ¨ç·¨é›†ä¸­ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã™ã‚‹"
+msgstr ""
+"左クリック:ビットをオンã«è¨­å®šã—ã¾ã™ã€‚\n"
+"å³ã‚¯ãƒªãƒƒã‚¯:ビットをオフã«ã—ã¾ã™ã€‚\n"
+"Shift+左クリック:ワイルドカード・ビットを設定ã—ã¾ã™ã€‚\n"
+"別ã®ã‚¿ã‚¤ãƒ«ã‚’クリックã—ã¦ç·¨é›†ã—ã¾ã™ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -7961,16 +7880,16 @@ msgstr ""
"別ã®ã‚¿ã‚¤ãƒ«ã‚’クリックã—ã¦ç·¨é›†ã—ã¾ã™ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its z index.\n"
"Click on another Tile to edit it."
-msgstr "ç¾åœ¨ç·¨é›†ä¸­ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã™ã‚‹"
+msgstr ""
+"Zインデックスを変更ã™ã‚‹ã«ã¯ã€ã‚µãƒ–ã‚¿ã‚¤ãƒ«ã‚’é¸æŠžã—ã¾ã™ã€‚\n"
+"別ã®ã‚¿ã‚¤ãƒ«ã‚’クリックã—ã¦ç·¨é›†ã—ã¾ã™ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Set Tile Region"
-msgstr "テクスãƒãƒ£ã€€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³"
+msgstr "タイル領域ã®è¨­å®š"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Tile"
@@ -7985,9 +7904,8 @@ msgid "Edit Tile Bitmask"
msgstr "タイル ビットマスクを編集"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Collision Polygon"
-msgstr "既存ã®ãƒãƒªã‚´ãƒ³ã‚’編集:"
+msgstr "コリジョンãƒãƒªã‚´ãƒ³ã®ç·¨é›†"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Occlusion Polygon"
@@ -8020,9 +7938,8 @@ msgid "Remove Tile"
msgstr "タイルを除去"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Collision Polygon"
-msgstr "ãƒãƒªã‚´ãƒ³ã¨ç‚¹ã‚’除去"
+msgstr "コリジョンãƒãƒªã‚´ãƒ³ã‚’削除"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove Occlusion Polygon"
@@ -8053,102 +7970,95 @@ msgid "This property can't be changed."
msgstr "ã“ã®ãƒ—ロパティã¯å¤‰æ›´ã§ãã¾ã›ã‚“。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "TileSet"
-msgstr "タイルセット..."
+msgstr "タイルセット"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(GLES3ã®ã¿)"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add input +"
-msgstr "入力を追加"
+msgstr "入力を追加+"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add output +"
-msgstr "入力を追加"
+msgstr "出力を追加+"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar"
-msgstr "スケール:"
+msgstr "スカラー"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector"
-msgstr "インスペクタ"
+msgstr "\\ Vector"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean"
msgstr "ブール"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add input port"
-msgstr "入力を追加"
+msgstr "入力ãƒãƒ¼ãƒˆã®è¿½åŠ "
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add output port"
msgstr "出力ãƒãƒ¼ãƒˆã‚’追加"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port type"
-msgstr "é…列ã®å€¤ã®ç¨®é¡žã®å¤‰æ›´"
+msgstr "入力ãƒãƒ¼ãƒˆã®ã‚¿ã‚¤ãƒ—を変更"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change output port type"
-msgstr "é…列ã®å€¤ã®ç¨®é¡žã®å¤‰æ›´"
+msgstr "出力ãƒãƒ¼ãƒˆã®ã‚¿ã‚¤ãƒ—を変更"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port name"
-msgstr "入力ã®åå‰ã‚’変更"
+msgstr "入力ãƒãƒ¼ãƒˆåã®å¤‰æ›´"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change output port name"
-msgstr "入力ã®åå‰ã‚’変更"
+msgstr "出力ãƒãƒ¼ãƒˆåã®å¤‰æ›´"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove input port"
-msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’除去"
+msgstr "入力ãƒãƒ¼ãƒˆã®å‰Šé™¤"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove output port"
-msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’除去"
+msgstr "出力ãƒãƒ¼ãƒˆã®å‰Šé™¤"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Set expression"
-msgstr "å¼ã‚’変更"
+msgstr "å¼ã®è¨­å®š"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Resize VisualShader node"
-msgstr "シェーダー"
+msgstr "ビジュアルシェーダーノードã®ã‚µã‚¤ã‚ºã‚’変更ã™ã‚‹"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Uniform Name"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Set Input Default Port"
-msgstr "'%s' ã®ãƒ‡ãƒ•ォルトã¨ã—ã¦è¨­å®š"
+msgstr "入力デフォルトãƒãƒ¼ãƒˆã®è¨­å®š"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add Node to Visual Shader"
-msgstr "シェーダー"
+msgstr "ビジュアルシェーダã«ãƒŽãƒ¼ãƒ‰ã‚’追加"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Duplicate Nodes"
msgstr "ノードを複製"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "ノードを貼り付ã‘"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "ノードを削除"
@@ -8157,10 +8067,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "ビジュアルシェーダã®å…¥åŠ›ã‚¿ã‚¤ãƒ—ãŒå¤‰æ›´ã•れã¾ã—ãŸ"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr "(GLES3ã®ã¿)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "頂点"
@@ -8175,22 +8081,24 @@ msgstr "å³å´é¢"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "シェーダーノードã®ä½œæˆ"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
-msgstr "ノードを生æˆ"
+msgstr "シェーダーノードã®ä½œæˆ"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color function."
-msgstr "関数ã«ç§»å‹•"
+msgstr "カラー関数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
-msgstr ""
+msgstr "Color演算å­ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Grayscale function."
-msgstr "関数を作æˆ"
+msgstr "グレースケール関数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts HSV vector to RGB equivalent."
@@ -8201,22 +8109,20 @@ msgid "Converts RGB vector to HSV equivalent."
msgstr "RGBベクトルをHSVベクトルã«å¤‰æ›ã—ã¾ã™ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Sepia function."
-msgstr "関数åを変更"
+msgstr "セピア関数"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Burn operator."
-msgstr ""
+msgstr "Burn演算å­ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Darken operator."
-msgstr ""
+msgstr "Darken演算å­ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Difference operator."
-msgstr "差分ã®ã¿"
+msgstr "差分演算å­ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Dodge operator."
@@ -8224,11 +8130,11 @@ msgstr "Dodge演算å­ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "HardLight operator"
-msgstr ""
+msgstr "HardLight演算å­"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Lighten operator."
-msgstr ""
+msgstr "Lighten演算å­ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Overlay operator."
@@ -8236,16 +8142,15 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Screen operator."
-msgstr ""
+msgstr "Screen演算å­ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "SoftLight operator."
-msgstr ""
+msgstr "SoftLight演算å­ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color constant."
-msgstr "コンスタント"
+msgstr "カラー定数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8317,9 +8222,8 @@ msgid ""
msgstr "INF(ã¾ãŸã¯NaN)ã¨ã‚¹ã‚«ãƒ©ãƒ‘ラメータã¨ã®æ¯”較ã®ãƒ–ãƒ¼ãƒ«çµæžœã‚’è¿”ã—ã¾ã™ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Boolean constant."
-msgstr "ベクトル定数を変更"
+msgstr "ブール定数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean uniform."
@@ -8327,12 +8231,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for all shader modes."
-msgstr ""
+msgstr "ã™ã¹ã¦ã®ã‚·ã‚§ãƒ¼ãƒ€ãƒ¼ãƒ¢ãƒ¼ãƒ‰ã® '%s' 入力パラメーター。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Input parameter."
-msgstr "親ã«ã‚¹ãƒŠãƒƒãƒ—"
+msgstr "入力パラメータ。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader modes."
@@ -8340,15 +8243,15 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment and light shader modes."
-msgstr ""
+msgstr "フラグメントモードã¨ãƒ©ã‚¤ãƒˆã‚·ã‚§ãƒ¼ãƒ€ãƒ¢ãƒ¼ãƒ‰ã® '%s' 入力パラメーター。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment shader mode."
-msgstr ""
+msgstr "フラグメントシェーダーモード㮠'%s' 入力パラメーター。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for light shader mode."
-msgstr ""
+msgstr "ライトシェーダーモード㮠'%s' 入力パラメータ。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex shader mode."
@@ -8359,14 +8262,12 @@ msgid "'%s' input parameter for vertex and fragment shader mode."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar function."
-msgstr "スカラ関数を変更"
+msgstr "スカラー関数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar operator."
-msgstr "スカラ演算å­ã‚’変更"
+msgstr "スカラー演算å­ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "E constant (2.718282). Represents the base of the natural logarithm."
@@ -8398,7 +8299,7 @@ msgstr "Τ(タウ)定数(6.283185)ã¾ãŸã¯360度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sqrt2 constant (1.414214). Square root of 2."
-msgstr ""
+msgstr "Sqrt2定数(1.414214)。2ã®å¹³æ–¹æ ¹ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the absolute value of the parameter."
@@ -8543,10 +8444,11 @@ msgid "Returns the square root of the parameter."
msgstr "パラメータã®å¹³æ–¹æ ¹ã‚’è¿”ã—ã¾ã™ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8557,10 +8459,11 @@ msgstr ""
"ã•れã¾ã™ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step関数( scalar(edge)ã€scalar(x))。\n"
"\n"
@@ -8599,9 +8502,8 @@ msgid "Subtracts scalar from scalar."
msgstr "スカラーã‹ã‚‰ã‚¹ã‚«ãƒ©ãƒ¼ã‚’減算ã—ã¾ã™ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar constant."
-msgstr "スカラ定数を変更"
+msgstr "スカラー定数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8693,14 +8595,12 @@ msgid "Transform uniform."
msgstr "トランスフォームã¯ä¸­æ­¢ã•れã¾ã—ãŸ."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector function."
-msgstr "関数ã«ç§»å‹•..."
+msgstr "ベクトル関数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector operator."
-msgstr "ベクトル演算å­ã‚’変更"
+msgstr "ベクトル演算å­ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes vector from three scalars."
@@ -8744,6 +8644,11 @@ msgid "Linear interpolation between two vectors."
msgstr "2ã¤ã®ãƒ™ã‚¯ãƒˆãƒ«é–“ã®ãƒªãƒ‹ã‚¢è£œé–“。"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "2ã¤ã®ãƒ™ã‚¯ãƒˆãƒ«é–“ã®ãƒªãƒ‹ã‚¢è£œé–“。"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr "ãƒ™ã‚¯ãƒˆãƒ«ã®æ­£è¦åŒ–ç©ã‚’計算ã—ã¾ã™ã€‚"
@@ -8767,10 +8672,11 @@ msgid "Returns the vector that points in the direction of refraction."
msgstr "å±ˆæŠ˜ã®æ–¹å‘を指ã™ãƒ™ã‚¯ãƒˆãƒ«ã‚’è¿”ã—ã¾ã™ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8781,10 +8687,11 @@ msgstr ""
"ã•れã¾ã™ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8795,20 +8702,22 @@ msgstr ""
"ã•れã¾ã™ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step関数( vector(edge)ã€vector(x))。\n"
"\n"
"'x' ㌠'edge' よりå°ã•ã„å ´åˆã¯0.0ã‚’è¿”ã—ã€ãれ以外ã®å ´åˆã¯1.0ã‚’è¿”ã—ã¾ã™ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step関数( scalar(edge)ã€vector(x))。\n"
"\n"
@@ -8835,9 +8744,8 @@ msgid "Subtracts vector from vector."
msgstr "ベクトルã«ãƒ™ã‚¯ãƒˆãƒ«ã‚’減算ã—ã¾ã™ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector constant."
-msgstr "ベクトル定数を変更"
+msgstr "ベクトル定数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8863,6 +8771,13 @@ msgstr ""
"è¿”ã—ã¾ã™ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr "(フラグメント/ライトモードã®ã¿)スカラー導関数。"
@@ -8917,19 +8832,16 @@ msgstr ""
"(フラグメント/ライトモードã®ã¿)(スカラー) 'x' 㨠'y' ã®çµ¶å¯¾å°Žé–¢æ•°ã®åˆè¨ˆã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "シェーダー"
+msgstr "ビジュアルシェーダー"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Edit Visual Property"
-msgstr "タイル プロパティを編集"
+msgstr "ビジュアルプロパティã®ç·¨é›†"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Visual Shader Mode Changed"
-msgstr "シェーダーã®å¤‰æ›´"
+msgstr "ビジュアルシェーダモードãŒå¤‰æ›´ã•れã¾ã—ãŸ"
#: editor/project_export.cpp
msgid "Runnable"
@@ -8967,14 +8879,12 @@ msgid "Release"
msgstr "離ã—ãŸ"
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "%sã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆä¸­"
+msgstr "ã™ã¹ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
#: editor/project_export.cpp
-#, fuzzy
msgid "The given export path doesn't exist:"
-msgstr "存在ã—ãªã„パスã§ã™ã€‚"
+msgstr "指定ã•れãŸã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒ‘スãŒå­˜åœ¨ã—ã¾ã›ã‚“:"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing/corrupted:"
@@ -9011,9 +8921,8 @@ msgid "Export selected resources (and dependencies)"
msgstr "é¸æŠžã—ãŸãƒªã‚½ãƒ¼ã‚¹ï¼ˆã¨ä¾å­˜é–¢ä¿‚ã«ã‚ã‚‹ã‚‚ã®ï¼‰ã‚’エクスãƒãƒ¼ãƒˆ"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Mode:"
-msgstr "エクスãƒãƒ¼ãƒˆã®ãƒ¢ãƒ¼ãƒ‰:"
+msgstr "エクスãƒãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰:"
#: editor/project_export.cpp
msgid "Resources to export:"
@@ -9040,9 +8949,8 @@ msgid "Make Patch"
msgstr "パッãƒç”Ÿæˆ"
#: editor/project_export.cpp
-#, fuzzy
msgid "Features"
-msgstr "テクスãƒãƒ£"
+msgstr "特徴"
#: editor/project_export.cpp
msgid "Custom (comma-separated):"
@@ -9066,9 +8974,8 @@ msgid "Text"
msgstr "テキスト"
#: editor/project_export.cpp
-#, fuzzy
msgid "Compiled"
-msgstr "圧縮"
+msgstr "コンパイル"
#: editor/project_export.cpp
msgid "Encrypted (Provide Key Below)"
@@ -9087,6 +8994,7 @@ msgid "Export PCK/Zip"
msgstr "PCK/Zipã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
#: editor/project_export.cpp
+#, fuzzy
msgid "Export mode?"
msgstr "エクスãƒãƒ¼ãƒˆ モード?"
@@ -9099,6 +9007,10 @@ msgid "Export templates for this platform are missing:"
msgstr "ã“ã®ãƒ—ラットフォームã«å¯¾ã™ã‚‹ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ テンプレートãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "エクスãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レートã®ç®¡ç†"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "デãƒãƒƒã‚°ä»˜ãエクスãƒãƒ¼ãƒˆ"
@@ -9149,9 +9061,8 @@ msgid "It would be a good idea to name your project."
msgstr "プロジェクトã«åå‰ã‚’付ã‘ã¦ãã ã•ã„."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid project path (changed anything?)."
-msgstr "䏿­£ãªãƒ—ロジェクトã®ãƒ‘ス(何ã‹å¤‰ãˆã¾ã—ãŸã‹ï¼Ÿï¼‰"
+msgstr "プロジェクトパスãŒç„¡åйã§ã™(何ã‹ã‚’変更ã—ã¾ã—ãŸã‹?)。"
#: editor/project_manager.cpp
msgid ""
@@ -9259,6 +9170,15 @@ msgid "Unnamed Project"
msgstr "åç„¡ã—ã®ãƒ—ロジェクト"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "既存ã®ãƒ—ロジェクトをインãƒãƒ¼ãƒˆ"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "次ã®å ´æ‰€ã®ãƒ—ロジェクトを開ã‘ã¾ã›ã‚“ '%s'。"
@@ -9267,7 +9187,6 @@ msgid "Are you sure to open more than one project?"
msgstr "複数ã®ãƒ—ロジェクトを開ã„ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹?"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"The following project settings file does not specify the version of Godot "
"through which it was created.\n"
@@ -9279,13 +9198,13 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
-"以下ã®ãƒ—ロジェクト設定ファイルã¯ã€å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¨ãƒ³ã‚¸ãƒ³ã«ã‚ˆã‚Šç”Ÿæˆã•れã¦ãŠ"
-"りã€ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç”¨ã«å¤‰æ›ãŒå¿…è¦ã§ã™:\n"
+"次ã®ãƒ—ロジェクト設定ファイルã«ã¯ã€ä½œæˆã«ä½¿ç”¨ã—ãŸGodotã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯æŒ‡å®šã•れã¦"
+"ã„ã¾ã›ã‚“。\n"
"\n"
"%s\n"
"\n"
-"変æ›ã—ã¾ã™ã‹?\n"
-"警告: ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆã¯æ—§ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¨ãƒ³ã‚¸ãƒ³ã§é–‹ãã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚"
+"ファイルを開ãã¨ã€Godotã®ç¾åœ¨ã®è¨­å®šãƒ•ァイル形å¼ã«å¤‰æ›ã•れã¾ã™ã€‚\n"
+"警告:以å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¨ãƒ³ã‚¸ãƒ³ã§ã¯ãƒ—ロジェクトを開ã‘ã¾ã›ã‚“。"
#: editor/project_manager.cpp
msgid ""
@@ -9315,15 +9234,14 @@ msgstr ""
"作æˆã•れã¦ã„ã¾ã™ã€‚"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in the Project Settings under "
"the \"Application\" category."
msgstr ""
-"é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³ '%s' ã¯ã€ã‚·ãƒ¼ãƒ³ ファイルã§ã¯ã‚りã¾ã›ã‚“ã€æœ‰åйãªã‚‚ã®ã‚’é¸æŠžã—ã¦ã„"
-"ã¾ã™ã‹ï¼Ÿ\n"
-"'アプリケーション' カテゴリã®ä¸‹ã®'プロジェクト設定'ã§å¤‰æ›´ã§ãã¾ã™ã€‚"
+"プロジェクトを実行ã§ãã¾ã›ã‚“:メインシーンãŒå®šç¾©ã•れã¦ã„ã¾ã›ã‚“\n"
+"プロジェクトを編集ã—ã€ã€Œã‚¢ãƒ—リケーションã€ã‚«ãƒ†ã‚´ãƒªå†…ã®ã€Œãƒ—ロジェクト設定ã€ã§"
+"メインシーンを設定ã—ã¦ãã ã•ã„。"
#: editor/project_manager.cpp
msgid ""
@@ -9334,42 +9252,42 @@ msgstr ""
"プロジェクトを編集ã—ã¦åˆæœŸã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’é–‹å§‹ã—ã¦ãã ã•ã„。"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Are you sure to run %d projects at once?"
-msgstr "複数ã®ãƒ—ロジェクトを実行ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹?"
+msgstr "%d個ã®ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆã‚’åŒæ™‚ã«å®Ÿè¡Œã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹?"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Remove %d projects from the list?\n"
"The project folders' contents won't be modified."
msgstr ""
-"一覧ã‹ã‚‰ãƒ—ロジェクトを削除ã—ã¾ã™ã‹ï¼Ÿï¼ˆãƒ•ォルダーã®å†…容ã¯å¤‰æ›´ã•れã¾ã›ã‚“)"
+"%d プロジェクトを一覧ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹?\n"
+"プロジェクトフォルダã®å†…容ã¯å¤‰æ›´ã•れã¾ã›ã‚“。"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Remove this project from the list?\n"
"The project folder's contents won't be modified."
msgstr ""
-"一覧ã‹ã‚‰ãƒ—ロジェクトを削除ã—ã¾ã™ã‹ï¼Ÿï¼ˆãƒ•ォルダーã®å†…容ã¯å¤‰æ›´ã•れã¾ã›ã‚“)"
+"ã“ã®ãƒ—ロジェクトを一覧ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹?\n"
+"プロジェクトフォルダã®å†…容ã¯å¤‰æ›´ã•れã¾ã›ã‚“。"
#: editor/project_manager.cpp
#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
-"一覧ã‹ã‚‰ãƒ—ロジェクトを削除ã—ã¾ã™ã‹ï¼Ÿï¼ˆãƒ•ォルダーã®å†…容ã¯å¤‰æ›´ã•れã¾ã›ã‚“)"
+"%d プロジェクトを一覧ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹?\n"
+"プロジェクトフォルダã®å†…容ã¯å¤‰æ›´ã•れã¾ã›ã‚“。"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Language changed.\n"
"The interface will update after restarting the editor or project manager."
msgstr ""
"言語ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚\n"
-"エディターã¾ãŸã¯ãƒ—ロジェクトマãƒãƒ¼ã‚¸ãƒ£ãƒ¼å†èµ·å‹•後ã«UIãŒæ›´æ–°ã•れã¾ã™ã€‚"
+"エディタã¾ãŸã¯ãƒ—ロジェクトマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã®å†èµ·å‹•後ã«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ãŒæ›´æ–°ã•れ"
+"ã¾ã™ã€‚"
#: editor/project_manager.cpp
msgid ""
@@ -9384,8 +9302,9 @@ msgid "Project Manager"
msgstr "プロジェクトマãƒãƒ¼ã‚¸ãƒ£ãƒ¼"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "プロジェクト一覧"
+#, fuzzy
+msgid "Projects"
+msgstr "プロジェクト"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9400,19 +9319,14 @@ msgid "New Project"
msgstr "æ–°è¦ãƒ—ロジェクト"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Remove Missing"
-msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’除去"
+msgstr "存在ã—ãªã„ã‚‚ã®ã‚’削除"
#: editor/project_manager.cpp
msgid "Templates"
msgstr "テンプレート"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "終了"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "今ã™ãå†èµ·å‹•"
@@ -9433,14 +9347,12 @@ msgid "Key "
msgstr "キー "
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Joy Button"
-msgstr "ジョイスティックã®ãƒœã‚¿ãƒ³"
+msgstr "ゲームパッドã®ãƒœã‚¿ãƒ³"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Joy Axis"
-msgstr "ジョイスティックã®è»¸"
+msgstr "ã‚²ãƒ¼ãƒ ãƒ‘ãƒƒãƒ‰ã®æ–¹å‘キー/スティック"
#: editor/project_settings_editor.cpp
msgid "Mouse Button"
@@ -9455,18 +9367,16 @@ msgstr ""
"ã¨ã¯ã§ãã¾ã›ã‚“"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "アクション'%s'ã¯æ—¢ã«ã‚りã¾ã™!"
+msgstr "'%s' ã¨ã„ã†åå‰ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ãŒæ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚"
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
msgstr "入力アクションイベントã®åå‰ã‚’変更ã™ã‚‹"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "アニメーションã®åå‰ã‚’変更:"
+msgstr "アクションデッドゾーンã®å¤‰æ›´"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
@@ -9513,56 +9423,46 @@ msgid "Middle Button"
msgstr "中央ボタン"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Up Button"
-msgstr "ホイールupボタン"
+msgstr "ホイール上ボタン"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Down Button"
-msgstr "ホイールDownボタン"
+msgstr "ホイール下ボタン"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "ホイールupボタン"
+msgstr "ホイール左ボタン"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "å³ãƒœã‚¿ãƒ³"
+msgstr "ホイールå³ãƒœã‚¿ãƒ³"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "ボタン6"
+msgstr "Xボタン1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "ボタン6"
+msgstr "Xボタン2"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Joypad Axis Index:"
-msgstr "ジョイパッド軸ã®Index:"
+msgstr "ã‚¸ãƒ§ã‚¤ãƒ‘ãƒƒãƒ‰ã®æ–¹å‘キー/スティックã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹:"
#: editor/project_settings_editor.cpp
msgid "Axis"
msgstr "アナログ"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Joypad Button Index:"
-msgstr "ジョイパッドã®ãƒœã‚¿ãƒ³ã®Index:"
+msgstr "ジョイパッドã®ãƒœã‚¿ãƒ³ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹:"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Erase Input Action"
-msgstr "入力アクションイベントを消去"
+msgstr "入力アクションを消去"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Erase Input Action Event"
msgstr "入力アクションイベントを消去"
@@ -9596,18 +9496,16 @@ msgid "Wheel Down."
msgstr "マウスホイールを下."
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Add Global Property"
-msgstr "プロパティã«getter(get method)を作る"
+msgstr "グローãƒãƒ«ãƒ—ロパティã®è¿½åŠ "
#: editor/project_settings_editor.cpp
msgid "Select a setting item first!"
msgstr "è¨­å®šé …ç›®ã‚’é¸æŠžã—ã¦ãã ã•ã„!"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "No property '%s' exists."
-msgstr "プロパティ:"
+msgstr "プロパティ '%s' ã¯å­˜åœ¨ã—ã¾ã›ã‚“。"
#: editor/project_settings_editor.cpp
msgid "Setting '%s' is internal, and it can't be deleted."
@@ -9626,9 +9524,8 @@ msgstr ""
"ãã¾ã›ã‚“。"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Add Input Action"
-msgstr "入力アクションを追加"
+msgstr "入力アクションã®è¿½åŠ "
#: editor/project_settings_editor.cpp
msgid "Error saving settings."
@@ -9665,9 +9562,8 @@ msgid "Change Resource Remap Language"
msgstr "リソースリマップ言語を変更"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Remove Resource Remap"
-msgstr "リソースã®ãƒªãƒžãƒƒãƒ—を除去"
+msgstr "リソースã®ãƒªãƒžãƒƒãƒ—を削除"
#: editor/project_settings_editor.cpp
#, fuzzy
@@ -9675,9 +9571,8 @@ msgid "Remove Resource Remap Option"
msgstr "リソースã®ãƒªãƒžãƒƒãƒ—オプションを除去"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Changed Locale Filter"
-msgstr "ブレンドã™ã‚‹æ™‚間を変更"
+msgstr "ロケールフィルタã®å¤‰æ›´"
#: editor/project_settings_editor.cpp
msgid "Changed Locale Filter Mode"
@@ -9696,9 +9591,8 @@ msgid "Override For..."
msgstr ""
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
-#, fuzzy
msgid "The editor must be restarted for changes to take effect."
-msgstr "変更を有効ã«ã™ã‚‹ã«ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™"
+msgstr "変更を有効ã«ã™ã‚‹ã«ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -9757,12 +9651,10 @@ msgid "Locales Filter"
msgstr "ロケールフィルター"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show All Locales"
msgstr "ã™ã¹ã¦ã®ãƒ­ã‚±ãƒ¼ãƒ«ã‚’表示ã™ã‚‹"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show Selected Locales Only"
msgstr "é¸æŠžã—ãŸãƒ­ã‚±ãƒ¼ãƒ«ã®ã¿è¡¨ç¤º"
@@ -9778,6 +9670,10 @@ msgstr "ロケール:"
msgid "AutoLoad"
msgstr "自動読ã¿è¾¼ã¿"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "プラグイン"
+
#: editor/property_editor.cpp
#, fuzzy
msgid "Zero"
@@ -9812,36 +9708,24 @@ msgid "Error loading file: Not a resource!"
msgstr "ファイル読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: リソースã§ã¯ã‚りã¾ã›ã‚“!"
#: editor/property_editor.cpp
-#, fuzzy
msgid "Pick a Node"
-msgstr "ノードã¸ã®ãƒ‘ス:"
+msgstr "ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠžã™ã‚‹"
#: editor/property_editor.cpp
msgid "Bit %d, val %d."
msgstr "ビット %d, 値 %d."
#: editor/property_selector.cpp
-#, fuzzy
msgid "Select Property"
-msgstr "ã™ã¹ã¦é¸æŠž"
+msgstr "プロパティã®é¸æŠž"
#: editor/property_selector.cpp
-#, fuzzy
msgid "Select Virtual Method"
-msgstr "ã™ã¹ã¦é¸æŠž"
+msgstr "Virtualãƒ¡ã‚½ãƒƒãƒ‰ã‚’é¸æŠž"
#: editor/property_selector.cpp
-#, fuzzy
msgid "Select Method"
-msgstr "ã™ã¹ã¦é¸æŠž"
-
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "PVRTCツールを実行ã§ãã¾ã›ã‚“ã§ã—ãŸ:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr "PVRTCツールを使用ã—ã¦å¤‰æ›ã•れãŸã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’å…ƒã«æˆ»ã™ã“ã¨ãŒã§ãã¾ã›ã‚“:"
+msgstr "メソッドã®é¸æŠž"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
@@ -9857,9 +9741,8 @@ msgid "Suffix"
msgstr "サフィックス"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced Options"
-msgstr "アニメーションã®ã‚ªãƒ—ション"
+msgstr "高度ãªã‚ªãƒ—ション"
#: editor/rename_dialog.cpp
msgid "Substitute"
@@ -9874,9 +9757,8 @@ msgid "Node's parent name, if available"
msgstr "ノードã®è¦ªã®åå‰ (使用å¯èƒ½ãªå ´åˆ)"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "ノードタイプを探ã™"
+msgstr "ノードタイプ"
#: editor/rename_dialog.cpp
msgid "Current scene name"
@@ -9927,9 +9809,8 @@ msgstr ""
"欠è½ã—ãŸæ•°å­—ã¯ã€å…ˆé ­ã«ã‚¼ãƒ­ãŒåŸ‹ã‚è¾¼ã¾ã‚Œã¾ã™ã€‚"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "å¼ã‚’変更"
+msgstr "æ­£è¦è¡¨ç¾"
#: editor/rename_dialog.cpp
msgid "Post-Process"
@@ -9941,11 +9822,11 @@ msgstr "ä¿æŒ"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "キャメルケースをアンダースコアã«"
#: editor/rename_dialog.cpp
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "アンダースコアをキャメルケースã«"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -9992,7 +9873,6 @@ msgid "Current Scene"
msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³"
#: editor/run_settings_dialog.cpp
-#, fuzzy
msgid "Main Scene"
msgstr "メインシーン"
@@ -10009,18 +9889,16 @@ msgid "No parent to instance the scenes at."
msgstr "シーンをインスタンス化ã™ã‚‹è¦ªãŒã‚りã¾ã›ã‚“。"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Error loading scene from %s"
msgstr "シーンを%sã‹ã‚‰èª­ã¿è¾¼ã‚€éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç”Ÿã˜ã¾ã—ãŸ"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid ""
"Cannot instance the scene '%s' because the current scene exists within one "
"of its nodes."
msgstr ""
"ã“ã®ã‚·ãƒ¼ãƒ³ã¯è‡ªèº«ã®ãƒŽãƒ¼ãƒ‰ã®ã†ã¡ã®ä¸€ã¤ã®å†…ã«ã‚ã‚‹ãŸã‚〠'%s'シーンをインスタンス"
-"化ã§ãã¾ã›ã‚“"
+"化ã§ãã¾ã›ã‚“。"
#: editor/scene_tree_dock.cpp
msgid "Instance Scene(s)"
@@ -10035,9 +9913,8 @@ msgid "Clear Script"
msgstr "スクリプトをクリア"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "This operation can't be done on the tree root."
-msgstr "ã“ã®å‡¦ç†ã¯ãƒ„リーã®ãƒ«ãƒ¼ãƒˆã§ã¯ã§ãã¾ã›ã‚“."
+msgstr "ã“ã®å‡¦ç†ã¯ãƒ„リーã®ãƒ«ãƒ¼ãƒˆã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。"
#: editor/scene_tree_dock.cpp
msgid "Move Node In Parent"
@@ -10066,23 +9943,20 @@ msgid "Instantiated scenes can't become root"
msgstr "インスタンス化ã•れãŸã‚·ãƒ¼ãƒ³ã¯ãƒ«ãƒ¼ãƒˆã«ã§ãã¾ã›ã‚“"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make node as Root"
-msgstr "シーンをルートã«ã™ã‚‹"
+msgstr "ノードをルートã«ã™ã‚‹"
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)?"
msgstr "ノードを削除ã—ã¾ã™ã‹?"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Can not perform with the root node."
-msgstr "ルートノードãŒãªã„ã¨å‡¦ç†ã§ãã¾ã›ã‚“."
+msgstr "ルートノードã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "This operation can't be done on instanced scenes."
-msgstr "ã“ã®å‡¦ç†ã«ã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã•れãŸã‚·ãƒ¼ãƒ³ãŒå¿…è¦ã§ã™."
+msgstr "ã“ã®å‡¦ç†ã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã•れãŸã‚·ãƒ¼ãƒ³ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。"
#: editor/scene_tree_dock.cpp
msgid "Save New Scene As..."
@@ -10105,14 +9979,12 @@ msgid "Load As Placeholder"
msgstr "プレースホルダーã¨ã—ã¦ãƒ­ãƒ¼ãƒ‰"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Local"
-msgstr "ロケール"
+msgstr "ローカルã«ã™ã‚‹"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "New Scene Root"
-msgstr "シーンをルートã«ã™ã‚‹"
+msgstr "æ–°ã—ã„シーンã®ãƒ«ãƒ¼ãƒˆ"
#: editor/scene_tree_dock.cpp
msgid "Create Root Node:"
@@ -10131,19 +10003,16 @@ msgid "User Interface"
msgstr "ユーザーインターフェース"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Other Node"
-msgstr "ノードを削除"
+msgstr "ãã®ä»–ã®ãƒŽãƒ¼ãƒ‰"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Can't operate on nodes from a foreign scene!"
-msgstr "ç•°ãªã‚‹ã‚·ãƒ¼ãƒ³ã®ãƒŽãƒ¼ãƒ‰ã‚’処ç†ã§ãã¾ã›ã‚“!"
+msgstr "別ã®ã‚·ãƒ¼ãƒ³ã‹ã‚‰ãƒŽãƒ¼ãƒ‰ã‚’æ“作ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“!"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Can't operate on nodes the current scene inherits from!"
-msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³ãŒç¶™æ‰¿ã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’処ç†ã§ãã¾ã›ã‚“!"
+msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³ãŒç¶™æ‰¿ã—ã¦ã„るノードをæ“作ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“!"
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
@@ -10155,20 +10024,24 @@ msgstr "ノードを除去"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Change type of node(s)"
+msgstr "出力ãƒãƒ¼ãƒˆåã®å¤‰æ›´"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
msgstr ""
-"æ–°ã—ã„シーンをä¿å­˜ã§ãã¾ã›ã‚“。ä¾å­˜é–¢ä¿‚ã®å¯¾è±¡ãŒå®Œå‚™ã•れã¦ã„ãªã„ã¨æ€ã‚れã¾ã™"
+"æ–°ã—ã„シーンをä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ãŠãらãä¾å­˜é–¢ä¿‚(インスタンス)を満ãŸã™ã“"
+"ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
#: editor/scene_tree_dock.cpp
msgid "Error saving scene."
msgstr "シーンをä¿å­˜ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Error duplicating scene to save it."
-msgstr "ä¿å­˜ã®ãŸã‚シーンを複製ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿ."
+msgstr "ä¿å­˜ã®ãŸã‚シーンを複製ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
#: editor/scene_tree_dock.cpp
msgid "Sub-Resources"
@@ -10191,9 +10064,8 @@ msgid "Expand/Collapse All"
msgstr "ã™ã¹ã¦å±•é–‹/折りãŸãŸã¿"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Change Type"
-msgstr "型(type)を変更"
+msgstr "型を変更"
#: editor/scene_tree_dock.cpp
msgid "Extend Script"
@@ -10229,13 +10101,12 @@ msgid "Add/Create a New Node."
msgstr "æ–°ã—ã„ノードを追加/作æˆã™ã‚‹ã€‚"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid ""
"Instance a scene file as a Node. Creates an inherited scene if no root node "
"exists."
msgstr ""
-"シーンファイルをノードã¨ã—ã¦ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–. ã‚‚ã—ルートã®ï¼¾åº¦ãŒãªã‘れã°ã€ç¶™æ‰¿"
-"ã—ãŸã‚·ãƒ¼ãƒ³ã‚’生æˆ"
+"シーンファイルをノードã¨ã—ã¦ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«ã—ã¾ã™ã€‚ルートノードãŒå­˜åœ¨ã—ãªã„å ´"
+"åˆã¯ã€ç¶™æ‰¿ã•れãŸã‚·ãƒ¼ãƒ³ã‚’作æˆã—ã¾ã™ã€‚"
#: editor/scene_tree_dock.cpp
msgid "Attach a new or existing script for the selected node."
@@ -10255,44 +10126,41 @@ msgstr "ローカル"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance? (No Undo!)"
-msgstr "継承をクリアã—ã¾ã™ã‹?ï¼ˆã€Œå…ƒã«æˆ»ã™ã€ã§ãã¾ã›ã‚“!)"
+msgstr "継承をクリアã—ã¾ã™ã‹? (å…ƒã«æˆ»ã›ã¾ã›ã‚“!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
-msgstr "å¯è¦–性ã®åˆ‡ã‚Šæ›¿ãˆ"
+msgstr "表示ã®åˆ‡ã‚Šæ›¿ãˆ"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Unlock Node"
-msgstr "ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠž"
+msgstr "ノードã®ãƒ­ãƒƒã‚¯è§£é™¤"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Button Group"
-msgstr "ボタン7"
+msgstr "ボタングループ"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "(Connecting From)"
-msgstr "接続エラー"
+msgstr "(接続元)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Node configuration warning:"
msgstr "ノードã®è¨­å®šã«é–¢ã™ã‚‹è­¦å‘Š:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"ãƒŽãƒ¼ãƒ‰ã«æŽ¥ç¶šã¨ã‚°ãƒ«ãƒ¼ãƒ—ãŒã‚りã¾ã™ã€‚\n"
"クリックã§ã‚·ã‚°ãƒŠãƒ« ドックを表示。"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"ãƒŽãƒ¼ãƒ‰ã«æŽ¥ç¶šãŒã‚りã¾ã™ã€‚\n"
@@ -10301,16 +10169,15 @@ msgstr ""
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
-"ノードã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«å±žã—ã¦ã„ã¾ã™.\n"
-"クリックã—ã¦ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ‰ãƒƒã‚¯ã‚’表示ã—ã¦ãã ã•ã„."
+"ノードã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«å±žã—ã¦ã„ã¾ã™ã€‚\n"
+"クリックã—ã¦ã‚°ãƒ«ãƒ¼ãƒ—ドックを表示ã—ã¦ãã ã•ã„。"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Open Script:"
-msgstr "スクリプトを開ã"
+msgstr "スクリプトを開ã:"
#: editor/scene_tree_editor.cpp
msgid ""
@@ -10321,13 +10188,12 @@ msgstr ""
"クリックã—ã¦ãƒ­ãƒƒã‚¯ã‚’外ã—ã¦ãã ã•ã„。"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
"å­ã‚’é¸æŠžã§ãã¾ã›ã‚“.\n"
-"クリックã—ã¦é¸æŠžå¯èƒ½ã«ã—ã¦ãã ã•ã„"
+"クリックã—ã¦é¸æŠžå¯èƒ½ã«ã—ã¦ãã ã•ã„。"
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -10354,48 +10220,40 @@ msgid "Scene Tree (Nodes):"
msgstr "シーンツリー(ノード):"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Node Configuration Warning!"
-msgstr "ノードã®è¨­å®šã«é–¢ã™ã‚‹è­¦å‘Š:"
+msgstr "ノードã®è¨­å®šã«é–¢ã™ã‚‹è­¦å‘Š!"
#: editor/scene_tree_editor.cpp
msgid "Select a Node"
msgstr "ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠž"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is empty."
-msgstr "パスãŒã‚りã¾ã›ã‚“"
+msgstr "パスãŒç©ºã§ã™ã€‚"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty."
-msgstr "ファイルåãŒç©ºã§ã™"
+msgstr "ファイルåãŒç©ºã§ã™ã€‚"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is not local."
-msgstr "パスã¯ãƒ­ãƒ¼ã‚«ãƒ«ã§ã¯ã‚りã¾ã›ã‚“"
+msgstr "パスã¯ãƒ­ãƒ¼ã‚«ãƒ«ã§ã¯ã‚りã¾ã›ã‚“。"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid base path."
-msgstr "無効ãªãƒ™ãƒ¼ã‚¹ パス"
+msgstr "無効ãªãƒ™ãƒ¼ã‚¹ãƒ‘スã§ã™ã€‚"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "A directory with the same name exists."
-msgstr "åŒã˜åå‰ã®ãƒ•ォルダãŒã‚りã¾ã™"
+msgstr "åŒåã®ãƒ•ォルダãŒå­˜åœ¨ã—ã¾ã™ã€‚"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid extension."
-msgstr "ç„¡åŠ¹ãªæ‹¡å¼µå­ã§ã™"
+msgstr "ç„¡åŠ¹ãªæ‹¡å¼µå­ã§ã™ã€‚"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Wrong extension chosen."
-msgstr "æ‹¡å¼µå­ãŒèª¤ã£ã¦ã„ã¾ã™"
+msgstr "é–“é•ã£ãŸæ‹¡å¼µå­ãŒé¸æŠžã•れã¾ã—ãŸã€‚"
#: editor/script_create_dialog.cpp
msgid "Error loading template '%s'"
@@ -10406,47 +10264,45 @@ msgid "Error - Could not create script in filesystem."
msgstr "エラー - ファイルシステムã«ã‚¹ã‚¯ãƒªãƒ—トを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Error loading script from %s"
-msgstr "フォント読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ã€‚"
+msgstr "%s ã‹ã‚‰ã®ã‚¹ã‚¯ãƒªãƒ—トã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "上書ã"
#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "N/A"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script / Choose Location"
-msgstr "スクリプトエディタを開ã"
+msgstr "スクリプトを開ã/å ´æ‰€ã‚’é¸æŠžã™ã‚‹"
#: editor/script_create_dialog.cpp
msgid "Open Script"
msgstr "スクリプトを開ã"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "File exists, it will be reused."
-msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚上書ãã—ã¾ã™ã‹ï¼Ÿ"
+msgstr "ファイルã¯å­˜åœ¨ã—ã¾ã™ã€‚å†åˆ©ç”¨ã•れã¾ã™ã€‚"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid class name."
-msgstr "䏿­£ãªã‚¯ãƒ©ã‚¹å"
+msgstr "クラスåãŒç„¡åйã§ã™ã€‚"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid inherited parent name or path."
-msgstr "継承ã—ãŸè¦ªã®åå‰ã‹ãƒ‘スãŒä¸æ­£ã§ã™"
+msgstr "継承ã•れãŸè¦ªã®åå‰ã¾ãŸã¯ãƒ‘スãŒç„¡åйã§ã™ã€‚"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script is valid."
-msgstr "正当ãªã‚¹ã‚¯ãƒªãƒ—ト"
+msgstr "ã‚¹ã‚¯ãƒªãƒ—ãƒˆã¯æœ‰åйã§ã™ã€‚"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr "使用å¯èƒ½: a-z, A-Z, 0-9 㨠_"
+msgstr "使用å¯èƒ½: a-z, A-Z, 0-9 㨠."
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -10482,9 +10338,8 @@ msgid "Built-in Script"
msgstr "組ã¿è¾¼ã¿ã‚¹ã‚¯ãƒªãƒ—ト"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Attach Node Script"
-msgstr "ノードã«ã‚¹ã‚¯ãƒªãƒ—トを添付ã™ã‚‹"
+msgstr "ノードスクリプトを添付ã™ã‚‹"
#: editor/script_editor_debugger.cpp
msgid "Remote "
@@ -10515,9 +10370,8 @@ msgid "Copy Error"
msgstr "エラーをコピー"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Inspect Previous Instance"
-msgstr "å‰ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®å†…容を確èª"
+msgstr "å‰ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’調ã¹ã‚‹"
#: editor/script_editor_debugger.cpp
msgid "Inspect Next Instance"
@@ -10580,7 +10434,6 @@ msgid "Clicked Control:"
msgstr "クリックã•れãŸã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Clicked Control Type:"
msgstr "クリックã•れãŸã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã®ã‚¿ã‚¤ãƒ—:"
@@ -10597,19 +10450,20 @@ msgid "Export measures as CSV"
msgstr "数値データをCSVã¨ã—ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Erase Shortcut"
-msgstr "イージング(Ease Out)"
+msgstr "ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã®æ¶ˆåŽ»"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Restore Shortcut"
-msgstr "ショートカット"
+msgstr "ショートカットã®å¾©å…ƒ"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Change Shortcut"
-msgstr "アンカーを変更"
+msgstr "ショートカットを変更"
+
+#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "エディタ設定"
#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
@@ -10649,57 +10503,48 @@ msgid "Change Probe Extents"
msgstr "プローブã®ç¯„囲を変更"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Sphere Shape Radius"
-msgstr "çƒå½¢çжã®åŠå¾„変更"
+msgstr "çƒå½¢ã®åŠå¾„を変更"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Box Shape Extents"
-msgstr "ボックス(箱)形状ã®Extent(範囲)を変更"
+msgstr "ボックスシェイプ範囲ã®å¤‰æ›´"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Capsule Shape Radius"
-msgstr "カプセル形状ã®åŠå¾„変更"
+msgstr "カプセルシェイプã®åŠå¾„を変更"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Height"
msgstr "カプセル形状ã®é«˜ã•を変更ã™ã‚‹"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "カプセル形状ã®åŠå¾„変更"
+msgstr "円柱シェイプã®åŠå¾„を変更"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr "カプセル形状ã®é«˜ã•変更"
+msgstr "円柱シェイプã®é«˜ã•を変更"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
msgstr "レイシェイプã®é•·ã•を変更"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "å…‰æºã®åŠå¾„を変更"
+msgstr "円柱ã®åŠå¾„を変更"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "カプセル形状ã®é«˜ã•変更"
+msgstr "円柱ã®é«˜ã•を変更"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "çƒå½¢çжã®åŠå¾„変更"
+msgstr "トーラスã®å†…径を変更"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "å…‰æºã®åŠå¾„を変更"
+msgstr "トーラスã®å¤–径を変更"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -10710,9 +10555,8 @@ msgid "Select dependencies of the library for this entry"
msgstr "ã“ã®ã‚¨ãƒ³ãƒˆãƒªã®ãƒ©ã‚¤ãƒ–ラリã®ä¾å­˜é–¢ä¿‚ã‚’é¸æŠžã—ã¦ãã ã•ã„"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
-#, fuzzy
msgid "Remove current entry"
-msgstr "パスã®ãƒã‚¤ãƒ³ãƒˆã‚’除去"
+msgstr "ç¾åœ¨ã®ã‚¨ãƒ³ãƒˆãƒªã‚’削除ã™ã‚‹"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Double click to create a new entry"
@@ -10743,9 +10587,8 @@ msgid "Enabled GDNative Singleton"
msgstr "有効ãªGDNative Singleton"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
-#, fuzzy
msgid "Disabled GDNative Singleton"
-msgstr "アップデートスピナーを無効化"
+msgstr "無効ãªGDNativeシングルトン"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Library"
@@ -10764,9 +10607,8 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Step argument is zero!"
-msgstr "ステップ引数ã¯ã‚¼ãƒ­ã§ã™ï¼"
+msgstr "ステップ引数ã¯ã‚¼ãƒ­ã§ã™!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
@@ -10781,24 +10623,20 @@ msgid "Not based on a resource file"
msgstr "リソースファイルã«åŸºã¥ã„ã¦ã„ã¾ã›ã‚“"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Invalid instance dictionary format (missing @path)"
-msgstr "無効ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹è¾žæ›¸å½¢å¼ã§ã™ ( @path ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“)"
+msgstr "無効ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹è¾žæ›¸å½¢å¼ã§ã™(@pathãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“)"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Invalid instance dictionary format (can't load script at @path)"
-msgstr "無効ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹è¾žæ›¸å½¢å¼ã§ã™ (@path ã§ã‚¹ã‚¯ãƒªãƒ—トを読ã¿è¾¼ã‚ã¾ã›ã‚“)"
+msgstr "無効ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹è¾žæ›¸å½¢å¼ã§ã™(@path ã§ã‚¹ã‚¯ãƒªãƒ—トを読ã¿è¾¼ã‚ã¾ã›ã‚“)"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Invalid instance dictionary format (invalid script at @path)"
-msgstr "無効ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹è¾žæ›¸å½¢å¼ã§ã™ (@path ã§ç„¡åйãªã‚¹ã‚¯ãƒªãƒ—ト)"
+msgstr "無効ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹è¾žæ›¸å½¢å¼ã§ã™(@path ã§ç„¡åйãªã‚¹ã‚¯ãƒªãƒ—ト)"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Invalid instance dictionary (invalid subclasses)"
-msgstr "無効ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹è¾žæ›¸ã§ã™ (無効ãªã‚µãƒ–クラス)"
+msgstr "無効ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹è¾žæ›¸ã§ã™(無効ãªã‚µãƒ–クラス)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Object can't provide a length."
@@ -10885,19 +10723,16 @@ msgid "Edit Z Axis"
msgstr "Z軸を編集"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Cursor Rotate X"
-msgstr "Ctrl: 回転"
+msgstr "X軸ã§ã‚«ãƒ¼ã‚½ãƒ«ã‚’回転"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Cursor Rotate Y"
-msgstr "Ctrl: 回転"
+msgstr "Y軸ã§ã‚«ãƒ¼ã‚½ãƒ«ã‚’回転"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Cursor Rotate Z"
-msgstr "Ctrl: 回転"
+msgstr "Z軸ã§ã‚«ãƒ¼ã‚½ãƒ«ã‚’回転"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate X"
@@ -10974,45 +10809,40 @@ msgid "Eroding walkable area..."
msgstr "移動å¯èƒ½ãªé ˜åŸŸã‚’作æˆä¸­..."
#: modules/recast/navigation_mesh_generator.cpp
-#, fuzzy
msgid "Partitioning..."
-msgstr "警告"
+msgstr "パーティションを作æˆã—ã¦ã„ã¾ã™..."
#: modules/recast/navigation_mesh_generator.cpp
-#, fuzzy
msgid "Creating contours..."
-msgstr "八分木テクスãƒãƒ£ã‚’生æˆ"
+msgstr "輪郭を作æˆã—ã¦ã„ã¾ã™..."
#: modules/recast/navigation_mesh_generator.cpp
-#, fuzzy
msgid "Creating polymesh..."
-msgstr "アウトラインメッシュを生æˆ..."
+msgstr "ãƒãƒªãƒ¡ãƒƒã‚·ãƒ¥ã‚’作æˆã—ã¦ã„ã¾ã™..."
#: modules/recast/navigation_mesh_generator.cpp
-#, fuzzy
msgid "Converting to native navigation mesh..."
-msgstr "ナビメッシュ(ナビゲーションメッシュ)ã®ç”Ÿæˆ"
+msgstr "ãƒã‚¤ãƒ†ã‚£ãƒ–ナビゲーションメッシュã«å¤‰æ›ã—ã¦ã„ã¾ã™..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Navigation Mesh Generator Setup:"
msgstr "ナビメッシュ(ナビゲーションメッシュ)生æˆè¨­å®š:"
#: modules/recast/navigation_mesh_generator.cpp
-#, fuzzy
msgid "Parsing Geometry..."
-msgstr "ジオメトリーをパース"
+msgstr "ジオメトリを解æžã—ã¦ã„ã¾ã™..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Done!"
msgstr "完了!"
#: modules/visual_script/visual_script.cpp
-#, fuzzy
msgid ""
"A node yielded without working memory, please read the docs on how to yield "
"properly!"
msgstr ""
-"ノードã®ãƒ¡ãƒ¢ãƒªãƒ¼ä¸è¶³ã§ã™ã€‚ノードã«é–¢ã—ã¦ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’ãŠèª­ã¿ãã ã•ã„。"
+"作業メモリãªã—ã§ãƒŽãƒ¼ãƒ‰ãŒç”Ÿæˆã•れã¾ã—ãŸã€‚æ­£ã—ã生æˆã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€ãƒ‰ã‚­ãƒ¥"
+"メントをå‚ç…§ã—ã¦ãã ã•ã„!"
#: modules/visual_script/visual_script.cpp
msgid ""
@@ -11022,18 +10852,16 @@ msgstr ""
"ノードã¯ç”Ÿæˆã—ã¾ã—ãŸãŒã€æœ€åˆã®ä½œæ¥­ãƒ¡ãƒ¢ãƒªãƒ¼ã«é–¢æ•°çŠ¶æ…‹ã‚’è¿”ã—ã¾ã›ã‚“ã§ã—ãŸã€‚"
#: modules/visual_script/visual_script.cpp
-#, fuzzy
msgid ""
"Return value must be assigned to first element of node working memory! Fix "
"your node please."
msgstr ""
-"返り値ã¯ãƒŽãƒ¼ãƒ‰ã®ãƒ¯ãƒ¼ã‚­ãƒ³ã‚°ãƒ¡ãƒ¢ãƒªãƒ¼ã§æœ€åˆã®è¦ç´ ã«ã‚¢ã‚µã‚¤ãƒ³ã•れã¦ã„ã‚‹å¿…è¦ãŒã‚り"
-"ã¾ã™!ノードを修正ã—ã¦ãã ã•ã„!"
+"戻り値ã¯ãƒŽãƒ¼ãƒ‰ã®ä½œæ¥­ç”¨ãƒ¡ãƒ¢ãƒªã®æœ€åˆã®è¦ç´ ã«å‰²ã‚Šå½“ã¦ãªã‘れã°ãªã‚Šã¾ã›ã‚“!ノードを"
+"修正ã—ã¦ãã ã•ã„。"
#: modules/visual_script/visual_script.cpp
-#, fuzzy
msgid "Node returned an invalid sequence output: "
-msgstr "ノードã¯ä¸æ­£ãªã‚·ãƒ¼ã‚¯ã‚¨ãƒ³ã‚¹å‡ºåŠ›ã‚’è¿”ã—ã¾ã—ãŸ: "
+msgstr "ノードã¯ç„¡åйãªã‚·ãƒ¼ã‚¯ã‚¨ãƒ³ã‚¹å‡ºåŠ›ã‚’è¿”ã—ã¾ã—ãŸ: "
#: modules/visual_script/visual_script.cpp
msgid "Found sequence bit but not the node in the stack, report bug!"
@@ -11050,24 +10878,30 @@ msgid "Change Signal Arguments"
msgstr "シグナルã®å¼•数を変更"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Argument Type"
-msgstr "é…列ã®å€¤ã®ç¨®é¡žã®å¤‰æ›´"
+msgstr "引数ã®åž‹ã®å¤‰æ›´"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Argument name"
-msgstr "入力ã®åå‰ã‚’変更"
+msgstr "引数åã®å¤‰æ›´"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Set Variable Default Value"
-msgstr "è¦å®šå€¤ã‚’変更"
+msgstr "変数ã®ãƒ‡ãƒ•ォルト値を設定ã™ã‚‹"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Set Variable Type"
-msgstr "変数を編集:"
+msgstr "変数ã®åž‹ã‚’設定"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "既存ã®çµ„è¾¼ã¿åž‹åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "æ–°è¦ãƒŽãƒ¼ãƒ‰ã‚’作æˆã€‚"
#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
@@ -11075,8 +10909,17 @@ msgstr "変数を作æˆ:"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
+msgid "Create a new variable."
+msgstr "æ–°è¦ãƒŽãƒ¼ãƒ‰ã‚’作æˆã€‚"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "æ–°è¦ãƒãƒªã‚´ãƒ³ã‚’生æˆã€‚"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
-msgstr "ã“ã®åå‰ã¯ä¸æ­£ãªè­˜åˆ¥å­ã§ã™:"
+msgstr "ã“ã®åå‰ã¯ç„¡åйãªè­˜åˆ¥å­ã§ã™:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Name already in use by another func/var/signal:"
@@ -11155,24 +10998,20 @@ msgid "Add Preload Node"
msgstr "プリロードノードを追加"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Node(s) From Tree"
-msgstr "シーンã‹ã‚‰ã®ãƒŽãƒ¼ãƒ‰"
+msgstr "ツリーã‹ã‚‰ãƒŽãƒ¼ãƒ‰ã‚’追加"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Getter Property"
-msgstr "プロパティã«getter(get method)を作る"
+msgstr "ゲッタープロパティã®è¿½åŠ "
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Setter Property"
-msgstr "プロパティã«setter(set method)を作る"
+msgstr "セッタープロパティã®è¿½åŠ "
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Base Type"
-msgstr "型(type)を変更"
+msgstr "基本ã®åž‹ã‚’変更"
#: modules/visual_script/visual_script_editor.cpp
msgid "Move Node(s)"
@@ -11183,38 +11022,32 @@ msgid "Remove VisualScript Node"
msgstr "VisualScriptノードを除去"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Nodes"
-msgstr "ãƒŽãƒ¼ãƒ‰ã«æŽ¥ç¶šã—ã¾ã™:"
+msgstr "ãƒŽãƒ¼ãƒ‰ã«æŽ¥ç¶š"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "ãƒŽãƒ¼ãƒ‰ã«æŽ¥ç¶šã—ã¾ã™:"
+msgstr "ãƒŽãƒ¼ãƒ‰ãƒ‡ãƒ¼ã‚¿ã«æŽ¥ç¶š"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "ãƒŽãƒ¼ãƒ‰ã«æŽ¥ç¶šã—ã¾ã™:"
+msgstr "ãƒŽãƒ¼ãƒ‰ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã«æŽ¥ç¶š"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
msgstr "スクリプトã«é–¢æ•° '%s'ãŒæ—¢ã«ã‚りã¾ã™"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Input Value"
-msgstr "入力ã®åå‰ã‚’変更"
+msgstr "入力値ã®å¤‰æ›´"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Resize Comment"
-msgstr "CanvasItemをリサイズ"
+msgstr "コメントã®ã‚µã‚¤ã‚ºã‚’変更ã™ã‚‹"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Can't copy the function node."
-msgstr "'..'を処ç†ã§ãã¾ã›ã‚“"
+msgstr "ファンクションノードをコピーã§ãã¾ã›ã‚“。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Clipboard is empty!"
@@ -11229,14 +11062,12 @@ msgid "Remove Function"
msgstr "関数を除去"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Variable"
-msgstr "無効ãªã‚­ãƒ¼ã‚’削除"
+msgstr "変数を削除"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Editing Variable:"
-msgstr "変数を編集中:"
+msgstr "編集中ã®å¤‰æ•°:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Signal"
@@ -11247,9 +11078,8 @@ msgid "Editing Signal:"
msgstr "シグナルを接続:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Base Type:"
-msgstr "基底型(Base Type):"
+msgstr "基本タイプ:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Members:"
@@ -11268,7 +11098,6 @@ msgid "Delete Selected"
msgstr "é¸æŠžæ¸ˆã¿ã‚’削除"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Find Node Type"
msgstr "ノードタイプを探ã™"
@@ -11281,35 +11110,26 @@ msgid "Cut Nodes"
msgstr "ノードを切りå–ã‚‹"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "ノードを貼り付ã‘"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "メンãƒãƒ¼ã‚’編集"
#: modules/visual_script/visual_script_flow_control.cpp
-#, fuzzy
msgid "Input type not iterable: "
-msgstr "入力ã®åž‹ãŒã€ç¹°ã‚Šè¿”ã—処ç†ã§ãã¾ã›ã‚“(not iterable): "
+msgstr "入力タイプをå復ã§ãã¾ã›ã‚“: "
#: modules/visual_script/visual_script_flow_control.cpp
-#, fuzzy
msgid "Iterator became invalid"
-msgstr "イテレーターãŒä¸æ­£ã§ã™"
+msgstr "イテレータãŒç„¡åйã«ãªã‚Šã¾ã—ãŸ"
#: modules/visual_script/visual_script_flow_control.cpp
-#, fuzzy
msgid "Iterator became invalid: "
-msgstr "イテレーターãŒä¸æ­£ã§ã™: "
+msgstr "イテレーターãŒç„¡åйã«ãªã‚Šã¾ã—ãŸ: "
#: modules/visual_script/visual_script_func_nodes.cpp
-#, fuzzy
msgid "Invalid index property name."
-msgstr "インデックスã®ãƒ—ロパティåãŒä¸æ­£ã§ã™."
+msgstr "インデックスプロパティåãŒç„¡åйã§ã™ã€‚"
#: modules/visual_script/visual_script_func_nodes.cpp
-#, fuzzy
msgid "Base object is not a Node!"
msgstr "ベースオブジェクトã¯ãƒŽãƒ¼ãƒ‰ã§ã¯ã‚りã¾ã›ã‚“!"
@@ -11319,7 +11139,6 @@ msgid "Path does not lead Node!"
msgstr "パスãŒãƒŽãƒ¼ãƒ‰ã«é”ã—ã¾ã›ã‚“!"
#: modules/visual_script/visual_script_func_nodes.cpp
-#, fuzzy
msgid "Invalid index property name '%s' in node %s."
msgstr "ノード%sã®ä¸æ­£ãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ãƒ—ロパティå'%s' ."
@@ -11332,28 +11151,24 @@ msgid ": Invalid arguments: "
msgstr ": 無効ãªå¼•æ•°: "
#: modules/visual_script/visual_script_nodes.cpp
-#, fuzzy
msgid "VariableGet not found in script: "
-msgstr "変数ã®get(VariableGet)ãŒã‚¹ã‚¯ãƒªãƒ—トã«ç„¡ã„: "
+msgstr "VariableGetãŒã‚¹ã‚¯ãƒªãƒ—ト内ã«ã‚りã¾ã›ã‚“: "
#: modules/visual_script/visual_script_nodes.cpp
-#, fuzzy
msgid "VariableSet not found in script: "
-msgstr "変数ã®set(VariableSet)ãŒã‚¹ã‚¯ãƒªãƒ—トã«ç„¡ã„: "
+msgstr "VariableSetãŒã‚¹ã‚¯ãƒªãƒ—ト内ã«ã‚りã¾ã›ã‚“: "
#: modules/visual_script/visual_script_nodes.cpp
-#, fuzzy
msgid "Custom node has no _step() method, can't process graph."
-msgstr "カスタムノードã«_step() メソッドãŒç„¡ã„ãŸã‚ã€ã‚°ãƒ©ãƒ•を処ç†ã§ãã¾ã›ã‚“."
+msgstr "カスタムノードã«_step() メソッドãŒç„¡ã„ãŸã‚ã€ã‚°ãƒ©ãƒ•を処ç†ã§ãã¾ã›ã‚“。"
#: modules/visual_script/visual_script_nodes.cpp
-#, fuzzy
msgid ""
"Invalid return value from _step(), must be integer (seq out), or string "
"(error)."
msgstr ""
-"_step()ã®ä¸æ­£ãªè¿”り値 integer (seq out)ã¾ãŸã¯string (error)ã§ãªã„ã¨ã„ã‘ã¾ã›"
-"ã‚“."
+"_step()ã®ç„¡åŠ¹ãªæˆ»ã‚Šå€¤ã€€integer (seq out)ã¾ãŸã¯string (error)ã§ãªã„ã¨ã„ã‘ã¾ã›"
+"ん。"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search VisualScript"
@@ -11514,18 +11329,16 @@ msgid "Could not write file:"
msgstr "ファイルを書ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ:"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not open template for export:"
-msgstr "エクスãƒãƒ¼ãƒˆã™ã‚‹ãƒ†ãƒ³ãƒ—レートを開ã‘ã¾ã›ã‚“:\n"
+msgstr "エクスãƒãƒ¼ãƒˆç”¨ã®ãƒ†ãƒ³ãƒ—レートを開ã‘ã¾ã›ã‚“ã§ã—ãŸ:"
#: platform/javascript/export/export.cpp
msgid "Invalid export template:"
msgstr "無効ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ テンプレート:"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not read custom HTML shell:"
-msgstr "ファイルを読ã‚ã¾ã›ã‚“ã§ã—ãŸ:\n"
+msgstr "カスタムHTMLシェルを読ã¿å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ:"
#: platform/javascript/export/export.cpp
msgid "Could not read boot splash image file:"
@@ -11536,9 +11349,8 @@ msgid "Using default boot splash image."
msgstr "デフォルトã®ãƒ–ートスプラッシュ画åƒã‚’使用ã—ã¾ã™ã€‚"
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package unique name."
-msgstr "無効ãªãƒ•ォント サイズã§ã™ã€‚"
+msgstr "パッケージã®ä¸€æ„ã®åå‰ãŒç„¡åйã§ã™ã€‚"
#: platform/uwp/export/export.cpp
msgid "Invalid product GUID."
@@ -11617,7 +11429,6 @@ msgstr ""
"ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。"
#: scene/2d/collision_polygon_2d.cpp
-#, fuzzy
msgid ""
"CollisionPolygon2D only serves to provide a collision shape to a "
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
@@ -11626,23 +11437,21 @@ msgstr ""
"CollisionPolygon2D ã¯ã€CollisionObject2D 派生ノードã«è¡çªã‚·ã‚§ã‚¤ãƒ—ã‚’æä¾›ã™ã‚‹ãŸ"
"ã‚ã«ã®ã¿æ©Ÿèƒ½ã—ã¾ã™ã€‚2Dã®å½¢çŠ¶ï¼ˆã‚·ã‚§ã‚¤ãƒ—ï¼‰ã‚’ä»˜ä¸Žã™ã‚‹ãŸã‚ã«ã¯ Area2Dã€"
"StaticBody2Dã€RigidBody2Dã€KinematicBody2D ãªã©ã®å­ã‚ªãƒ–ジェクトã¨ã—ã¦åˆ©ç”¨ã—ã¦"
-"ãã ã•ã„"
+"ãã ã•ã„。"
#: scene/2d/collision_polygon_2d.cpp
msgid "An empty CollisionPolygon2D has no effect on collision."
msgstr "空㮠CollisionPolygon2D ã¯ã€è¡çªåˆ¤å®šã‚’æŒã¡ã¾ã›ã‚“。"
#: scene/2d/collision_shape_2d.cpp
-#, fuzzy
msgid ""
"CollisionShape2D only serves to provide a collision shape to a "
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
-"CollisionShape2D ã¯ã€CollisionObject2D 派生ノードã«ã‚³ãƒªã‚¸ãƒ§ãƒ³ã‚·ã‚§ã‚¤ãƒ—ã‚’æä¾›ã™"
-"ã‚‹ãŸã‚ã«ã®ã¿æ©Ÿèƒ½ã—ã¾ã™ã€‚ï¼’Dã®å½¢çŠ¶ï¼ˆã‚·ã‚§ã‚¤ãƒ—ï¼‰ã‚’ä»˜ä¸Žã™ã‚‹ãŸã‚ã«ã¯ Area2Dã€"
-"StaticBody2Dã€RigidBody2Dã€KinematicBody2D ãªã©ã®å­ã‚ªãƒ–ジェクトã¨ã—ã¦åˆ©ç”¨ã—ã¦"
-"ãã ã•ã„."
+"CollisionShape2D ã¯ã€CollisionObject2D派生ノードã«è¡çªã‚·ã‚§ã‚¤ãƒ—ã‚’æä¾›ã™ã‚‹å ´åˆ"
+"ã«ã®ã¿æ©Ÿèƒ½ã—ã¾ã™ã€‚Area2Dã€staticBody2Dã€RigidBody2Dã€KinematicBody2Dãªã©ã®å­"
+"ã¨ã—ã¦ä½¿ç”¨ã—ã¦ãã ã•ã„。"
#: scene/2d/collision_shape_2d.cpp
msgid ""
@@ -11713,13 +11522,12 @@ msgstr ""
"to CPUParticles\" オプションを使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
-#, fuzzy
msgid ""
"A material to process the particles is not assigned, so no behavior is "
"imprinted."
msgstr ""
-"パーティクルを処ç†ã™ã‚‹ãŸã‚ã®ãƒžãƒ†ãƒªã‚¢ãƒ«ã¯æŒ‡å®šã•れã¦ãŠã‚‰ãšã€ãã®æŒ¯ã‚‹èˆžã„ã¯æœªæŒ‡"
-"示ã§ã™."
+"パーティクルを処ç†ã™ã‚‹ãƒžãƒ†ãƒªã‚¢ãƒ«ã¯å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ãªã„ãŸã‚ã€å‹•作ã¯ã‚¤ãƒ³ãƒ—リン"
+"トã•れã¾ã›ã‚“。"
#: scene/2d/particles_2d.cpp
msgid ""
@@ -11767,16 +11575,14 @@ msgstr ""
"ã¾ã™ã€‚"
#: scene/2d/tile_map.cpp
-#, fuzzy
msgid ""
"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes "
"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
"KinematicBody2D, etc. to give them a shape."
msgstr ""
-"CollisionShape2D ã¯ã€CollisionObject2D 派生ノードã«ã‚³ãƒªã‚¸ãƒ§ãƒ³ã‚·ã‚§ã‚¤ãƒ—ã‚’æä¾›ã™"
-"ã‚‹ãŸã‚ã«ã®ã¿æ©Ÿèƒ½ã—ã¾ã™ã€‚ï¼’Dã®å½¢çŠ¶ï¼ˆã‚·ã‚§ã‚¤ãƒ—ï¼‰ã‚’ä»˜ä¸Žã™ã‚‹ãŸã‚ã«ã¯ Area2Dã€"
-"StaticBody2Dã€RigidBody2Dã€KinematicBody2D ãªã©ã®å­ã‚ªãƒ–ジェクトã¨ã—ã¦åˆ©ç”¨ã—ã¦"
-"ãã ã•ã„."
+"親を使用ã™ã‚‹ã‚¿ã‚¤ãƒ«ãƒžãƒƒãƒ—ã«ã¯ã€ã‚·ã‚§ã‚¤ãƒ—を指定ã™ã‚‹ã«ã¯è¦ªCollisionObjectObject2D"
+"ãŒå¿…è¦ã§ã™ã€‚Area2Dã€StaticBody2Dã€RigidBody2D〠KinematicBody2Dãªã©ã®å­ã¨ã—ã¦"
+"使用ã—ã¦ãã ã•ã„。"
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -11791,9 +11597,8 @@ msgid "ARVRCamera must have an ARVROrigin node as its parent."
msgstr "ARVRCameraã¯ARVROriginãƒŽãƒ¼ãƒ‰ã‚’è¦ªã«æŒã¤å¿…è¦ãŒã‚りã¾ã™ã€‚"
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRController must have an ARVROrigin node as its parent."
-msgstr "ARVRControllerã¯ARVROriginãƒŽãƒ¼ãƒ‰ã‚’è¦ªã«æŒã¤å¿…è¦ãŒã‚りã¾ã™"
+msgstr "ARVRControllerã¯ARVROriginãƒŽãƒ¼ãƒ‰ã‚’è¦ªã«æŒã¤å¿…è¦ãŒã‚りã¾ã™ã€‚"
#: scene/3d/arvr_nodes.cpp
msgid ""
@@ -11804,9 +11609,8 @@ msgstr ""
"コントローラã«ãƒã‚¤ãƒ³ãƒ‰ã•れã¾ã›ã‚“。"
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr "ARVRAnchorã¯ARVROriginã‚’è¦ªã«æŒã¤å¿…è¦ãŒã‚りã¾ã™"
+msgstr "ARVRAnchorã¯ARVROriginã‚’è¦ªã«æŒã¤å¿…è¦ãŒã‚りã¾ã™ã€‚"
#: scene/3d/arvr_nodes.cpp
msgid ""
@@ -11817,9 +11621,8 @@ msgstr ""
"ã«ãƒã‚¤ãƒ³ãƒ‰ã•れã¾ã›ã‚“。"
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVROrigin requires an ARVRCamera child node."
-msgstr "ARVROriginã¯ARVRCameraå­ãƒŽãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™"
+msgstr "ARVROriginã¯ARVRCameraå­ãƒŽãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™ã€‚"
#: scene/3d/baked_lightmap.cpp
msgid "%d%%"
@@ -11830,9 +11633,8 @@ msgid "(Time Left: %d:%02d s)"
msgstr "(Time Left: %d分%02d秒)"
#: scene/3d/baked_lightmap.cpp
-#, fuzzy
msgid "Plotting Meshes: "
-msgstr "イメージをé…ç½®(Blit)"
+msgstr "メッシュã®ãƒ—ロット: "
#: scene/3d/baked_lightmap.cpp
#, fuzzy
@@ -11844,9 +11646,8 @@ msgid "Finishing Plot"
msgstr "プロット完了"
#: scene/3d/baked_lightmap.cpp
-#, fuzzy
msgid "Lighting Meshes: "
-msgstr "イメージをé…ç½®(Blit)"
+msgstr "ライティングメッシュ: "
#: scene/3d/collision_object.cpp
msgid ""
@@ -11860,30 +11661,28 @@ msgstr ""
"ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。"
#: scene/3d/collision_polygon.cpp
-#, fuzzy
msgid ""
"CollisionPolygon only serves to provide a collision shape to a "
"CollisionObject derived node. Please only use it as a child of Area, "
"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
msgstr ""
-"CollisionPolygon ã¯ã€CollisionObject 派生ノードã«ã‚³ãƒªã‚¸ãƒ§ãƒ³ã‚·ã‚§ã‚¤ãƒ—ã‚’æä¾›ã™ã‚‹"
-"ãŸã‚ã«ã®ã¿æ©Ÿèƒ½ã—ã¾ã™ã€‚Areaã€StaticBodyã€RigidBodyã€KinematicBody ã®å­ã¨ã—ã¦ã®"
-"ã¿åˆ©ç”¨ã—ã¦ãã ã•ã„。"
+"CollisionPolygonã¯ã€CollisionObject派生ノードã«è¡çªã‚·ã‚§ã‚¤ãƒ—ã‚’æä¾›ã™ã‚‹å ´åˆã«ã®"
+"ã¿æ©Ÿèƒ½ã—ã¾ã™ã€‚Areaã€StaticBodyã€RigidBodyã€KinematicBodyãªã©ã®å­ã¨ã—ã¦ä½¿ç”¨ã—"
+"ã¦ãã ã•ã„。"
#: scene/3d/collision_polygon.cpp
msgid "An empty CollisionPolygon has no effect on collision."
msgstr "空㮠CollisionPolygon ã¯ã€è¡çªåˆ¤å®šã‚’æŒã¡ã¾ã›ã‚“。"
#: scene/3d/collision_shape.cpp
-#, fuzzy
msgid ""
"CollisionShape only serves to provide a collision shape to a CollisionObject "
"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
"KinematicBody, etc. to give them a shape."
msgstr ""
-"CollisionShape ã¯è¡çªç‰©ç”±æ¥ã®ãƒŽãƒ¼ãƒ‰ã«è¡çªå½¢çŠ¶ã‚’æä¾›ã™ã‚‹ã®ã«å½¹ç«‹ã¡ã¾ã™ã€‚唯一ã®"
-"彼らã«å½¢çŠ¶ã‚’ä¸Žãˆã‚‹ã“ã¨ãªã©ã‚¨ãƒªã‚¢ã€é™ãƒœãƒ‡ã‚£ã€RigidBodyã€ã‚­ãƒãƒžãƒ†ã‚£ãƒƒã‚¯ãƒœãƒ‡ã‚£ã®"
-"å­ã¨ã—ã¦ãれを使用ã—ã¦ãã ã•ã„。"
+"CollisionShapeã¯ã€CollisionObject派生ノードã«è¡çªã‚·ã‚§ã‚¤ãƒ—ã‚’æä¾›ã™ã‚‹å ´åˆã«ã®ã¿"
+"機能ã—ã¾ã™ã€‚Areaã€StaticBodyã€RigidBodyã€KinematicBodyãªã©ã®å­ã¨ã—ã¦ä½¿ç”¨ã—ã¦"
+"ãã ã•ã„。"
#: scene/3d/collision_shape.cpp
#, fuzzy
@@ -11903,9 +11702,8 @@ msgstr ""
"ã„ã§ãã ã•ã„。"
#: scene/3d/cpu_particles.cpp
-#, fuzzy
msgid "Nothing is visible because no mesh has been assigned."
-msgstr "æç”»ãƒ‘スã®ãŸã‚ã®ãƒ¡ãƒƒã‚·ãƒ¥ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“ã®ã§è¦‹ãˆã¾ã›ã‚“"
+msgstr "メッシュãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ãªã„ãŸã‚ã€ä½•も表示ã•れã¾ã›ã‚“。"
#: scene/3d/cpu_particles.cpp
msgid ""
@@ -11956,10 +11754,9 @@ msgstr ""
"CPUParticles\"オプションを使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
#: scene/3d/particles.cpp
-#, fuzzy
msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
-msgstr "æç”»ãƒ‘スã®ãŸã‚ã®ãƒ¡ãƒƒã‚·ãƒ¥ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“ã®ã§è¦‹ãˆã¾ã›ã‚“"
+msgstr "æç”»ãƒ‘スã«ãƒ¡ãƒƒã‚·ãƒ¥ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ãªã„ãŸã‚ã€ä½•も表示ã•れã¾ã›ã‚“。"
#: scene/3d/particles.cpp
msgid ""
@@ -12039,12 +11836,11 @@ msgid ""
msgstr ""
#: scene/3d/world_environment.cpp
-#, fuzzy
msgid ""
"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
msgstr ""
-"WorldEnvironment ã¯ã€ã‚·ãƒ¼ãƒ³ (ã¾ãŸã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã•れãŸã‚·ãƒ¼ãƒ³ã®ã‚»ãƒƒãƒˆ) ã”ã¨ã«"
-"1ã¤ã ã‘許å¯ã•れã¾ã™ã€‚"
+"シーン(ã¾ãŸã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã•れãŸã‚·ãƒ¼ãƒ³ã®ã‚»ãƒƒãƒˆ)ã”ã¨ã«è¨±å¯ã•れる"
+"WorldEnvironmentã¯1ã¤ã ã‘ã§ã™ã€‚"
#: scene/3d/world_environment.cpp
#, fuzzy
@@ -12072,9 +11868,8 @@ msgid "Invalid animation: '%s'."
msgstr "無効ãªã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³: '%s'。"
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "'%s' ã‚’ '%s' ã«æŽ¥ç¶š"
+msgstr "ノード 'ï¼…s'ã®å…¥åŠ› 'ï¼…s'ã«æŽ¥ç¶šã•れã¦ã„ã‚‹ã‚‚ã®ãŒã‚りã¾ã›ã‚“。"
#: scene/animation/animation_tree.cpp
#, fuzzy
@@ -12091,9 +11886,8 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr "AnimationPlayerã«è¨­å®šã•れãŸãƒ‘スã‹ã‚‰AnimationPlayerノードãŒè¾¿ã‚Œã¾ã›ã‚“。"
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "The AnimationPlayer root node is not a valid node."
-msgstr "アニメーションツリーã«å•題ãŒã‚りã¾ã™."
+msgstr "AnimationPlayerãƒ«ãƒ¼ãƒˆãƒŽãƒ¼ãƒ‰ãŒæœ‰åйãªãƒŽãƒ¼ãƒ‰ã§ã¯ã‚りã¾ã›ã‚“。"
#: scene/animation/animation_tree_player.cpp
msgid "This node has been deprecated. Use AnimationTree instead."
@@ -12109,18 +11903,16 @@ msgid "HSV"
msgstr ""
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Raw"
-msgstr "ヨー"
+msgstr "ロー"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
msgstr "16進数ã¨ã‚³ãƒ¼ãƒ‰å€¤ã‚’切り替ãˆã¾ã™ã€‚"
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Add current color as a preset."
-msgstr "ç¾åœ¨ã®è‰²ã‚’プリセットã¨ã—ã¦è¿½åŠ "
+msgstr "ç¾åœ¨ã®è‰²ã‚’プリセットã¨ã—ã¦è¿½åŠ ã—ã¾ã™ã€‚"
#: scene/gui/container.cpp
#, fuzzy
@@ -12139,6 +11931,9 @@ msgid ""
"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
msgstr ""
+"コントロールã®ãƒžã‚¦ã‚¹ãƒ•ィルタãŒã€Œç„¡è¦–ã€ã«è¨­å®šã•れã¦ã„ã‚‹ãŸã‚ã€ãƒ’ントツールãƒãƒƒ"
+"プã¯è¡¨ç¤ºã•れã¾ã›ã‚“。ã“れを解決ã™ã‚‹ã«ã¯ã€ãƒžã‚¦ã‚¹ãƒ•ã‚£ãƒ«ã‚¿ã‚’ã€Œåœæ­¢ã€ã¾ãŸã¯ã€Œãƒ‘"
+"スã€ã«è¨­å®šã—ã¾ã™ã€‚"
#: scene/gui/dialogs.cpp
msgid "Alert!"
@@ -12149,20 +11944,18 @@ msgid "Please Confirm..."
msgstr "確èª..."
#: scene/gui/popup.cpp
-#, fuzzy
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
"functions. Making them visible for editing is fine, but they will hide upon "
"running."
msgstr ""
-"ãƒãƒƒãƒ—アップã¯ã€popup() ã¾ãŸã¯ popup*() 関数ã®ã„ãšã‚Œã‹ã‚’呼ã³å‡ºã™å ´åˆã‚’除ãã€"
-"既定ã§ã¯éžè¡¨ç¤ºã«ãªã‚Šã¾ã™ã€‚編集ã®ãŸã‚ã«ãれらをå¯è¦–化ã™ã‚‹ã“ã¨ã¯å¯èƒ½ã§ã™ãŒã€å½¼"
-"らã¯å®Ÿè¡Œæ™‚ã«éžè¡¨ç¤ºã«ãªã‚Šã¾ã™ã€‚"
+"デフォルトã§ã¯ã€popup()ã¾ãŸã¯popup*()関数を呼ã³å‡ºã•ãªã„é™ã‚Šã€ãƒãƒƒãƒ—アップã¯éž"
+"表示ã«ãªã‚Šã¾ã™ã€‚編集用ã«è¡¨ç¤ºã—ã¦ã‚‚å•題ã‚りã¾ã›ã‚“ãŒã€å®Ÿè¡Œæ™‚ã«ã¯éžè¡¨ç¤ºã«ãªã‚Šã¾"
+"ã™ã€‚"
#: scene/gui/range.cpp
-#, fuzzy
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
-msgstr "exp_edit ãŒtrueã®å ´åˆã€min_value ã¯0より大ãã„å¿…è¦ãŒã‚りã¾ã™ã€‚"
+msgstr "「Exp Editã€ãŒtrueã®å ´åˆã€ã€ŒMin Valueã€ã¯0より大ãã„å¿…è¦ãŒã‚りã¾ã™ã€‚"
#: scene/gui/scroll_container.cpp
#, fuzzy
@@ -12180,13 +11973,12 @@ msgid "(Other)"
msgstr "(ãã®ä»–)"
#: scene/main/scene_tree.cpp
-#, fuzzy
msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr ""
-"プロジェクトã®è¨­å®š (レンダリング-> ビューãƒãƒ¼ãƒˆ -> 既定ã®ç’°å¢ƒ) ã§æ—¢å®šã¨ã•れã¦"
-"ã„る環境(Environment)ã¯èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ."
+"ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆè¨­å®šã§æŒ‡å®šã•れã¦ã„る既定ã®ç’°å¢ƒ (レンダリング -> 環境 -> 既定ã®ç’°"
+"境) を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚"
#: scene/main/viewport.cpp
#, fuzzy
@@ -12201,22 +11993,6 @@ msgstr ""
"ãりã¾ã™ã€‚ãれ以外ã®å ´åˆã€ãƒ¬ãƒ³ãƒ€ãƒ¼ ターゲットã—ã€ãã®å†…部ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£è¡¨ç¤ºã®ã„"
"ãã¤ã‹ã®ãƒŽãƒ¼ãƒ‰ã«å‰²ã‚Šå½“ã¦ã¾ã™ã€‚"
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "FreeType ã®åˆæœŸåŒ–エラー。"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "䏿˜Žãªãƒ•ォント形å¼ã§ã™ã€‚"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "フォント読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ã€‚"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "無効ãªãƒ•ォント サイズã§ã™ã€‚"
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "入力"
@@ -12250,6 +12026,109 @@ msgstr "Varyingã¯é ‚点関数ã«ã®ã¿å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "Constants cannot be modified."
msgstr "定数ã¯å¤‰æ›´ã§ãã¾ã›ã‚“。"
+#~ msgid "No Matches"
+#~ msgstr "一致ãªã—"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "書ãå‡ºã—æ™‚ã«file_type_cache.cchを確èªã§ãã¾ã›ã‚“。ファイルタイプã®ã‚­ãƒ£ãƒƒ"
+#~ "シュをä¿å­˜ã§ãã¾ã›ã‚“!\n"
+#~ "ファイルタイプキャッシュをä¿å­˜ã›ãšã« file_type_cache.cch を書込ã¿ç”¨ã«é–‹ã"
+#~ "ã“ã¨ã¯ã§ãã¾ã›ã‚“ï¼"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "ファイルシステム上㧠'%s' を見ã¤ã‘られãªã„ãŸã‚移動ã§ãã¾ã›ã‚“ï¼"
+
+#~ msgid "Error loading image:"
+#~ msgstr "ç”»åƒèª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "ç”»åƒå†…ã«é€æ˜Žåº¦ãŒ128以上ã®ãƒ”クセルãŒã‚りã¾ã›ã‚“..."
+
+#, fuzzy
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "åˆæœŸå€¤ã‚’設定ã™ã‚‹å¡—りã¤ã¶ã—é¢ãŒã€è¦ªã«ã‚りã¾ã›ã‚“."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "エリアをマッピングã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "é¢ã«ã‚¨ãƒªã‚¢ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“!"
+
+#~ msgid "No faces!"
+#~ msgstr "é¢ãŒã‚りã¾ã›ã‚“!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "エラー: ファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#~ msgid "Error could not load file."
+#~ msgstr "エラー:ファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#~ msgid "Doppler Enable"
+#~ msgstr "ドップラーを有効ã«ã™ã‚‹"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "é¸æŠžãƒ¢ãƒ¼ãƒ‰ (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "移動モード (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "回転モード (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "スケールモード (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "ローカル座標系"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "スナップモード (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "é¸æŠžãƒ„ãƒ¼ãƒ«"
+
+#~ msgid "Tool Move"
+#~ msgstr "移動ツール"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "回転ツール"
+
+#~ msgid "Tool Scale"
+#~ msgstr "スケールツール"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "一覧ã«ãªã„プロジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹?(フォルダã®å†…容ã¯å¤‰æ›´ã•れã¾ã›"
+#~ "ã‚“)"
+
+#~ msgid "Project List"
+#~ msgstr "プロジェクト一覧"
+
+#~ msgid "Exit"
+#~ msgstr "終了"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "PVRTCツールを実行ã§ãã¾ã›ã‚“ã§ã—ãŸ:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr "PVRTCツールを使用ã—ã¦å¤‰æ›ã•れãŸã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’å…ƒã«æˆ»ã™ã“ã¨ãŒã§ãã¾ã›ã‚“:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "FreeType ã®åˆæœŸåŒ–エラー。"
+
+#~ msgid "Unknown font format."
+#~ msgstr "䏿˜Žãªãƒ•ォント形å¼ã§ã™ã€‚"
+
+#~ msgid "Error loading font."
+#~ msgstr "フォント読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ã€‚"
+
+#~ msgid "Invalid font size."
+#~ msgstr "無効ãªãƒ•ォント サイズã§ã™ã€‚"
+
#~ msgid "Previous Folder"
#~ msgstr "å‰ã®ãƒ•ォルダ"
@@ -12886,10 +12765,6 @@ msgstr "定数ã¯å¤‰æ›´ã§ãã¾ã›ã‚“。"
#~ msgstr "é¸æŠžã‚’æ¶ˆåŽ»"
#, fuzzy
-#~ msgid "Could not find tile:"
-#~ msgstr "タイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ:"
-
-#, fuzzy
#~ msgid "Item name or ID:"
#~ msgstr "アイテムã®åå‰ã‹ID:"
@@ -13169,10 +13044,6 @@ msgstr "定数ã¯å¤‰æ›´ã§ãã¾ã›ã‚“。"
#~ msgstr "インフォーメーション"
#, fuzzy
-#~ msgid "Re-Import..."
-#~ msgstr "å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆ..."
-
-#, fuzzy
#~ msgid "No bit masks to import!"
#~ msgstr "インãƒãƒ¼ãƒˆã™ã‚‹ãƒ“ットマスクãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“!"
@@ -13651,9 +13522,6 @@ msgstr "定数ã¯å¤‰æ›´ã§ãã¾ã›ã‚“。"
#~ msgid "Stereo"
#~ msgstr "ステレオ音声"
-#~ msgid "Window"
-#~ msgstr "ウィンドウ"
-
#, fuzzy
#~ msgid "Scaling to %s%%."
#~ msgstr "æ‹¡å¤§ç¸®å°æ¯”率%s%%."
diff --git a/editor/translations/ka.po b/editor/translations/ka.po
index f6dc4ca514..7129447aef 100644
--- a/editor/translations/ka.po
+++ b/editor/translations/ka.po
@@ -61,7 +61,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "თáƒáƒ•ისუფáƒáƒšáƒ˜"
@@ -679,17 +678,18 @@ msgid "Line Number:"
msgstr "ხáƒáƒ–ის ნáƒáƒ›áƒ”რი:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "შეცვლილირ%d დáƒáƒ›áƒ—ხვევები."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+#, fuzzy
+msgid "%d matches."
msgstr "áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს ტáƒáƒšáƒ˜"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "შეცვლილირ%d დáƒáƒ›áƒ—ხვევები."
-
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "სáƒáƒ¥áƒ›áƒ˜áƒ¡ დáƒáƒ›áƒ—ხვევáƒ"
@@ -925,8 +925,7 @@ msgstr "სáƒáƒ§áƒ•áƒáƒ áƒšáƒ”ბი:"
msgid "Recent:"
msgstr "ბáƒáƒšáƒ:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1029,7 +1028,7 @@ msgstr ""
"ფáƒáƒ˜áƒšáƒ”ბი რáƒáƒ›áƒšáƒ”ბსáƒáƒª შლით სáƒáƒ­áƒ˜áƒ áƒáƒ სხვრრესურსებისთვის რáƒáƒ› იმუშáƒáƒáƒœ.\n"
"წáƒáƒ•შáƒáƒšáƒáƒ— áƒáƒ›áƒ˜áƒ¡ მიუხედáƒáƒ•áƒáƒ“? (შეუძლებელირუკáƒáƒœ დáƒáƒ‘რუნებáƒ)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "ვერ წáƒáƒ•შლით:"
@@ -1067,7 +1066,7 @@ msgstr "სáƒáƒ›áƒ£áƒ“áƒáƒ›áƒáƒ“ წáƒáƒ•შáƒáƒšáƒáƒ— %d ნივთეá
msgid "Show Dependencies"
msgstr "დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებები"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "áƒáƒ‘áƒáƒšáƒ˜ რესურსების მáƒáƒ«áƒ˜áƒ”ბელი"
@@ -1156,14 +1155,16 @@ msgid "License"
msgstr "ლიცენზიáƒ"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "მესáƒáƒ›áƒ” პირის ლიზენციáƒ"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot ძრáƒáƒ•ი დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულირმესáƒáƒ›áƒ” პირის უფáƒáƒ¡áƒ დრღირკáƒáƒ“ის ბიბლიáƒáƒ—ეკებზე, "
@@ -1184,7 +1185,8 @@ msgid "Licenses"
msgstr "ლიცენზიები"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "შეცდáƒáƒ›áƒ პáƒáƒ™áƒ”ტის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡áƒáƒ¡, უნდრიყáƒáƒ¡ zip ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜."
#: editor/editor_asset_installer.cpp
@@ -1677,12 +1679,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2089,6 +2090,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2386,6 +2391,15 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "გáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2480,6 +2494,11 @@ msgstr ""
msgid "Close Tab"
msgstr "დáƒáƒ®áƒ£áƒ áƒ•áƒ"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "დáƒáƒ®áƒ£áƒ áƒ•áƒ"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2566,20 +2585,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2612,16 +2627,20 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
@@ -2629,11 +2648,16 @@ msgstr ""
msgid "Open Project Data Folder"
msgstr "პრáƒáƒ”ქტის დáƒáƒ›áƒ¤áƒ£áƒ«áƒœáƒ”ბლები"
-#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
msgstr ""
#: editor/editor_node.cpp
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "áƒáƒ‘áƒáƒšáƒ˜ რესურსების მáƒáƒ«áƒ˜áƒ”ბელი"
+
+#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr ""
@@ -2710,13 +2734,14 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
-msgstr ""
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
+msgstr "გáƒáƒ“áƒáƒ¡áƒ•ლები"
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2751,14 +2776,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2766,12 +2791,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3212,7 +3238,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3229,6 +3255,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3290,12 +3320,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3309,14 +3337,20 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "ვერ წáƒáƒ•შლით:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
-msgstr ""
+#, fuzzy
+msgid "Error requesting URL:"
+msgstr "ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
@@ -3402,20 +3436,12 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "სáƒáƒ§áƒ•áƒáƒ áƒšáƒ”ბი:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3448,11 +3474,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3514,6 +3540,11 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "რესურსი"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3580,6 +3611,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "შექმნáƒ"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3643,6 +3679,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3651,12 +3695,22 @@ msgstr ""
msgid "Invalid group name."
msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "áƒáƒ£áƒ“ირგáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის ცვლილებáƒ"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "წáƒáƒ¨áƒšáƒ"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3669,12 +3723,13 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
+#, fuzzy
+msgid "Group Editor"
+msgstr "დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებების შემსწáƒáƒ áƒ”ბელი"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3880,7 +3935,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4645,10 +4700,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4661,14 +4712,43 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "ვერ წáƒáƒ•შლით:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4746,8 +4826,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4768,7 +4851,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4780,6 +4863,11 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "ძებნáƒ:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4940,6 +5028,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ცვლილებáƒ"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4970,6 +5063,7 @@ msgid "Zoom Reset"
msgstr "ზუმის დáƒáƒžáƒáƒ¢áƒáƒ áƒáƒ•ებáƒ"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4990,14 +5084,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ის თáƒáƒœáƒáƒ¤áƒáƒ áƒ“áƒáƒ‘áƒ:"
@@ -5022,6 +5119,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5038,11 +5136,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5055,6 +5148,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5267,16 +5365,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5593,14 +5681,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5684,19 +5764,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't contain geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6028,7 +6112,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6134,11 +6217,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6167,7 +6246,7 @@ msgid "Error Importing"
msgstr "ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6250,6 +6329,11 @@ msgid "Open..."
msgstr "გáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებების შემსწáƒáƒ áƒ”ბელი"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6287,11 +6371,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6380,6 +6464,10 @@ msgstr ""
msgid "Search Results"
msgstr "ძებნáƒ:"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6452,6 +6540,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6487,24 +6576,6 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "მáƒáƒ›áƒ“ევნრნáƒáƒ‘იჯზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "წინáƒáƒ›áƒ“ებáƒáƒ áƒ” ნáƒáƒ‘იჯზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr ""
@@ -6525,6 +6596,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ის ცვლილებáƒ"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6541,30 +6617,33 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Find in Files..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
+msgid "Go to Next Bookmark"
msgstr "მáƒáƒ›áƒ“ევნრნáƒáƒ‘იჯზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
+msgid "Go to Previous Bookmark"
msgstr "წინáƒáƒ›áƒ“ებáƒáƒ áƒ” ნáƒáƒ‘იჯზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -6578,9 +6657,24 @@ msgid "Go to Line..."
msgstr "ხáƒáƒ–ზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "მáƒáƒ›áƒ“ევნრნáƒáƒ‘იჯზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "წინáƒáƒ›áƒ“ებáƒáƒ áƒ” ნáƒáƒ‘იჯზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -6816,8 +6910,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "áƒáƒœáƒ˜áƒ› სიგრძის შეცვლáƒ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6870,7 +6965,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6881,27 +6976,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6945,22 +7020,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -7015,7 +7074,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7319,10 +7378,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7409,11 +7464,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7533,8 +7588,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7834,6 +7889,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7916,6 +7975,11 @@ msgid "Duplicate Nodes"
msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბების áƒáƒ¡áƒšáƒ˜áƒ¡ შექმნáƒ"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "წáƒáƒ¨áƒšáƒ"
@@ -7925,10 +7989,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7942,6 +8002,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "კვáƒáƒœáƒ«áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ:"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "კვáƒáƒœáƒ«áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ:"
@@ -8306,7 +8371,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8315,7 +8380,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8479,6 +8544,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8504,7 +8573,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8513,7 +8582,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8522,14 +8591,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8574,6 +8643,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8781,6 +8857,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8927,6 +9007,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8996,8 +9084,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9017,8 +9105,9 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "პრáƒáƒ”ქტის დáƒáƒ›áƒ¤áƒ£áƒ«áƒœáƒ”ბლები"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9042,10 +9131,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9382,6 +9467,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9434,14 +9523,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -9732,6 +9813,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9853,19 +9938,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9961,6 +10046,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10151,6 +10240,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10564,10 +10657,29 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "áƒáƒ®áƒáƒšáƒ˜ %s შექმნáƒ"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "áƒáƒ®áƒáƒšáƒ˜ %s შექმნáƒ"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "შექმნáƒ"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10754,10 +10866,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11496,22 +11604,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "უცნáƒáƒ‘ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "შეცდáƒáƒ›áƒ ფáƒáƒœáƒ¢áƒ˜áƒ¡ ჩáƒáƒ¢áƒ•ირთვისáƒáƒ¡."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11547,6 +11639,15 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "Unknown font format."
+#~ msgstr "უცნáƒáƒ‘ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜."
+
+#~ msgid "Error loading font."
+#~ msgstr "შეცდáƒáƒ›áƒ ფáƒáƒœáƒ¢áƒ˜áƒ¡ ჩáƒáƒ¢áƒ•ირთვისáƒáƒ¡."
+
+#~ msgid "Invalid font size."
+#~ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ."
+
#~ msgid "Path to Node:"
#~ msgstr "გზრკვáƒáƒœáƒ«áƒáƒ›áƒ“ე:"
diff --git a/editor/translations/ko.po b/editor/translations/ko.po
index 374d996926..dec3ae7dd8 100644
--- a/editor/translations/ko.po
+++ b/editor/translations/ko.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-21 11:06+0000\n"
+"PO-Revision-Date: 2019-08-04 14:23+0000\n"
"Last-Translator: 송태섭 <xotjq237@gmail.com>\n"
"Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/"
"godot/ko/>\n"
@@ -69,7 +69,6 @@ msgid "On call to '%s':"
msgstr "'%s'ì„(를) 호출 시:"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "ìžìœ "
@@ -138,29 +137,24 @@ msgid "Anim Change Call"
msgstr "애니메ì´ì…˜ 호출 변경"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "애니메ì´ì…˜ 키프레임 시간 변경"
+msgstr "애니메ì´ì…˜ 여러 키프레임 시간 변경"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "애니메ì´ì…˜ 전환 변경"
+msgstr "애니메ì´ì…˜ 여러 전환 변경"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "애니메ì´ì…˜ 변형 변경"
+msgstr "애니메ì´ì…˜ 여러 변형 변경"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "애니메ì´ì…˜ 키프레임 ê°’ 변경"
+msgstr "애니메ì´ì…˜ 여러 키프레임 ê°’ 변경"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "애니메ì´ì…˜ 호출 변경"
+msgstr "애니메ì´ì…˜ 여러 호출 변경"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -660,16 +654,18 @@ msgid "Line Number:"
msgstr "ë¼ì¸ 번호:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "%d 개가 ì¼ì¹˜í•©ë‹ˆë‹¤."
+msgid "Replaced %d occurrence(s)."
+msgstr "%d ê°œì˜ ë°œìƒì„ êµì²´í–ˆìŠµë‹ˆë‹¤."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "ì¼ì¹˜ ê²°ê³¼ ì—†ìŒ"
+#, fuzzy
+msgid "%d match."
+msgstr "%d 개가 ì¼ì¹˜í•©ë‹ˆë‹¤."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d ê°œì˜ ë°œìƒì„ êµì²´í–ˆìŠµë‹ˆë‹¤."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "%d 개가 ì¼ì¹˜í•©ë‹ˆë‹¤."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -894,8 +890,7 @@ msgstr "ì¦ê²¨ì°¾ê¸°:"
msgid "Recent:"
msgstr "최근:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -995,7 +990,7 @@ msgstr ""
"삭제하려고 하는 파ì¼ë“¤ì€ 다른 ë¦¬ì†ŒìŠ¤ë“¤ì´ ì •ìƒë™ìž‘하기 위해 필요합니다.\n"
"ì •ë§ë¡œ 삭제하시겠습니까? (ë˜ëŒë¦¬ê¸° 불가)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "삭제할 수 없습니다:"
@@ -1031,7 +1026,7 @@ msgstr "%dê°œ í•­ëª©ì„ ì˜êµ¬ì ìœ¼ë¡œ 삭제하시겠습니까? (ë˜ëŒë¦¬ê¸°
msgid "Show Dependencies"
msgstr "ì¢…ì† ê´€ê³„ ë³´ì´ê¸°"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "미사용 리소스 íƒìƒ‰ê¸°"
@@ -1120,14 +1115,16 @@ msgid "License"
msgstr "ë¼ì´ì„ ìФ"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "서드파티 ë¼ì´ì„ ìФ"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engineì€ MIT ë¼ì´ì„ ìŠ¤ì™€ 호환ë˜ëŠ” ìˆ˜ë§Žì€ ì„œë“œíŒŒí‹° ìžìœ  오픈소스 ë¼ì´ë¸ŒëŸ¬"
@@ -1147,7 +1144,8 @@ msgid "Licenses"
msgstr "ë¼ì´ì„ ìФ"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "패키지 파ì¼ì„ 여는 ë° ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. zip 형ì‹ì´ 아닙니다."
#: editor/editor_asset_installer.cpp
@@ -1642,12 +1640,11 @@ msgid "New"
msgstr "새 것"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "가져오기"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "내보내기"
@@ -1784,32 +1781,28 @@ msgid "Move Favorite Down"
msgstr "ì¦ê²¨ì°¾ê¸° 아래로 ì´ë™"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "부모 í´ë”로 ì´ë™í•©ë‹ˆë‹¤."
+msgstr "ì´ì „ í´ë”로 ì´ë™í•©ë‹ˆë‹¤."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "부모 í´ë”로 ì´ë™í•©ë‹ˆë‹¤."
+msgstr "ë‹¤ìŒ í´ë”로 ì´ë™í•©ë‹ˆë‹¤."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "부모 í´ë”로 ì´ë™í•©ë‹ˆë‹¤."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "íŒŒì¼ ê²€ìƒ‰"
+msgstr "파ì¼ì„ 새로고침합니다."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "현재 í´ë”를 ì¦ê²¨ì°¾ê¸° (안) 합니다."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "숨김 íŒŒì¼ ê°€ì‹œì„± 토글하기."
+msgstr "ê°ì¶˜ 파ì¼ì˜ 표시 여부 토글하기."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
@@ -2050,6 +2043,11 @@ msgstr "지우기"
msgid "Clear Output"
msgstr "출력 지우기"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "윈ë„ìš°"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "프로ì íЏ 내보내기가 오류 코드 %d 로 실패했습니다."
@@ -2367,6 +2365,15 @@ msgid "Pick a Main Scene"
msgstr "ë©”ì¸ ì”¬ ì„ íƒ"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "씬 닫기"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "씬 닫기"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr "애드온 플러그ì¸ì„ 활성화할 수 없습니다: '%s' 구성 구문 ë¶„ì„ ì‹¤íŒ¨."
@@ -2476,6 +2483,11 @@ msgstr "ì´ ì”¬ì„ ì‹¤í–‰"
msgid "Close Tab"
msgstr "탭 닫기"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "탭 닫기"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "다른 탭 닫기"
@@ -2560,6 +2572,10 @@ msgstr "새 ìƒì† 씬..."
msgid "Open Scene..."
msgstr "씬 열기..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "최근 ì—´ì—ˆë˜ í•­ëª©"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "씬 저장"
@@ -2569,14 +2585,6 @@ msgid "Save All Scenes"
msgstr "모든 씬 저장"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "씬 닫기"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "최근 ì—´ì—ˆë˜ í•­ëª©"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "변환..."
@@ -2606,25 +2614,36 @@ msgstr "씬 ë˜ëŒë¦¬ê¸°"
msgid "Miscellaneous project or scene-wide tools."
msgstr "프로ì íЏ ë˜ëŠ” 씬 관련 여러가지 ë„구들."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "프로ì íЏ"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "프로ì íЏ 설정"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "ë„구"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr "내보내기..."
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "안드로ì´ë“œ 빌드 템플릿 설치하기"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "프로ì íЏ ë°ì´í„° í´ë” 열기"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "ë„구"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "안드로ì´ë“œ 빌드 템플릿 설치하기"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "미사용 리소스 íƒìƒ‰ê¸°"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2723,12 +2742,13 @@ msgstr ""
"ê¸°ê¸°ì— ì›ê²©ìœ¼ë¡œ 사용ë˜ëŠ” 경우, ë„¤íŠ¸ì›Œí¬ íŒŒì¼ ì‹œìŠ¤í…œê³¼ 함께하면 ë”ìš± 효과ì ìž…"
"니다."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "편집기"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "편집기 설정"
#: editor/editor_node.cpp
@@ -2764,14 +2784,16 @@ msgid "Open Editor Settings Folder"
msgstr "편집기 설정 í´ë” 열기"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "편집기 기능 관리"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "내보내기 템플릿 관리"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "ë„움ë§"
@@ -2779,12 +2801,13 @@ msgstr "ë„움ë§"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "검색"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "온ë¼ì¸ 문서"
@@ -3062,9 +3085,8 @@ msgid "Calls"
msgstr "호출"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "테마 편집"
+msgstr "ë¬¸ìž íŽ¸ì§‘:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3235,7 +3257,8 @@ msgid "Import From Node:"
msgstr "노드ì—서 가져오기:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "다시 다운로드"
#: editor/export_template_manager.cpp
@@ -3252,6 +3275,10 @@ msgid "Download"
msgstr "다운로드"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(누ë½)"
@@ -3315,12 +3342,10 @@ msgid "No response."
msgstr "ì‘답 ì—†ìŒ."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "요청 실패."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "리다ì´ë ‰íЏ 루프."
@@ -3334,15 +3359,22 @@ msgid "Download Complete."
msgstr "다운로드 완료."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "테마를 파ì¼ë¡œ 저장할 수 없습니다:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"템플릿 ì„¤ì¹˜ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤. 문제가 있는 템플릿 ì•„ì¹´ì´ë¸ŒëŠ” '%s' ì—서 확ì¸í•˜ì‹¤ "
"수 있습니다."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "url 요청 오류: "
#: editor/export_template_manager.cpp
@@ -3427,19 +3459,11 @@ msgstr "템플릿 다운로드"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "목ë¡ì—서 미러를 ì„ íƒí•˜ì„¸ìš”: (Shift+í´ë¦­: 브ë¼ìš°ì €ì—서 열기)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr "file_type_cache.cch를 열수 없어서, íŒŒì¼ íƒ€ìž… ìºì‰¬ë¥¼ 저장하지 않습니다!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "ì¦ê²¨ì°¾ê¸°"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "íŒŒì¼ ì‹œìŠ¤í…œì—서 '%s'ì„(를) ì°¾ì„ ìˆ˜ 없습니다!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"ìƒíƒœ: íŒŒì¼ ê°€ì ¸ì˜¤ê¸° 실패. 파ì¼ì„ 수정하고 \"다시 가져오기\"를 수행하세요."
@@ -3473,14 +3497,14 @@ msgid "Provided name contains invalid characters."
msgstr "ì œê³µëœ ì´ë¦„ì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ë¬¸ìžê°€ 있습니다."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "ì´ë¦„ì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ë¬¸ìžê°€ 있습니다."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "파ì¼ì´ë‚˜ í´ë”ê°€ 해당 ì´ë¦„ì„ ì‚¬ìš©ì¤‘ìž…ë‹ˆë‹¤."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "ì´ë¦„ì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ë¬¸ìžê°€ 있습니다."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "파ì¼ëª… 변경:"
@@ -3536,6 +3560,11 @@ msgstr "복제..."
msgid "Move To..."
msgstr "ì´ë™..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "새 씬"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "새 스í¬ë¦½íЏ..."
@@ -3601,6 +3630,11 @@ msgstr "ê°™ì€ ì´ë¦„ì˜ íŒŒì¼ì´ë‚˜ í´ë”ê°€ ì´ë¯¸ 존재합니다."
msgid "Overwrite"
msgstr "ë®ì–´ 쓰기"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "씬으로부터 만들기"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "스í¬ë¦½íЏ 만들기"
@@ -3663,6 +3697,14 @@ msgid "Search complete"
msgstr "검색 완료"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "ê·¸ë£¹ì— ì¶”ê°€"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "그룹ì—서 ì‚­ì œ"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "그룹 ì´ë¦„ì´ ì´ë¯¸ 존재합니다."
@@ -3670,12 +3712,23 @@ msgstr "그룹 ì´ë¦„ì´ ì´ë¯¸ 존재합니다."
msgid "Invalid group name."
msgstr "그룹 ì´ë¦„ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "그룹 관리"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "ì´ë¯¸ì§€ 그룹 ì‚­ì œ"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "그룹"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "ê·¸ë£¹ì— ìžˆì§€ ì•Šì€ ë…¸ë“œ"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3688,12 +3741,12 @@ msgid "Nodes in Group"
msgstr "ê·¸ë£¹ì— ìžˆëŠ” 노드"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "ê·¸ë£¹ì— ì¶”ê°€"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "그룹ì—서 ì‚­ì œ"
+msgid "Group Editor"
+msgstr "그룹 편집기"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3902,7 +3955,8 @@ msgid "MultiNode Set"
msgstr "다중 노드 설정"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "시그ë„ê³¼ ê·¸ë£¹ì„ íŽ¸ì§‘í•  노드를 ì„ íƒí•˜ì„¸ìš”."
#: editor/plugin_config_dialog.cpp
@@ -4658,10 +4712,6 @@ msgid "View Files"
msgstr "íŒŒì¼ ë³´ê¸°"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "í˜¸ìŠ¤íŠ¸ëª…ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "ì—°ê²° 오류, 다시 시ë„í•´ 주세요."
@@ -4674,14 +4724,47 @@ msgid "No response from host:"
msgstr "호스트로부터 ì‘답 ì—†ìŒ:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "í˜¸ìŠ¤íŠ¸ëª…ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "요청 실패, 리턴 코드:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "요청 실패."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "테마를 파ì¼ë¡œ 저장할 수 없습니다:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "너무 ë§Žì€ ë¦¬ë‹¤ì´ë ‰íŠ¸ë¡œ, 요청 실패"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "리다ì´ë ‰íЏ 루프."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "요청 실패, 리턴 코드:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "시간"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "ìž˜ëª»ëœ ë‹¤ìš´ë¡œë“œ 해시, 파ì¼ì´ ë³€ê²½ëœ ê²ƒìœ¼ë¡œ 보입니다."
@@ -4758,8 +4841,13 @@ msgid "All"
msgstr "모ë‘"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "다시 가져오기..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "플러그ì¸"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4780,7 +4868,8 @@ msgid "Site:"
msgstr "사ì´íЏ:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "ì§€ì›..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4792,6 +4881,11 @@ msgid "Testing"
msgstr "테스팅"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "불러오기..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "ì• ì…‹ ZIP 파ì¼"
@@ -4951,6 +5045,11 @@ msgid "Paste Pose"
msgstr "í¬ì¦ˆ 붙여넣기"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "본 지우기"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "노드ì—서 커스텀 본 만들기"
@@ -4979,6 +5078,7 @@ msgid "Zoom Reset"
msgstr "배율 초기화"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "ì„ íƒ ëª¨ë“œ"
@@ -4999,14 +5099,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "알트+ìš°í´ë¦­: 겹친 ëª©ë¡ ì„ íƒ"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "ì´ë™ 모드"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "회전 모드"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "규모 모드"
@@ -5032,6 +5135,7 @@ msgid "Toggle snapping."
msgstr "스냅 토글."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "스냅 사용"
@@ -5048,11 +5152,6 @@ msgid "Use Rotation Snap"
msgstr "회전 스냅 사용"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "스냅 설정..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "ìƒëŒ€ì ì¸ 스냅"
@@ -5065,6 +5164,11 @@ msgid "Smart Snapping"
msgstr "스마트 스냅"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "스냅 설정..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "ë¶€ëª¨ì— ìŠ¤ëƒ…"
@@ -5277,16 +5381,6 @@ msgstr "핸들 설정"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "ì´ë¯¸ì§€ 불러오기 오류:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "ì´ë¯¸ì§€ì— 투명ë„ê°€ 128보다 í° í”½ì…€ì´ ì—†ìŠµë‹ˆë‹¤..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "ì—미션 ë§ˆìŠ¤í¬ ë¶ˆëŸ¬ì˜¤ê¸°"
@@ -5597,14 +5691,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "서피스 소스가 올바르지 않습니다 (페ì´ìФ ì—†ìŒ)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "부모노드가 솔리드 페ì´ìŠ¤ë¥¼ 가지고 있지 않아 ìƒì„±í•  수 없습니다."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "ì˜ì—­ì„ 매핑 í•  수 없습니다."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "소스 메시 ì„ íƒ:"
@@ -5688,20 +5774,27 @@ msgid "Generation Time (sec):"
msgstr "ìƒì„± 시간 (ì´ˆ):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "페ì´ìŠ¤ê°€ ì˜ì—­ì„ 가지고 있지 않습니다!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "페ì´ìŠ¤ê°€ 없습니다!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "노드가 지오미트리를 í¬í•¨í•˜ê³  있지 않습니다 (페ì´ìФ)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "노드가 지오미트리를 í¬í•¨í•˜ê³  있지 않습니다."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "노드가 지오미트리를 í¬í•¨í•˜ê³  있지 않습니다 (페ì´ìФ)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "노드가 지오미트리를 í¬í•¨í•˜ê³  있지 않습니다."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6033,7 +6126,6 @@ msgid "Grid Settings"
msgstr "ê²©ìž ì„¤ì •"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "스냅"
@@ -6139,12 +6231,9 @@ msgid "Error writing TextFile:"
msgstr "í…스트 íŒŒì¼ ì“°ê¸° 오류:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "오류: 파ì¼ì„ 불러올 수 ì—†ìŒ."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "오류로 파ì¼ì„ 불러올 수 ì—†ìŒ."
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "타ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6167,7 +6256,8 @@ msgid "Error Importing"
msgstr "가져오는 중 오류 ë°œìƒ"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "새 í…스트 파ì¼..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6248,6 +6338,11 @@ msgid "Open..."
msgstr "열기..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "스í¬ë¦½íЏ 열기"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "ëª¨ë‘ ì €ìž¥"
@@ -6285,13 +6380,13 @@ msgid "Save Theme"
msgstr "테마 저장"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "문서 닫기"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "ëª¨ë‘ ë‹«ê¸°"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "문서 닫기"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "실행"
@@ -6379,6 +6474,11 @@ msgstr "디버거"
msgid "Search Results"
msgstr "검색 결과"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "최근 씬 지우기"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "ë©”ì„œë“œì— ì—°ê²°:"
@@ -6447,6 +6547,7 @@ msgid "Syntax Highlighter"
msgstr "구문 강조"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr "ì´ë™"
@@ -6481,22 +6582,6 @@ msgid "Toggle Comment"
msgstr "ì£¼ì„ í† ê¸€"
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr "ë¶ë§ˆí¬ 토글"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "ë‹¤ìŒ ë¶ë§ˆí¬ë¡œ ì´ë™"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr "ì´ì „ ë¶ë§ˆí¬ë¡œ ì´ë™"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "모든 ë¶ë§ˆí¬ ì‚­ì œ"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "ë¼ì¸ 펼치기/접기"
@@ -6517,6 +6602,11 @@ msgid "Complete Symbol"
msgstr "ìžë™ 완성"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "ì„ íƒ í¬ê¸° ì¡°ì ˆ"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "후행 공백 ë¬¸ìž ì‚­ì œ"
@@ -6533,29 +6623,32 @@ msgid "Auto Indent"
msgstr "ìžë™ 들여쓰기"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "ì¤‘ë‹¨ì  í† ê¸€"
+msgid "Find Previous"
+msgstr "ì´ì „ 찾기"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "ì¤‘ë‹¨ì  ëª¨ë‘ ì‚­ì œ"
+msgid "Find in Files..."
+msgstr "파ì¼ì—서 찾기..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "ë‹¤ìŒ ì¤‘ë‹¨ì ìœ¼ë¡œ ì´ë™"
+msgid "Contextual Help"
+msgstr "ë„ì›€ë§ ë³´ê¸°"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "ì´ì „ 중단ì ìœ¼ë¡œ ì´ë™"
+msgid "Toggle Bookmark"
+msgstr "ë¶ë§ˆí¬ 토글"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "ì´ì „ 찾기"
+msgid "Go to Next Bookmark"
+msgstr "ë‹¤ìŒ ë¶ë§ˆí¬ë¡œ ì´ë™"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "파ì¼ì—서 찾기..."
+msgid "Go to Previous Bookmark"
+msgstr "ì´ì „ ë¶ë§ˆí¬ë¡œ ì´ë™"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "모든 ë¶ë§ˆí¬ ì‚­ì œ"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6566,8 +6659,21 @@ msgid "Go to Line..."
msgstr "ë¼ì¸ìœ¼ë¡œ ì´ë™..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "ë„ì›€ë§ ë³´ê¸°"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "ì¤‘ë‹¨ì  í† ê¸€"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "ì¤‘ë‹¨ì  ëª¨ë‘ ì‚­ì œ"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "ë‹¤ìŒ ì¤‘ë‹¨ì ìœ¼ë¡œ ì´ë™"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "ì´ì „ 중단ì ìœ¼ë¡œ ì´ë™"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -6747,14 +6853,12 @@ msgid "Rear"
msgstr "ë’·ë©´"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Transform with View"
-msgstr "뷰와 정렬"
+msgstr "ë³€í˜•ì„ ë·°ì— ì •ë ¬"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Rotation with View"
-msgstr "ì„ íƒ í•­ëª©ì„ ë·°ì— ì •ë ¬"
+msgstr "íšŒì „ì„ ë·°ì— ì •ë ¬"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -6809,8 +6913,9 @@ msgid "Audio Listener"
msgstr "오디오 리스너"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "ë„플러 활성화"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "필터 활성화"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6865,8 +6970,8 @@ msgid "Snap Nodes To Floor"
msgstr "노드를 ë°”ë‹¥ì— ìŠ¤ëƒ…"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "ì„ íƒ ëª¨ë“œ (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6879,30 +6984,11 @@ msgstr ""
"알트+ìš°í´ë¦­: 겹친 ëª©ë¡ ì„ íƒ"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "ì´ë™ 모드 (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "회전 모드 (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "í¬ê¸° ì¡°ì ˆ 모드 (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "지역 좌표"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "로컬 스페ì´ìФ 모드 (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "스냅 모드 (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "하단 뷰"
@@ -6943,22 +7029,6 @@ msgid "Focus Selection"
msgstr "ì„ íƒ í¬ì»¤ìФ"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "ì„ íƒ íˆ´"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "ì´ë™ 툴"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "회전 툴"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "í¬ê¸° ì¡°ì ˆ 툴"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "ìžìœ  ì‹œì  í† ê¸€"
@@ -7013,7 +7083,8 @@ msgstr "ê²©ìž ë³´ê¸°"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "설정"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7306,10 +7377,6 @@ msgid "TextureRegion"
msgstr "í…스ì³ì§€ì—­"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "테마를 파ì¼ë¡œ 저장할 수 없습니다:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "모든 항목 추가"
@@ -7394,11 +7461,13 @@ msgid "Submenu"
msgstr "하위 메뉴"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+#, fuzzy
+msgid "Subitem 1"
msgstr "항목 1"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+#, fuzzy
+msgid "Subitem 2"
msgstr "항목 2"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7515,9 +7584,10 @@ msgid "Paint Tile"
msgstr "íƒ€ì¼ ì¹ í•˜ê¸°"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Shift+ìš°í´ë¦­: ì„  그리기\n"
"Shift+Ctrl+ìš°í´ë¦­:사ê°í˜• 페ì¸íЏ"
@@ -7815,6 +7885,10 @@ msgid "TileSet"
msgstr "타ì¼ì…‹"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(GLES3만 가능)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr "입력 추가 +"
@@ -7891,6 +7965,11 @@ msgid "Duplicate Nodes"
msgstr "노드 복제"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "노드 붙여넣기"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "노드 삭제"
@@ -7899,10 +7978,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "비주얼 ì…°ì´ë” ìž…ë ¥ 타입 변경ë¨"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr "(GLES3만 가능)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "버í…스"
@@ -7915,6 +7990,11 @@ msgid "Light"
msgstr "조명"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Show resulted shader code."
+msgstr "ì…°ì´ë” 노드 만들기"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr "ì…°ì´ë” 노드 만들기"
@@ -8273,10 +8353,11 @@ msgid "Returns the square root of the parameter."
msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì œê³±ê·¼ì„ ë°˜í™˜í•©ë‹ˆë‹¤."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8286,10 +8367,11 @@ msgstr ""
"ë°˜í™˜ê°’ì€ ì—르미트 다항ì‹ì„ 통해 0.0ê³¼ 1.0사ì´ë¡œ ë³´ê°„ë©ë‹ˆë‹¤."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step 함수( 스칼ë¼(edge), 스칼ë¼(x) ).\n"
"\n"
@@ -8461,6 +8543,11 @@ msgid "Linear interpolation between two vectors."
msgstr "ë‘ ë²¡í„° ê°„ì˜ ì„ í˜• ë³´ê°„."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "ë‘ ë²¡í„° ê°„ì˜ ì„ í˜• ë³´ê°„."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr "ë²¡í„°ì˜ ë…¸ë©€ ê°’ì„ ê³„ì‚°í•©ë‹ˆë‹¤."
@@ -8484,10 +8571,11 @@ msgid "Returns the vector that points in the direction of refraction."
msgstr "반사 ë°©í–¥ì„ ê°€ë¦¬í‚¤ëŠ” 벡터를 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8498,10 +8586,11 @@ msgstr ""
"다."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8512,20 +8601,22 @@ msgstr ""
"다."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step 함수( 벡터(edge), 벡터(x) ).\n"
"\n"
"'x'ê°€ 'edge'보다 작으면 0.0ì„ ë°˜í™˜í•˜ê³  그렇지 않으면 1.0ì„ ë°˜í™˜í•©ë‹ˆë‹¤."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Step 함수( 스칼ë¼(edge), 벡터(x) ).\n"
"\n"
@@ -8578,6 +8669,13 @@ msgstr ""
"다 (í´ì˜¤í”„와 ê´€ë ¨ëœ ìž…ë ¥ì„ ì „ë‹¬í•¨)."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr "(프래그먼트/조명 모드만 가능) ìŠ¤ì¹¼ë¼ ë¯¸ë¶„ 함수."
@@ -8791,6 +8889,10 @@ msgid "Export templates for this platform are missing:"
msgstr "ì´ í”Œëž«í¼ì— 대한 내보내기 í…œí”Œë¦¿ì´ ì—†ìŒ:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "내보내기 템플릿 관리"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "디버그와 함께 내보내기"
@@ -8949,6 +9051,15 @@ msgid "Unnamed Project"
msgstr "ì´ë¦„없는 프로ì íЏ"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "기존 프로ì íЏ 가져오기"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "'%s'ì—서 프로ì íŠ¸ë¥¼ ì—´ 수 ì—†ìŒ."
@@ -9041,12 +9152,13 @@ msgstr ""
"프로ì íЏ í´ë”ì˜ ë‚´ìš©ì€ ìˆ˜ì •ë˜ì§€ 않습니다."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
-"목ë¡ì—서 모든 ì´ë¦„없는 프로ì íŠ¸ë¥¼ 삭제하시겠습니까? (í´ë”ì˜ ë‚´ìš©ë¬¼ì€ ìˆ˜ì •ë˜"
-"지 않습니다)"
+"%dê°œì˜ í”„ë¡œì íŠ¸ë¥¼ 삭제하시겠습니까?\n"
+"프로ì íЏ í´ë”ì˜ ë‚´ìš©ì€ ìˆ˜ì •ë˜ì§€ 않습니다."
#: editor/project_manager.cpp
msgid ""
@@ -9069,8 +9181,9 @@ msgid "Project Manager"
msgstr "프로ì íЏ 매니저"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "프로ì íЏ 목ë¡"
+#, fuzzy
+msgid "Projects"
+msgstr "프로ì íЏ"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9093,10 +9206,6 @@ msgid "Templates"
msgstr "템플릿"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "종료"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "지금 재시작"
@@ -9436,6 +9545,10 @@ msgstr "로케ì¼:"
msgid "AutoLoad"
msgstr "오토로드"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "플러그ì¸"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "등ì†"
@@ -9488,14 +9601,6 @@ msgstr "ê°€ìƒ ë©”ì„œë“œ ì„ íƒ"
msgid "Select Method"
msgstr "메서드 ì„ íƒ"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "PVRTC ë„구를 실행할 수 없습니다:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr "PVRTC ë„구를 사용하여 ë³€í™˜ëœ ì´ë¯¸ì§€ë¥¼ 다시 불러올 수 없습니다:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "ì¼ê´„ ì´ë¦„ 변경"
@@ -9790,6 +9895,11 @@ msgid "Remove Node(s)"
msgstr "노드 삭제"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "출력 í¬íЏ ì´ë¦„ 변경"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9833,9 +9943,8 @@ msgid "Extend Script"
msgstr "스í¬ë¦½íЏ 펼치기"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
-msgstr "부모 노드 재지정"
+msgstr "새 ë…¸ë“œì— ë¶€ëª¨ 노드 재지정"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -9909,24 +10018,27 @@ msgid "Node configuration warning:"
msgstr "노드 구성 경고:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"노드가 ì—°ê²°ê³¼ ê·¸ë£¹ì„ ê°–ê³  있습니다.\n"
"ì‹œê·¸ë„ ë…ì„ í´ë¦­í•˜ì—¬ 보세요."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"노드가 ì—°ê²°ì„ ê°–ê³  있습니다\n"
"ì‹œê·¸ë„ ë…ì„ í´ë¦­í•˜ì—¬ 보세요."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"노드가 그룹 ì•ˆì— ìžˆìŠµë‹ˆë‹¤.\n"
@@ -10025,6 +10137,11 @@ msgid "Error loading script from %s"
msgstr "'%s' 스í¬ë¦½íЏ 로딩 중 오류"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "ë®ì–´ 쓰기"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "해당 ì—†ìŒ"
@@ -10213,6 +10330,10 @@ msgid "Change Shortcut"
msgstr "단축키 변경"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "편집기 설정"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "단축키"
@@ -10632,10 +10753,30 @@ msgid "Set Variable Type"
msgstr "변수 타입 설정"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "기존 내장 타입 ì´ë¦„ê³¼ ì¶©ëŒí•˜ì§€ 않아야 합니다."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "새 사ê°í˜• 만들기."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "변수:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "새 사ê°í˜• 만들기."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "새로운 í´ë¦¬ê³¤ 만들기."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "ì´ë¦„ì´ ì˜¬ë°”ë¥¸ ì‹ë³„ìžê°€ 아닙니다:"
@@ -10824,10 +10965,6 @@ msgid "Cut Nodes"
msgstr "노드 잘ë¼ë‚´ê¸°"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "노드 붙여넣기"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "멤버 편집"
@@ -11679,22 +11816,6 @@ msgstr ""
"그렇지 ì•Šì„ ê²½ìš°, í™”ë©´ì— í‘œì‹œí•˜ê¸° 위해서는 RenderTarget으로 설정하고 ë‚´ë¶€ì "
"ì¸ í…스ì³ë¥¼ 다른 ë…¸ë“œì— í• ë‹¹í•´ì•¼ 합니다."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "FreeType 초기화 오류."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "알 수 없는 í°íЏ 형ì‹."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "í°íЏ 로딩 오류."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "올바르지 ì•Šì€ í°íЏ í¬ê¸°."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "ìž…ë ¥"
@@ -11727,6 +11848,105 @@ msgstr "Varyings는 ì˜¤ì§ ë²„í…스 함수ì—서만 지정할 수 있습니다.
msgid "Constants cannot be modified."
msgstr "ìƒìˆ˜ëŠ” 수정할 수 없습니다."
+#~ msgid "No Matches"
+#~ msgstr "ì¼ì¹˜ ê²°ê³¼ ì—†ìŒ"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "file_type_cache.cch를 열수 없어서, íŒŒì¼ íƒ€ìž… ìºì‰¬ë¥¼ 저장하지 않습니다!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "íŒŒì¼ ì‹œìŠ¤í…œì—서 '%s'ì„(를) ì°¾ì„ ìˆ˜ 없습니다!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "ì´ë¯¸ì§€ 불러오기 오류:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "ì´ë¯¸ì§€ì— 투명ë„ê°€ 128보다 í° í”½ì…€ì´ ì—†ìŠµë‹ˆë‹¤..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "부모노드가 솔리드 페ì´ìŠ¤ë¥¼ 가지고 있지 않아 ìƒì„±í•  수 없습니다."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "ì˜ì—­ì„ 매핑 í•  수 없습니다."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "페ì´ìŠ¤ê°€ ì˜ì—­ì„ 가지고 있지 않습니다!"
+
+#~ msgid "No faces!"
+#~ msgstr "페ì´ìŠ¤ê°€ 없습니다!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "오류: 파ì¼ì„ 불러올 수 ì—†ìŒ."
+
+#~ msgid "Error could not load file."
+#~ msgstr "오류로 파ì¼ì„ 불러올 수 ì—†ìŒ."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "ë„플러 활성화"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "ì„ íƒ ëª¨ë“œ (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "ì´ë™ 모드 (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "회전 모드 (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "í¬ê¸° ì¡°ì ˆ 모드 (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "지역 좌표"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "스냅 모드 (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "ì„ íƒ íˆ´"
+
+#~ msgid "Tool Move"
+#~ msgstr "ì´ë™ 툴"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "회전 툴"
+
+#~ msgid "Tool Scale"
+#~ msgstr "í¬ê¸° ì¡°ì ˆ 툴"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "목ë¡ì—서 모든 ì´ë¦„없는 프로ì íŠ¸ë¥¼ 삭제하시겠습니까? (í´ë”ì˜ ë‚´ìš©ë¬¼ì€ ìˆ˜ì •"
+#~ "ë˜ì§€ 않습니다)"
+
+#~ msgid "Project List"
+#~ msgstr "프로ì íЏ 목ë¡"
+
+#~ msgid "Exit"
+#~ msgstr "종료"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "PVRTC ë„구를 실행할 수 없습니다:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr "PVRTC ë„구를 사용하여 ë³€í™˜ëœ ì´ë¯¸ì§€ë¥¼ 다시 불러올 수 없습니다:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "FreeType 초기화 오류."
+
+#~ msgid "Unknown font format."
+#~ msgstr "알 수 없는 í°íЏ 형ì‹."
+
+#~ msgid "Error loading font."
+#~ msgstr "í°íЏ 로딩 오류."
+
+#~ msgid "Invalid font size."
+#~ msgstr "올바르지 ì•Šì€ í°íЏ í¬ê¸°."
+
#~ msgid "Previous Folder"
#~ msgstr "ì´ì „ í´ë”"
@@ -12493,9 +12713,6 @@ msgstr "ìƒìˆ˜ëŠ” 수정할 수 없습니다."
#~ msgid "Erase selection"
#~ msgstr "ì„ íƒ ì§€ìš°ê¸°"
-#~ msgid "Could not find tile:"
-#~ msgstr "타ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ:"
-
#~ msgid "Item name or ID:"
#~ msgstr "ì•„ì´í…œ ì´ë¦„ ë˜ëŠ” ì•„ì´ë””:"
@@ -12742,9 +12959,6 @@ msgstr "ìƒìˆ˜ëŠ” 수정할 수 없습니다."
#~ msgid "Info"
#~ msgstr "ì •ë³´"
-#~ msgid "Re-Import..."
-#~ msgstr "다시 가져오기..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "가져올 비트 마스í¬ê°€ 없습니다!"
@@ -13135,9 +13349,6 @@ msgstr "ìƒìˆ˜ëŠ” 수정할 수 없습니다."
#~ msgid "Stereo"
#~ msgstr "스테레오"
-#~ msgid "Window"
-#~ msgstr "윈ë„ìš°"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "%s%%로 í¬ê¸° 변경."
@@ -13340,9 +13551,6 @@ msgstr "ìƒìˆ˜ëŠ” 수정할 수 없습니다."
#~ msgid "Add Image Group"
#~ msgstr "ì´ë¯¸ì§€ 그룹 추가"
-#~ msgid "Delete Image Group"
-#~ msgstr "ì´ë¯¸ì§€ 그룹 ì‚­ì œ"
-
#~ msgid "Project Export Settings"
#~ msgstr "프로ì íЏ 내보내기 설정"
@@ -13427,9 +13635,6 @@ msgstr "ìƒìˆ˜ëŠ” 수정할 수 없습니다."
#~ msgid "Export Project PCK"
#~ msgstr "프로ì íЏ PCK 내보내기"
-#~ msgid "Export..."
-#~ msgstr "내보내기..."
-
#~ msgid "Project Export"
#~ msgstr "프로ì íЏ 내보내기"
@@ -13527,6 +13732,3 @@ msgstr "ìƒìˆ˜ëŠ” 수정할 수 없습니다."
#~ msgid "Deploy File Server Clients"
#~ msgstr "íŒŒì¼ ì„œë²„ í´ë¼ì´ì–¸íЏ ë°°í¬"
-
-#~ msgid "Group Editor"
-#~ msgstr "그룹 편집기"
diff --git a/editor/translations/lt.po b/editor/translations/lt.po
index 088260b86f..79d42d1231 100644
--- a/editor/translations/lt.po
+++ b/editor/translations/lt.po
@@ -60,7 +60,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Nemokama"
@@ -664,15 +663,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -909,8 +908,7 @@ msgstr "MÄ—gstamiausi:"
msgid "Recent:"
msgstr "Naujausi:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1004,7 +1002,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -1040,7 +1038,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1129,14 +1127,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1153,7 +1151,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1647,12 +1645,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2059,6 +2056,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2356,6 +2357,15 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Atidaryti Skriptų Editorių"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2450,6 +2460,11 @@ msgstr ""
msgid "Close Tab"
msgstr "Uždaryti"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Uždaryti"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2536,20 +2551,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2582,24 +2593,33 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Redaguoti"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2679,13 +2699,14 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
-msgstr ""
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
+msgstr "Importuoti Animacijas..."
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2720,14 +2741,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2735,12 +2756,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3186,7 +3208,8 @@ msgid "Import From Node:"
msgstr "Importuoti iš Nodo:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Atsiųsti iš naujo"
#: editor/export_template_manager.cpp
@@ -3203,6 +3226,10 @@ msgid "Download"
msgstr "Atsiųsti"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Nerasta)"
@@ -3266,12 +3293,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3285,16 +3310,21 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
-msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+msgid "Cannot remove temporary file:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid ""
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Error requesting URL:"
+msgstr "Duplikuoti"
+
+#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
msgstr ""
@@ -3377,20 +3407,12 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "MÄ—gstamiausi:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3425,11 +3447,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3494,6 +3516,11 @@ msgstr "Duplikuoti"
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Atidaryti Skriptų Editorių"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3559,6 +3586,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Sukurti"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3621,6 +3653,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3629,12 +3669,21 @@ msgstr ""
msgid "Invalid group name."
msgstr "Netinkamas šrifto dydis."
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Ištrinti Efektą"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3647,12 +3696,13 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
+#, fuzzy
+msgid "Group Editor"
+msgstr "Atidaryti Skriptų Editorių"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3858,7 +3908,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4631,10 +4681,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4647,14 +4693,43 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "TrukmÄ—:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4734,8 +4809,13 @@ msgid "All"
msgstr "Visi"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Importuoti Animacijas..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Priedai"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4756,7 +4836,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4768,6 +4848,11 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Atsiųsti"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4928,6 +5013,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Animacija: Pakeisti TransformacijÄ…"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4958,6 +5048,7 @@ msgid "Zoom Reset"
msgstr "Nutolinti"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4978,14 +5069,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "TimeScale Nodas"
@@ -5010,6 +5104,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5026,11 +5121,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5043,6 +5133,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5251,16 +5346,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5576,14 +5661,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5667,19 +5744,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6014,7 +6095,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6121,11 +6201,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6154,7 +6230,7 @@ msgid "Error Importing"
msgstr "Įvyko klaida kraunant šriftą."
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6240,6 +6316,11 @@ msgid "Open..."
msgstr "Atidaryti"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Atidaryti Skriptų Editorių"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6278,11 +6359,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6370,6 +6451,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6440,6 +6525,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6475,22 +6561,6 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr ""
@@ -6511,6 +6581,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Panaikinti pasirinkimÄ…"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6527,30 +6602,33 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Filtrai..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in Files..."
-msgstr "Filtrai..."
+msgid "Remove All Bookmarks"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6561,7 +6639,20 @@ msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6799,8 +6890,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Animacija"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6853,9 +6945,8 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Select Mode (Q)"
-msgstr "Pasirinkite Nodus, kuriuos norite importuoti"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6865,27 +6956,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6929,22 +7000,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6999,7 +7054,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7303,10 +7358,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7394,11 +7445,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7520,8 +7571,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7825,6 +7876,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7907,6 +7962,11 @@ msgid "Duplicate Nodes"
msgstr "Duplikuoti"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Ištrinti Efektą"
@@ -7916,10 +7976,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7933,6 +7989,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Prijunkite prie Nodo:"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Prijunkite prie Nodo:"
@@ -8294,7 +8355,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8303,7 +8364,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8466,6 +8527,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8491,7 +8556,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8500,7 +8565,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8509,14 +8574,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8561,6 +8626,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8773,6 +8845,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8923,6 +8999,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8992,8 +9076,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9013,7 +9097,7 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
+msgid "Projects"
msgstr ""
#: editor/project_manager.cpp
@@ -9038,10 +9122,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9376,6 +9456,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Priedai"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9428,14 +9512,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -9727,6 +9803,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9848,19 +9928,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9954,6 +10034,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10146,6 +10230,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10559,10 +10647,29 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Sukurti NaujÄ…"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Sukurti NaujÄ…"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Keisti Poligono SkalÄ™"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10749,10 +10856,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "Redaguoti Filtrus"
@@ -11495,22 +11598,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Klaida inicijuojant FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Nežinomas šrifto formatas."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Įvyko klaida kraunant šriftą."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Netinkamas šrifto dydis."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11546,6 +11633,22 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#, fuzzy
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Pasirinkite Nodus, kuriuos norite importuoti"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Klaida inicijuojant FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Nežinomas šrifto formatas."
+
+#~ msgid "Error loading font."
+#~ msgstr "Įvyko klaida kraunant šriftą."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Netinkamas šrifto dydis."
+
#~ msgid "Path to Node:"
#~ msgstr "Kelias iki Nodo:"
diff --git a/editor/translations/lv.po b/editor/translations/lv.po
index 281cbf2c8d..fe36132eca 100644
--- a/editor/translations/lv.po
+++ b/editor/translations/lv.po
@@ -60,7 +60,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Bezmaksas"
@@ -657,15 +656,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -898,8 +897,7 @@ msgstr "Favorīti:"
msgid "Recent:"
msgstr "Nesenie:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -996,7 +994,7 @@ msgstr ""
"varÄ“tu strÄdÄt.\n"
"Tik un tÄ noņemt tos? (Nevar atsaukt)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Nevar noņemt:"
@@ -1035,7 +1033,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr "Salabot dependecīju"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1124,14 +1122,16 @@ msgid "License"
msgstr "Licence"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "TreÅ¡Äs partijas Licence"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot DzinÄ“js paļaujas uz citiem treÅ¡Äs partijas brÄ«vajÄm un atvÄ“rtÄ avota "
@@ -1152,7 +1152,8 @@ msgid "Licenses"
msgstr "Licences"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Kļūme atverot arhÄ«vu failu, nav ZIP formÄtÄ."
#: editor/editor_asset_installer.cpp
@@ -1651,12 +1652,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2061,6 +2061,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2358,6 +2362,15 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Atjaunina Ainu"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2452,6 +2465,11 @@ msgstr ""
msgid "Close Tab"
msgstr "Aizvērt"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Aizvērt"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2538,6 +2556,10 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr ""
@@ -2548,14 +2570,6 @@ msgid "Save All Scenes"
msgstr "SaglabÄt KÄ"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr ""
@@ -2585,16 +2599,20 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
@@ -2602,8 +2620,12 @@ msgstr ""
msgid "Open Project Data Folder"
msgstr "Projekta DibinÄtÄji"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2683,12 +2705,12 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
msgstr ""
#: editor/editor_node.cpp
@@ -2724,14 +2746,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2739,12 +2761,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3184,7 +3207,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3201,6 +3224,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3262,12 +3289,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3281,14 +3306,20 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Nevar noņemt:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
-msgstr ""
+#, fuzzy
+msgid "Error requesting URL:"
+msgstr "Kļūme lÄdÄ“jot:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
@@ -3373,20 +3404,12 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "Favorīti:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3419,11 +3442,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3485,6 +3508,11 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Resurs"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3552,6 +3580,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Izveidot"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3615,6 +3648,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3623,12 +3664,22 @@ msgstr ""
msgid "Invalid group name."
msgstr "Nederīgs nosaukums."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "PÄrsaukt Audio Kopni"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Izdzēst"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3641,12 +3692,13 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
+#, fuzzy
+msgid "Group Editor"
+msgstr "Rediģēt"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3852,7 +3904,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4614,10 +4666,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4630,14 +4678,43 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Nevar noņemt:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4715,8 +4792,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4737,7 +4817,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4749,6 +4829,11 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "IelÄdÄ“t"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4909,6 +4994,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Izveidot"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4938,6 +5028,7 @@ msgid "Zoom Reset"
msgstr "AttÄlinÄt"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4958,14 +5049,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "Mēroga Attiecība:"
@@ -4990,6 +5084,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5006,11 +5101,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5023,6 +5113,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5233,16 +5328,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5560,14 +5645,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5651,19 +5728,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't contain geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5994,7 +6075,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6100,11 +6180,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6133,7 +6209,7 @@ msgid "Error Importing"
msgstr "Kļūme lÄdÄ“jot:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6217,6 +6293,10 @@ msgid "Open..."
msgstr "Atvērt"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6254,11 +6334,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6347,6 +6427,10 @@ msgstr ""
msgid "Search Results"
msgstr "Meklēt:"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6418,6 +6502,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6453,24 +6538,6 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Doties uz nÄkamo soli"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Doties uz iepriekšējo soli"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr ""
@@ -6491,6 +6558,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Mēroga Izvēle"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6507,30 +6579,33 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Find in Files..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
+msgid "Go to Next Bookmark"
msgstr "Doties uz nÄkamo soli"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
+msgid "Go to Previous Bookmark"
msgstr "Doties uz iepriekšējo soli"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -6544,9 +6619,24 @@ msgid "Go to Line..."
msgstr "Doties uz Rindu"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Doties uz nÄkamo soli"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Doties uz iepriekšējo soli"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -6782,8 +6872,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Nomainīt"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6836,7 +6927,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6847,27 +6938,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6911,22 +6982,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6981,7 +7036,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7285,10 +7340,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7375,11 +7426,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7500,8 +7551,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7802,6 +7853,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7883,6 +7938,11 @@ msgid "Duplicate Nodes"
msgstr "Dublicēt atslēgvietnes"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Izdzēst"
@@ -7892,10 +7952,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7909,6 +7965,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Izveidot Jaunu %s"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Izveidot Jaunu %s"
@@ -8271,7 +8332,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8280,7 +8341,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8443,6 +8504,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8468,7 +8533,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8477,7 +8542,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8486,14 +8551,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8538,6 +8603,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8745,6 +8817,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8891,6 +8967,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8960,8 +9044,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8981,8 +9065,9 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "Projekta DibinÄtÄji"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9006,10 +9091,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9344,6 +9425,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9396,14 +9481,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9693,6 +9770,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9813,19 +9894,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9920,6 +10001,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10111,6 +10196,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10524,10 +10613,32 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr ""
+"Nederīgs nosaukums. Nedrīkst sadurties ar eksistējošu iebūvēto tipa "
+"nosaukumu."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Izveidot Jaunu %s"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Izveidot Jaunu %s"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Izveidot"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10712,10 +10823,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11455,22 +11562,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Kļūme inicializējot FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "NezinÄms fonta formÄts."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Kļūda lÄdÄ“jot fontu."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Nederīgs fonta izmērs."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11506,6 +11597,18 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Kļūme inicializējot FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "NezinÄms fonta formÄts."
+
+#~ msgid "Error loading font."
+#~ msgstr "Kļūda lÄdÄ“jot fontu."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Nederīgs fonta izmērs."
+
#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "Izvēlēties šo Mapi"
diff --git a/editor/translations/mi.po b/editor/translations/mi.po
index 8c135ea467..1bb449ea57 100644
--- a/editor/translations/mi.po
+++ b/editor/translations/mi.po
@@ -50,7 +50,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr ""
@@ -623,15 +622,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -855,8 +854,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -950,7 +948,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -986,7 +984,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1075,14 +1073,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1099,7 +1097,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1582,12 +1580,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -1977,6 +1974,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2273,6 +2274,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2366,6 +2375,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2450,20 +2463,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2496,24 +2505,32 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2593,12 +2610,12 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
msgstr ""
#: editor/editor_node.cpp
@@ -2634,14 +2651,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2649,12 +2666,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3091,7 +3109,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3108,6 +3126,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3169,12 +3191,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3188,13 +3208,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3279,19 +3303,11 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3324,11 +3340,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3387,6 +3403,10 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3450,6 +3470,10 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "Create Scene"
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3510,6 +3534,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3517,12 +3549,20 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Delete Group"
+msgstr ""
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3535,11 +3575,11 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
+msgid "Group Editor"
msgstr ""
#: editor/groups_editor.cpp
@@ -3746,7 +3786,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4488,10 +4528,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4504,14 +4540,42 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4588,8 +4652,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4610,7 +4677,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4622,6 +4689,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4776,6 +4847,10 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4804,6 +4879,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4824,14 +4900,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -4855,6 +4934,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4871,11 +4951,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4888,6 +4963,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5095,16 +5175,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5415,14 +5485,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5506,19 +5568,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5845,7 +5911,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -5951,11 +6016,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5979,7 +6040,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6060,6 +6121,10 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6097,11 +6162,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6189,6 +6254,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6255,6 +6324,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6289,92 +6359,96 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
+msgid "Fold/Unfold Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
+msgid "Fold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
+msgid "Unfold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
+msgid "Clone Down"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
+msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
+msgid "Evaluate Selection"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
+msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
+msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6612,7 +6686,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6666,7 +6740,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6677,27 +6751,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6741,22 +6795,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6811,7 +6849,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7104,10 +7142,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7192,11 +7226,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7314,8 +7348,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7594,6 +7628,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7670,15 +7708,16 @@ msgid "Duplicate Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Delete Nodes"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Visual Shader Input Type Changed"
+msgid "Delete Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
+msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7694,6 +7733,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8052,7 +8095,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8061,7 +8104,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8220,6 +8263,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8245,7 +8292,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8254,7 +8301,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8263,14 +8310,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8315,6 +8362,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8522,6 +8576,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8668,6 +8726,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8737,8 +8803,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8758,7 +8824,7 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
+msgid "Projects"
msgstr ""
#: editor/project_manager.cpp
@@ -8782,10 +8848,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9119,6 +9181,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9171,14 +9237,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9464,6 +9522,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9581,19 +9643,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9684,6 +9746,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -9872,6 +9938,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10282,10 +10352,26 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10470,10 +10556,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11203,22 +11285,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
diff --git a/editor/translations/ml.po b/editor/translations/ml.po
index e5f1538050..876edb73fa 100644
--- a/editor/translations/ml.po
+++ b/editor/translations/ml.po
@@ -58,7 +58,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr ""
@@ -631,15 +630,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -863,8 +862,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -958,7 +956,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -994,7 +992,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1083,14 +1081,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1107,7 +1105,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1590,12 +1588,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -1985,6 +1982,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2281,6 +2282,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2374,6 +2383,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2458,20 +2471,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2504,24 +2513,32 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2601,12 +2618,12 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
msgstr ""
#: editor/editor_node.cpp
@@ -2642,14 +2659,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2657,12 +2674,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3099,7 +3117,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3116,6 +3134,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3177,12 +3199,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3196,13 +3216,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3287,19 +3311,11 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3332,11 +3348,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3395,6 +3411,10 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3458,6 +3478,10 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "Create Scene"
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3518,6 +3542,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3525,12 +3557,20 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Delete Group"
+msgstr ""
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3543,11 +3583,11 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
+msgid "Group Editor"
msgstr ""
#: editor/groups_editor.cpp
@@ -3754,7 +3794,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4496,10 +4536,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4512,14 +4548,42 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4596,8 +4660,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4618,7 +4685,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4630,6 +4697,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4784,6 +4855,10 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4812,6 +4887,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4832,14 +4908,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -4863,6 +4942,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4879,11 +4959,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4896,6 +4971,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5103,16 +5183,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5423,14 +5493,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5514,19 +5576,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5853,7 +5919,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -5959,11 +6024,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5987,7 +6048,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6068,6 +6129,10 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6105,11 +6170,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6197,6 +6262,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6263,6 +6332,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6297,92 +6367,96 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
+msgid "Fold/Unfold Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
+msgid "Fold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
+msgid "Unfold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
+msgid "Clone Down"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
+msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
+msgid "Evaluate Selection"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
+msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
+msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6620,7 +6694,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6674,7 +6748,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6685,27 +6759,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6749,22 +6803,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6819,7 +6857,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7112,10 +7150,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7200,11 +7234,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7322,8 +7356,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7602,6 +7636,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7678,15 +7716,16 @@ msgid "Duplicate Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Delete Nodes"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Visual Shader Input Type Changed"
+msgid "Delete Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
+msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7702,6 +7741,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8060,7 +8103,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8069,7 +8112,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8228,6 +8271,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8253,7 +8300,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8262,7 +8309,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8271,14 +8318,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8323,6 +8370,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8530,6 +8584,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8676,6 +8734,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8745,8 +8811,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8766,7 +8832,7 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
+msgid "Projects"
msgstr ""
#: editor/project_manager.cpp
@@ -8790,10 +8856,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9127,6 +9189,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9179,14 +9245,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9472,6 +9530,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9589,19 +9651,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9692,6 +9754,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -9880,6 +9946,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10290,10 +10360,26 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10478,10 +10564,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11211,22 +11293,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
diff --git a/editor/translations/ms.po b/editor/translations/ms.po
index 6134a44d66..afe9e390fe 100644
--- a/editor/translations/ms.po
+++ b/editor/translations/ms.po
@@ -61,7 +61,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr ""
@@ -651,15 +650,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -883,8 +882,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -978,7 +976,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -1014,7 +1012,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1103,14 +1101,14 @@ msgid "License"
msgstr "Lesen"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1127,7 +1125,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1611,12 +1609,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2007,6 +2004,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2303,6 +2304,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2396,6 +2405,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2481,20 +2494,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2527,24 +2536,32 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2624,13 +2641,14 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
-msgstr ""
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
+msgstr "Set Peralihan ke:"
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2665,14 +2683,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2680,12 +2698,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3122,7 +3141,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3139,6 +3158,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3200,12 +3223,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3219,13 +3240,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3310,19 +3335,11 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3355,11 +3372,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3418,6 +3435,10 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3481,6 +3502,10 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "Create Scene"
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3541,6 +3566,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3548,12 +3581,21 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Semua Pilihan"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3566,11 +3608,11 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
+msgid "Group Editor"
msgstr ""
#: editor/groups_editor.cpp
@@ -3777,7 +3819,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4527,10 +4569,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4543,14 +4581,42 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4627,8 +4693,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4649,7 +4718,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4661,6 +4730,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4818,6 +4891,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Anim Ubah Penukaran"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4847,6 +4925,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4867,14 +4946,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -4898,6 +4980,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4914,11 +4997,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4931,6 +5009,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5138,16 +5221,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5460,14 +5533,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5551,19 +5616,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5890,7 +5959,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -5996,11 +6064,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6024,7 +6088,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6105,6 +6169,10 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6142,11 +6210,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6234,6 +6302,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6300,6 +6372,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6334,92 +6407,97 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
+msgid "Fold/Unfold Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
+msgid "Fold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
+msgid "Unfold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
+msgid "Clone Down"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
+msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Semua Pilihan"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
+msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6657,7 +6735,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6711,7 +6789,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6722,27 +6800,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6786,22 +6844,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6856,7 +6898,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7151,10 +7193,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7241,11 +7279,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7365,8 +7403,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7648,6 +7686,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7726,6 +7768,11 @@ msgid "Duplicate Nodes"
msgstr "Anim Menduakan Kunci"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Semua Pilihan"
@@ -7735,10 +7782,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7751,6 +7794,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8110,7 +8157,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8119,7 +8166,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8279,6 +8326,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8304,7 +8355,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8313,7 +8364,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8322,14 +8373,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8374,6 +8425,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8581,6 +8639,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8727,6 +8789,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8796,8 +8866,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8817,7 +8887,7 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
+msgid "Projects"
msgstr ""
#: editor/project_manager.cpp
@@ -8841,10 +8911,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9179,6 +9245,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9231,14 +9301,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -9526,6 +9588,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9643,19 +9709,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9746,6 +9812,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -9934,6 +10004,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10347,10 +10421,26 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10535,10 +10625,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11268,22 +11354,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
diff --git a/editor/translations/nb.po b/editor/translations/nb.po
index 28e807a399..7b642c69e0 100644
--- a/editor/translations/nb.po
+++ b/editor/translations/nb.po
@@ -70,7 +70,6 @@ msgid "On call to '%s':"
msgstr "NÃ¥r \"%s\" ble anropt:"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Frigjør"
@@ -700,17 +699,18 @@ msgid "Line Number:"
msgstr "Linjenummer:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "Erstattet %d forekomst(er)."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+#, fuzzy
+msgid "%d matches."
msgstr "Ingen Treff"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Erstattet %d forekomst(er)."
-
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Match Tilfelle"
@@ -950,8 +950,7 @@ msgstr "Favoritter:"
msgid "Recent:"
msgstr "Nylige:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1055,7 +1054,7 @@ msgstr ""
"Filene som fjernes kreves for at andre ressurser skal virke.\n"
"Fjern dem likevel? (kan ikke angres)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Kan ikke fjerne:"
@@ -1093,7 +1092,7 @@ msgstr "Slett %d elementer for godt? (kan ikke angres)"
msgid "Show Dependencies"
msgstr "Avhengigheter"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Foreldreløs ressursutforsker"
@@ -1184,14 +1183,16 @@ msgid "License"
msgstr "Lisens"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Tredjepartslisens"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine avhenger av en rekke tredjeparts frie og åpne kildekode-"
@@ -1212,7 +1213,8 @@ msgid "Licenses"
msgstr "Lisenser"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Feil ved åpning av pakkefil, ikke i zip format."
#: editor/editor_asset_installer.cpp
@@ -1734,12 +1736,11 @@ msgid "New"
msgstr "Ny"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importer"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Eksporter"
@@ -2172,6 +2173,10 @@ msgstr "Tøm"
msgid "Clear Output"
msgstr "Nullstill resultat"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Eksport av prosjektet mislyktes med feilkode %d."
@@ -2498,6 +2503,15 @@ msgid "Pick a Main Scene"
msgstr "Velg en HovedScene"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Lukk Scene"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Lukk Scene"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2614,6 +2628,11 @@ msgstr "Spill Scene"
msgid "Close Tab"
msgstr "Lukk Andre Faner"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Lukk Andre Faner"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Lukk Andre Faner"
@@ -2700,6 +2719,10 @@ msgstr "Ny Arvet Scene..."
msgid "Open Scene..."
msgstr "Ã…pne Scene..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Ã…pne Nylig"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Lagre Scene"
@@ -2710,14 +2733,6 @@ msgid "Save All Scenes"
msgstr "Lagre alle Scener"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Lukk Scene"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Ã…pne Nylig"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Konverter Til..."
@@ -2748,26 +2763,37 @@ msgstr "Tilbakestille Scene"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Diverse prosjekt- eller scene-relaterte verktøy"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Prosjekt"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Prosjektinnstillinger"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Verktøy"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Eksporter"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "Ã…pne ProsjektManager?"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Verktøy"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Foreldreløs ressursutforsker"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2869,13 +2895,14 @@ msgstr ""
"Når det brukes ekstert på en enhet, dette er mer effektivt med et "
"nettverksfilsystem."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
#, fuzzy
msgid "Editor"
msgstr "Redigeringsverktøy"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Redigeringsverktøy-instillinger"
#: editor/editor_node.cpp
@@ -2917,15 +2944,15 @@ msgstr "Redigeringsverktøy-instillinger"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "HÃ¥ndter Eksportmaler"
-#: editor/editor_node.cpp editor/project_export.cpp
+#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Export Templates"
+msgid "Manage Export Templates..."
msgstr "HÃ¥ndter Eksportmaler"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Hjelp"
@@ -2933,12 +2960,13 @@ msgstr "Hjelp"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Søk"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Online Dokumentasjon"
@@ -3405,7 +3433,8 @@ msgid "Import From Node:"
msgstr "Importer Fra Node:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Last Ned PÃ¥ Nytt"
#: editor/export_template_manager.cpp
@@ -3422,6 +3451,10 @@ msgid "Download"
msgstr "Last ned"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Mangler)"
@@ -3489,13 +3522,11 @@ msgid "No response."
msgstr "Ingen respons."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Request Failed."
msgstr "Forespørsel Feilet."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Redirect Loop."
msgstr "Omdirigerings-Loop."
@@ -3510,13 +3541,19 @@ msgid "Download Complete."
msgstr "Nedlastning fullført."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Kan ikke fjerne:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Error ved forespørsel av url: "
#: editor/export_template_manager.cpp
@@ -3608,21 +3645,12 @@ msgstr "Last ned Mal"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Velg fillager fra liste: "
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Kan ikke åpne fyle_type_cache.cch for skriving, lagrer ikke file type cache!"
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "Favoritter:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "Kan ikke navigere til '%s' for den ble ikke funnet på filsystemet!"
-
-#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3665,14 +3693,14 @@ msgid "Provided name contains invalid characters."
msgstr "Gitt navn inneholder ugyldige tegn"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Navn inneholder ugyldige tegn."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "En fil eller mappe med dette navnet eksisterer allerede."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Navn inneholder ugyldige tegn."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Endrer filnavn:"
@@ -3735,6 +3763,11 @@ msgstr "Duplisér"
msgid "Move To..."
msgstr "Flytt Til..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Ny Scene"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3809,6 +3842,11 @@ msgstr "En fil eller mappe med dette navnet eksisterer allerede."
msgid "Overwrite"
msgstr "Overskriv"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Lagre Scene"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Opprett skript"
@@ -3878,6 +3916,14 @@ msgid "Search complete"
msgstr "Søk Tekst"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Legg til i Gruppe"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Fjern fra Gruppe"
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "ERROR: Animasjonsnavnet finnes allerede!"
@@ -3887,13 +3933,23 @@ msgstr "ERROR: Animasjonsnavnet finnes allerede!"
msgid "Invalid group name."
msgstr "Ugyldig navn."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Grupper"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Slett Layout"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupper"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr "Legg til i Gruppe"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3908,12 +3964,13 @@ msgid "Nodes in Group"
msgstr "Legg til i Gruppe"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Legg til i Gruppe"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Fjern fra Gruppe"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Ã…pne SkriptEditor"
#: editor/groups_editor.cpp
#, fuzzy
@@ -4130,7 +4187,8 @@ msgid "MultiNode Set"
msgstr "MultiNode Set"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Velg en Node for å endre Signaler og Grupper."
#: editor/plugin_config_dialog.cpp
@@ -4945,10 +5003,6 @@ msgid "View Files"
msgstr "Vis Filer"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Kan ikke løse tjenernavn:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Tilkoblingsfeil, vennligst prøv igjen."
@@ -4961,15 +5015,48 @@ msgid "No response from host:"
msgstr "Ingen respons fra tjener:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Kan ikke løse tjenernavn:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Forespørsel feilet, returneringskode:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Forespørsel Feilet."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Kan ikke fjerne:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Forespørsel feilet, for mange omdirigeringer"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
+msgid "Redirect loop."
+msgstr "Omdirigerings-Loop."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Forespørsel feilet, returneringskode:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Tid:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Bad download hash, assuming file has been tampered with."
msgstr "DÃ¥rlig nedlastningshash, antar at filen har blitt tuklet med."
@@ -5053,9 +5140,13 @@ msgid "All"
msgstr "Alle"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
#, fuzzy
-msgid "Plugins"
+msgid "Import..."
+msgstr "Importer"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Plugins"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -5077,7 +5168,8 @@ msgid "Site:"
msgstr "Side:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Support..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -5089,6 +5181,11 @@ msgid "Testing"
msgstr "Tester"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Last"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Assets ZIP-Fil"
@@ -5261,6 +5358,11 @@ msgstr "Lim Inn Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "Fjern Pose"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Fjern Ben"
@@ -5291,6 +5393,7 @@ msgid "Zoom Reset"
msgstr "Zoom Ut"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Velg Modus"
@@ -5312,14 +5415,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+Høyreklikk: Dybdelisteutvalg"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Flytt Modus"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Roter Modus"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "Velg Modus"
@@ -5348,6 +5454,7 @@ msgid "Toggle snapping."
msgstr "Slå av/på snapping"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Bruk Snap"
@@ -5366,11 +5473,6 @@ msgid "Use Rotation Snap"
msgstr "Bruk Rotasjons-Snap"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Konfigurer Snap..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Snap Relativt"
@@ -5384,6 +5486,11 @@ msgid "Smart Snapping"
msgstr "Smart snapping"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Konfigurer Snap..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
msgstr "Snap til foreldre"
@@ -5610,16 +5717,6 @@ msgstr "Sett Handle"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Feil ved innlasting av bilde:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Ingen piksler med gjennomsiktighet > 128 i bilde..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5943,14 +6040,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -6035,19 +6124,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6394,7 +6487,6 @@ msgid "Grid Settings"
msgstr "Redigeringsverktøy-instillinger"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6513,12 +6605,7 @@ msgstr "Error ved lagring av TileSet!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "Kunne ikke opprette mappe."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "Kunne ikke opprette mappe."
#: editor/plugins/script_editor_plugin.cpp
@@ -6548,7 +6635,7 @@ msgstr "Error ved importering"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "Ny Mappe..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6635,6 +6722,11 @@ msgid "Open..."
msgstr "Ã…pne"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Kjør Skript"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Lagre Alle"
@@ -6674,13 +6766,13 @@ msgid "Save Theme"
msgstr "Lagre drakt"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Lukk Dokumentasjon"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Lukk Alle"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Lukk Dokumentasjon"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Kjør"
@@ -6769,6 +6861,11 @@ msgstr "Feilretter"
msgid "Search Results"
msgstr "Søk hjelp"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Fjern Nylige Scener"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6841,6 +6938,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6878,26 +6976,6 @@ msgstr "Veksle kommentar"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Veksle kommentar"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "GÃ¥ til Neste Steg"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "GÃ¥ til tidligere redigert dokument."
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Fjern Funksjon"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Fold/Unfold Line"
msgstr "Slett Valgte"
@@ -6918,6 +6996,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Skaler Utvalg"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6936,32 +7019,37 @@ msgid "Auto Indent"
msgstr "Automatisk innrykk"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr ""
+msgid "Find Previous"
+msgstr "Finn forrige"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Filtrer Filer..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "GÃ¥ til Neste Steg"
+msgid "Toggle Bookmark"
+msgstr "Veksle kommentar"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "GÃ¥ til tidligere redigert dokument."
+msgid "Go to Next Bookmark"
+msgstr "GÃ¥ til Neste Steg"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Finn forrige"
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "GÃ¥ til tidligere redigert dokument."
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Filtrer Filer..."
+msgid "Remove All Bookmarks"
+msgstr "Fjern Funksjon"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6974,9 +7062,24 @@ msgid "Go to Line..."
msgstr "GÃ¥ til Linje"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "GÃ¥ til Neste Steg"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "GÃ¥ til tidligere redigert dokument."
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -7222,8 +7325,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Endre Anim Lengde"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7279,9 +7383,8 @@ msgid "Snap Nodes To Floor"
msgstr "Snap til rutenett"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Select Mode (Q)"
-msgstr "Velg Modus"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7291,31 +7394,10 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap Mode (%s)"
-msgstr "Snap til veiledere"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Bunnvisning"
@@ -7356,23 +7438,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Tool Select"
-msgstr "Slett Valgte"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -7428,8 +7493,9 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
-msgstr ""
+#, fuzzy
+msgid "Settings..."
+msgstr "Redigeringsverktøy-instillinger"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7739,10 +7805,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7834,12 +7896,12 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "Element %d"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "Element %d"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7965,8 +8027,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8288,6 +8350,10 @@ msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Legg til Input"
@@ -8379,6 +8445,11 @@ msgid "Duplicate Nodes"
msgstr "Anim Dupliser Nøkler"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Lim inn Noder"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Kutt Noder"
@@ -8388,10 +8459,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -8406,6 +8473,11 @@ msgstr "Høyre"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Lag Node"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Lag Node"
@@ -8772,7 +8844,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8781,7 +8853,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8945,6 +9017,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8970,7 +9046,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8979,7 +9055,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8988,14 +9064,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -9040,6 +9116,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9255,6 +9338,11 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Manage Export Templates"
+msgstr "HÃ¥ndter Eksportmaler"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9408,6 +9496,15 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "Importer Eksisterende Prosjekt"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "Kan ikke åpne prosjekt"
@@ -9485,8 +9582,8 @@ msgstr "Fjern prosjekt fra listen? (Mappeinnhold vil ikke bli modifisert)"
#: editor/project_manager.cpp
#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr "Fjern prosjekt fra listen? (Mappeinnhold vil ikke bli modifisert)"
#: editor/project_manager.cpp
@@ -9509,8 +9606,9 @@ msgid "Project Manager"
msgstr "Prosjektleder"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Prosjektliste"
+#, fuzzy
+msgid "Projects"
+msgstr "Prosjekt"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9534,10 +9632,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Avslutt"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Omstart NÃ¥"
@@ -9881,6 +9975,11 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+#, fuzzy
+msgid "Plugins"
+msgstr "Plugins"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9935,14 +10034,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10245,6 +10336,11 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Anim Forandre Verdi"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10375,19 +10471,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10485,6 +10581,11 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Overskriv"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10685,6 +10786,10 @@ msgid "Change Shortcut"
msgstr "Endre Anker"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Redigeringsverktøy-instillinger"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -11112,10 +11217,31 @@ msgid "Set Variable Type"
msgstr "Rediger Variabel:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr ""
+"Ugyldig navn. Kan ikke kollidere med et eksisterende innebygd type navn."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Lag ny %s"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Variabler:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Lag ny %s"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Lag en ny polygon fra bunnen."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Navn er ikke en gyldig identifikator:"
@@ -11315,10 +11441,6 @@ msgid "Cut Nodes"
msgstr "Kutt Noder"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Lim inn Noder"
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "Medlemmer"
@@ -12066,22 +12188,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Feil ved innlasting av font."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Ugyldig fontstørrelse."
-
#: scene/resources/visual_shader.cpp
#, fuzzy
msgid "Input"
@@ -12118,6 +12224,55 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr "Konstanter kan ikke endres."
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Kan ikke åpne fyle_type_cache.cch for skriving, lagrer ikke file type "
+#~ "cache!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "Kan ikke navigere til '%s' for den ble ikke funnet på filsystemet!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Feil ved innlasting av bilde:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Ingen piksler med gjennomsiktighet > 128 i bilde..."
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "Kunne ikke opprette mappe."
+
+#, fuzzy
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Velg Modus"
+
+#, fuzzy
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Snap til veiledere"
+
+#, fuzzy
+#~ msgid "Tool Select"
+#~ msgstr "Slett Valgte"
+
+#, fuzzy
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr "Fjern prosjekt fra listen? (Mappeinnhold vil ikke bli modifisert)"
+
+#~ msgid "Project List"
+#~ msgstr "Prosjektliste"
+
+#~ msgid "Exit"
+#~ msgstr "Avslutt"
+
+#~ msgid "Error loading font."
+#~ msgstr "Feil ved innlasting av font."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Ugyldig fontstørrelse."
+
#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "Forrige fane"
diff --git a/editor/translations/nl.po b/editor/translations/nl.po
index 67b9141d5b..2c836b5685 100644
--- a/editor/translations/nl.po
+++ b/editor/translations/nl.po
@@ -35,12 +35,13 @@
# Jimmy De Smet <J773@telenet.be>, 2019.
# Bastiaan van der Plaat <bastiaan.v.d.plaat@gmail.com>, 2019.
# Hector Peeters <hector.peeters@gmail.com>, 2019.
+# Shawn Gyina <gyina.shawn@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-06-16 19:42+0000\n"
-"Last-Translator: Hector Peeters <hector.peeters@gmail.com>\n"
+"PO-Revision-Date: 2019-08-04 14:23+0000\n"
+"Last-Translator: Shawn Gyina <gyina.shawn@gmail.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/"
"nl/>\n"
"Language: nl\n"
@@ -48,7 +49,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.7-dev\n"
+"X-Generator: Weblate 3.8-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -91,7 +92,6 @@ msgid "On call to '%s':"
msgstr "Tijdens invocatie van '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Vrij"
@@ -108,9 +108,8 @@ msgid "Time:"
msgstr "Tijd:"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Value:"
-msgstr "Nieuwe Waarde:"
+msgstr "Waarde:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
@@ -492,10 +491,19 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
+"Deze animatie behoort tot een geïmporteerde scène, dus veranderingen aan "
+"geïmporteerde tracks zullen niet worden opgeslagen.\n"
+"\n"
+"Om aangepaste tracks toe te voegen, navigeert u naar de importinstellingen "
+"van de scène en stelt u deze in\n"
+"\"Animation > Storage\" naar \"Files\", schakel \"Animation > Keep Custom "
+"Tracks\" in, dan herimporteren.\n"
+"U kunt ook een importvoorinstelling gebruiken die animaties importeert om "
+"bestanden te scheiden."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
-msgstr ""
+msgstr "Waarschuwing: Geïmporteerde animatie bewerken"
#: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
@@ -503,9 +511,8 @@ msgid "Select All"
msgstr "Alles Selecteren"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select None"
-msgstr "Alles Selecteren"
+msgstr "Niets Selecteren"
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
@@ -683,16 +690,18 @@ msgid "Line Number:"
msgstr "Regelnummer:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr ""
+msgid "Replaced %d occurrence(s)."
+msgstr "%d voorgekomen waarde(s) vervangen."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Geen Overeenkomsten"
+#, fuzzy
+msgid "%d match."
+msgstr "%d overeenkomst(en) gevonden."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d voorgekomen waarde(s) vervangen."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "%d overeenkomst(en) gevonden."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -744,17 +753,15 @@ msgid "Line and column numbers."
msgstr "Regel- en kolomnummers."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Method in target node must be specified."
-msgstr "Methode in doel Node moet gespecificeerd worden!"
+msgstr "Methode in doel Node moet gespecificeerd worden."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
msgstr ""
-"Doel methode niet gevonden! Specificeer een geldige methode of koppel een "
+"Doel methode niet gevonden. Specificeer een geldige methode of koppel een "
"script aan de doel Node."
#: editor/connections_dialog.cpp
@@ -930,8 +937,7 @@ msgstr "Favorieten:"
msgid "Recent:"
msgstr "Recente:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1037,7 +1043,7 @@ msgstr ""
"te laten werken.\n"
"Toch verwijderen? (Kan niet ongedaan worden.)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Niet te verwijderen:"
@@ -1074,7 +1080,7 @@ msgstr "%d item(s) permanent verwijderen? (Kan niet ongedaan worden!)"
msgid "Show Dependencies"
msgstr "Afhankelijkheden"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Wees Resource Verkenner"
@@ -1163,14 +1169,16 @@ msgid "License"
msgstr "Licentie"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Derde partijslicentie"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine maakt gebruik van enkele gratis en open-source bibliotheken, "
@@ -1191,7 +1199,8 @@ msgid "Licenses"
msgstr "Licenties"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Fout bij het openen van het pakketbestand, geen zip-formaat."
#: editor/editor_asset_installer.cpp
@@ -1704,12 +1713,11 @@ msgid "New"
msgstr "Nieuw"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importeren"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Exporteren"
@@ -2125,6 +2133,10 @@ msgstr "Leegmaken"
msgid "Clear Output"
msgstr "Maak Uitvoer Leeg"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Project exporteren faalt door foutcode %d."
@@ -2457,6 +2469,15 @@ msgid "Pick a Main Scene"
msgstr "Kies een Hoofdscene"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Scene Sluiten"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Scene Sluiten"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Inschakelen plug-in is gefaald op: '%s' inlezen van configuratiebestand "
@@ -2573,6 +2594,11 @@ msgstr "Speel Scene"
msgid "Close Tab"
msgstr "Tabblad sluiten"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Tabblad sluiten"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Sluit Andere Tabbladen"
@@ -2659,6 +2685,10 @@ msgstr "Nieuwe Geërfde Scene..."
msgid "Open Scene..."
msgstr "Scene Openen..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Recente Scenes Openen"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Scene Opslaan"
@@ -2669,14 +2699,6 @@ msgid "Save All Scenes"
msgstr "Alle Scenes Opslaan"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Scene Sluiten"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Recente Scenes Openen"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Converteer Naar..."
@@ -2708,26 +2730,37 @@ msgstr "Scene Herstellen"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Diverse project of scene-brede gereedschappen."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Project"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Projectinstellingen"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Gereedschappen"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Exporteren"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "Open de Project Manager?"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Gereedschappen"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Wees Resource Verkenner"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2826,13 +2859,14 @@ msgstr ""
"Wanneer dit op afstand wordt gebruikt op een andere machine, is dit "
"efficiënter met het netwerk bestandssysteem."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
#, fuzzy
msgid "Editor"
msgstr "Verwerker"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Editor Instellingen"
#: editor/editor_node.cpp
@@ -2872,14 +2906,15 @@ msgstr "Open Editor Instellingen Map"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "Beheer Export Templates"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Beheer Export Templates"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Help"
@@ -2887,12 +2922,13 @@ msgstr "Help"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Zoeken"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Online Documentatie"
@@ -3346,7 +3382,8 @@ msgid "Import From Node:"
msgstr "Importeer Vanuit Node:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Opnieuw Downloaden"
#: editor/export_template_manager.cpp
@@ -3363,6 +3400,10 @@ msgid "Download"
msgstr "Download"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Missend)"
@@ -3426,12 +3467,10 @@ msgid "No response."
msgstr "Geen antwoord."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Aanvraag Mislukt."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Redirectlus."
@@ -3445,15 +3484,22 @@ msgid "Download Complete."
msgstr "Download Voltooid."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Kan thema niet opslaan in bestand:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Installatie van templates mislukt. De problematische template archieven "
"kunnen gevonden worden op '%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Fout bij het opvragen van een URL: "
#: editor/export_template_manager.cpp
@@ -3540,23 +3586,11 @@ msgstr "Download Sjablonen"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Selecteer mirror uit lijst: (Shift-klik: In Browser openen)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Kan niet schrijven in file_type_cache.cch, de bestandstype cache wordt niet "
-"bewaard!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Favorieten"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"Kan niet naar '%s' navigeren omdat het niet in het bestandssysteem gevonden "
-"is!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Status: Importeren van bestand mislukt. Repareer het bestand en importeer "
@@ -3592,14 +3626,14 @@ msgid "Provided name contains invalid characters."
msgstr "De opgegeven naam bevat ongeldige tekens"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Naam bevat ongeldige tekens."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Er bestaat al een bestand of map met deze naam."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Naam bevat ongeldige tekens."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Hernoem bestand:"
@@ -3659,6 +3693,11 @@ msgstr "Dupliceren..."
msgid "Move To..."
msgstr "Verplaats Naar..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Nieuwe Scene"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Nieuw Script..."
@@ -3727,6 +3766,11 @@ msgstr "Er is al een bestand of map met dezelfde naam op dit pad."
msgid "Overwrite"
msgstr "Overschrijven"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Creëer vanuit Scene"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Creëer Script"
@@ -3790,6 +3834,14 @@ msgid "Search complete"
msgstr "Zoek Tekst"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Toevoegen aan Groep"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Verwijderen uit Groep"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Groepnaam bestaat al."
@@ -3797,12 +3849,23 @@ msgstr "Groepnaam bestaat al."
msgid "Invalid group name."
msgstr "Ongeldige groepnaam."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Groepen beheren"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Layout Verwijderen"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Groepen"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Knopen niet in de groep"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3815,12 +3878,13 @@ msgid "Nodes in Group"
msgstr "Knopen in de groep"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Toevoegen aan Groep"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Verwijderen uit Groep"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Open Script Bewerker"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -4031,7 +4095,8 @@ msgid "MultiNode Set"
msgstr "MultiNode Set"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Selecteer een Node om Signalen en Groepen aan te passen."
#: editor/plugin_config_dialog.cpp
@@ -4826,10 +4891,6 @@ msgid "View Files"
msgstr "Bekijk Bestanden"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Kan hostname niet herleiden:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Verbindingsfout, probeer het nog eens."
@@ -4842,14 +4903,47 @@ msgid "No response from host:"
msgstr "Geen antwoord van host:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Kan hostname niet herleiden:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Aanvraag mislukt, retourcode:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Aanvraag Mislukt."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Kan thema niet opslaan in bestand:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Aanvraag mislukt, te veel redirects"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Redirectlus."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Aanvraag mislukt, retourcode:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Tijd"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Slechte download hash, ervan uitgaand dat met het bestand is geknoeid."
@@ -4927,8 +5021,13 @@ msgid "All"
msgstr "Alle"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Importeren"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Plugins"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4950,7 +5049,8 @@ msgid "Site:"
msgstr "Site:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Ondersteuning..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4962,6 +5062,11 @@ msgid "Testing"
msgstr "Testen"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Laden..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Assets ZIP Bestand"
@@ -5139,6 +5244,11 @@ msgstr "Plak Houding"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "Maak Houding Leeg"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Maak één of meerdere op maat gemaakte botten van één of meerdere Nodes"
@@ -5170,6 +5280,7 @@ msgid "Zoom Reset"
msgstr "Zoom terugzetten"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Selecteer Modus"
@@ -5192,14 +5303,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt + RMB: Diepte lijst selectie"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Verplaatsingsmodus"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Rotatiemodus"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Schaalwijze"
@@ -5225,6 +5339,7 @@ msgid "Toggle snapping."
msgstr "Automatisch schikken omschakelen."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Gebruik Uitlijnen"
@@ -5242,11 +5357,6 @@ msgid "Use Rotation Snap"
msgstr "Gebruik Rotatie Snap"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Configureer Snap..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Snap Relatief"
@@ -5260,6 +5370,11 @@ msgid "Smart Snapping"
msgstr "Slim Uitlijnen"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Configureer Snap..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
msgstr "Snap naar ouder"
@@ -5494,16 +5609,6 @@ msgstr "Stel Handgreep In"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Error bij het laden van afbeelding:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Geen pixels met transparantie > 128 in afbeelding..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Laad Emissie Masker"
@@ -5833,15 +5938,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Oppervlakte bron is ongeldig (geen vlakken)."
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
-msgid "Parent has no solid faces to populate."
-msgstr "Ouder heeft geen vaste vlakken om te bevolken."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Kon het gebied niet mappen."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Selecteer een Bron Mesh:"
@@ -5927,20 +6023,27 @@ msgid "Generation Time (sec):"
msgstr "Genereer Tijd (sec):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Vlakken bevatten geen gebied!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Geen vlakken!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Node bevat geen geometrie (vlakken)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Node bevat geen geometrie."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Node bevat geen geometrie (vlakken)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Node bevat geen geometrie."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6290,7 +6393,6 @@ msgid "Grid Settings"
msgstr "Instellingen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Snap"
@@ -6405,13 +6507,8 @@ msgstr "Error bij het opslaan van TileSet!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "Map kon niet gemaakt worden."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
-msgstr "Map kon niet gemaakt worden."
+msgid "Could not load file at:"
+msgstr "Niet gevonden titel:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6440,7 +6537,7 @@ msgstr "Fout bij importeren"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "Nieuwe Map..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6527,6 +6624,11 @@ msgid "Open..."
msgstr "Openen"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Omschrijving:"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Alles Opslaan"
@@ -6566,13 +6668,13 @@ msgid "Save Theme"
msgstr "Thema Opslaan"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Sluit Docs"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Sluit Alles"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Sluit Docs"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Starten"
@@ -6665,6 +6767,11 @@ msgstr "Debugger"
msgid "Search Results"
msgstr "Zoek Hulp"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Maak Leeg"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6738,6 +6845,7 @@ msgid "Syntax Highlighter"
msgstr "Syntax Markeren"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6773,26 +6881,6 @@ msgid "Toggle Comment"
msgstr "Commentaar Aan/Uit"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Toggle Favoriet"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Ga Naar Volgende Breekpunt"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Ga Naar Vorige Breekpunt"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Verwijder Alle Items"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Vouw/Ontvouw Regel"
@@ -6813,6 +6901,11 @@ msgid "Complete Symbol"
msgstr "Voltooi Symbool"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Schaal selectie"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Trim Navolgende Spaties"
@@ -6831,32 +6924,37 @@ msgid "Auto Indent"
msgstr "Auto Indentatie"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Breekpunt Aan- of Uitschakelen"
+msgid "Find Previous"
+msgstr "Vind Vorige"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Verwijder Alle Breekpunten"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Bestanden Filteren..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "Contextuele Hulp"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "Ga Naar Volgende Breekpunt"
+msgid "Toggle Bookmark"
+msgstr "Toggle Favoriet"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "Ga Naar Vorige Breekpunt"
+msgid "Go to Next Bookmark"
+msgstr "Ga Naar Volgende Breekpunt"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Vind Vorige"
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Ga Naar Vorige Breekpunt"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Bestanden Filteren..."
+msgid "Remove All Bookmarks"
+msgstr "Verwijder Alle Items"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6869,8 +6967,23 @@ msgid "Go to Line..."
msgstr "Ga Naar Regel..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Contextuele Hulp"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Breekpunt Aan- of Uitschakelen"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Verwijder Alle Breekpunten"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Ga Naar Volgende Breekpunt"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Ga Naar Vorige Breekpunt"
#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
@@ -7122,8 +7235,9 @@ msgid "Audio Listener"
msgstr "Audio Luisteraar"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Inschakelen Doppler"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Activeer filtering"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7183,8 +7297,8 @@ msgid "Snap Nodes To Floor"
msgstr "Uitlijnen op raster"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Selectiestand (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7197,29 +7311,9 @@ msgstr ""
"Alt+RMB: Diepte selectie"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Beweegstand (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Rotatiestand (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Schaalstand (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Lokale Coördinaten"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr "Lokale Ruimtemodus (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Snap Mode (%s)"
-msgstr "Op hulplijnen uitlijnen"
+msgid "Use Local Space"
+msgstr "Lokale Ruimtemodus (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
@@ -7263,22 +7357,6 @@ msgid "Focus Selection"
msgstr "Focus Selectie"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Gereedschappen"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Beweeg Gereedschap"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Roteer Gereedschap"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Verschalen Gereedschap"
-
-#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Toggle Freelook"
msgstr "Toggle Favoriet"
@@ -7336,7 +7414,8 @@ msgstr "Bekijk Raster"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Instellingen"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7658,10 +7737,6 @@ msgid "TextureRegion"
msgstr "Textuur Regio"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "Kan thema niet opslaan in bestand:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Alle Items Toevoegen"
@@ -7751,12 +7826,12 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "Item"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "Item"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7879,8 +7954,8 @@ msgstr "Teken Tegel"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8211,6 +8286,10 @@ msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Voeg invoer toe"
@@ -8304,6 +8383,11 @@ msgid "Duplicate Nodes"
msgstr "Dupliceer Graaf Knooppunt(en)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Plak Nodes"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Alles Selecteren"
@@ -8313,10 +8397,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "Visuele Shader Invoertype Gewijzigd"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Vertex"
msgstr "Vertices"
@@ -8333,6 +8413,11 @@ msgstr "Rechts"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Creëer Node"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Creëer Node"
@@ -8701,7 +8786,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8710,7 +8795,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8879,6 +8964,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8904,7 +8993,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8913,7 +9002,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8922,14 +9011,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8976,6 +9065,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9203,6 +9299,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Vermiste Exportsjablonen voor dit platform:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Beheer Export Templates"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "Exporteer Met Debug"
@@ -9366,6 +9466,15 @@ msgstr "Naamloos Project"
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "Importeer bestaand project"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "Kan project niet openen"
@@ -9468,8 +9577,8 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
"Project uit de lijst verwijderen? (Inhoud van map wordt niet gewijzigd)"
@@ -9496,8 +9605,9 @@ msgid "Project Manager"
msgstr "Project Manager"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Projectlijst"
+#, fuzzy
+msgid "Projects"
+msgstr "Project"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9522,10 +9632,6 @@ msgid "Templates"
msgstr "Verwijder Selectie"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Sluiten"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Herstart Nu"
@@ -9885,6 +9991,10 @@ msgstr ""
msgid "AutoLoad"
msgstr "Automatisch Laden"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Plugins"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Nul"
@@ -9939,14 +10049,6 @@ msgstr "Selecteer Virtuele Method"
msgid "Select Method"
msgstr "Selecteer Method"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "Kan PVRTC tool niet uitvoeren:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr "Kan geconverteerd beeld niet laden met de PVRTC tool:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10259,6 +10361,11 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Verander Input Naam"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10394,19 +10501,19 @@ msgstr "Knooppunt configuratie waarschuwing:"
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10505,6 +10612,11 @@ msgid "Error loading script from %s"
msgstr "Fout bij het laden script van %s"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Overschrijven"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "Niet van toepassing"
@@ -10707,6 +10819,10 @@ msgid "Change Shortcut"
msgstr "Wijzig Ankers"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Editor Instellingen"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Snelkoppelingen"
@@ -11142,10 +11258,31 @@ msgid "Set Variable Type"
msgstr "Variabele Bewerken:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr ""
+"Ongeldige naam. Mag niet botsen met een bestaande ingebouwde type naam."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Nieuwe knopen maken."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Variabelen:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Nieuwe knopen maken."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Nieuwe veelhoek aanmaken."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Naam is geen geldige identifier:"
@@ -11350,10 +11487,6 @@ msgid "Cut Nodes"
msgstr "Knip Nodes"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Plak Nodes"
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "Leden"
@@ -12184,22 +12317,6 @@ msgstr ""
"hebt zijn inhoud direct op het scherm te weergeven. Anders, maak er een "
"RenderTarget van en wijs zijn interne texture toe aan een node om te tonen."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Error bij het initialiseren van FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Onbekende lettertype formaat."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Fout bij het laden van lettertype."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Ongeldige lettertype grootte."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Invoer"
@@ -12234,6 +12351,112 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "No Matches"
+#~ msgstr "Geen Overeenkomsten"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Kan niet schrijven in file_type_cache.cch, de bestandstype cache wordt "
+#~ "niet bewaard!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "Kan niet naar '%s' navigeren omdat het niet in het bestandssysteem "
+#~ "gevonden is!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Error bij het laden van afbeelding:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Geen pixels met transparantie > 128 in afbeelding..."
+
+#, fuzzy
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Ouder heeft geen vaste vlakken om te bevolken."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Kon het gebied niet mappen."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Vlakken bevatten geen gebied!"
+
+#~ msgid "No faces!"
+#~ msgstr "Geen vlakken!"
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "Map kon niet gemaakt worden."
+
+#, fuzzy
+#~ msgid "Error could not load file."
+#~ msgstr "Map kon niet gemaakt worden."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Inschakelen Doppler"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Selectiestand (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Beweegstand (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Rotatiestand (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Schaalstand (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Lokale Coördinaten"
+
+#, fuzzy
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Op hulplijnen uitlijnen"
+
+#~ msgid "Tool Select"
+#~ msgstr "Gereedschappen"
+
+#~ msgid "Tool Move"
+#~ msgstr "Beweeg Gereedschap"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Roteer Gereedschap"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Verschalen Gereedschap"
+
+#, fuzzy
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "Project uit de lijst verwijderen? (Inhoud van map wordt niet gewijzigd)"
+
+#~ msgid "Project List"
+#~ msgstr "Projectlijst"
+
+#~ msgid "Exit"
+#~ msgstr "Sluiten"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "Kan PVRTC tool niet uitvoeren:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr "Kan geconverteerd beeld niet laden met de PVRTC tool:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Error bij het initialiseren van FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Onbekende lettertype formaat."
+
+#~ msgid "Error loading font."
+#~ msgstr "Fout bij het laden van lettertype."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Ongeldige lettertype grootte."
+
#~ msgid "Previous Folder"
#~ msgstr "Vorige Folder"
@@ -12766,9 +12989,6 @@ msgstr ""
#~ msgid "Erase selection"
#~ msgstr "Verwijder Selectie"
-#~ msgid "Could not find tile:"
-#~ msgstr "Niet gevonden titel:"
-
#~ msgid "Item name or ID:"
#~ msgstr "Item naam of identificatiecode:"
diff --git a/editor/translations/or.po b/editor/translations/or.po
new file mode 100644
index 0000000000..6745237b50
--- /dev/null
+++ b/editor/translations/or.po
@@ -0,0 +1,11324 @@
+# Odia translation of the Godot Engine editor
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
+# This file is distributed under the same license as the Godot source code.
+# Pro Neon <proneon267@gmail.com>, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2019-08-11 10:23+0000\n"
+"Last-Translator: Pro Neon <proneon267@gmail.com>\n"
+"Language-Team: Odia <https://hosted.weblate.org/projects/godot-engine/godot/"
+"or/>\n"
+"Language: or\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.8-dev\n"
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "convert() କୠଅବୈଧ ପà­à¬°à¬•ାର ଯà­à¬•à­à¬¤à¬¿, ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କର TYPE_* ସà­à¬¥à¬¿à¬°à¬¾à¬™à­à¬• |"
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/mono/glue/gd_glue.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid input %i (not passed) in expression"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "self can't be used because instance is null (not passed)"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid operands to operator %s, %s and %s."
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid index of type %s for base type %s"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid named index '%s' for base type %s"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid arguments to construct '%s'"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "On call to '%s':"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Free"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Balanced"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Mirror"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
+msgid "Time:"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Value:"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Insert Key Here"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Duplicate Selected Key(s)"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Delete Selected Key(s)"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Add Bezier Point"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Move Bezier Points"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Time"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Value"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Keyframe Time"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Transition"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Transform"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Keyframe Value"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Call"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Length"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Property Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "3D Transform Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Call Method Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Bezier Curve Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation length (frames)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation length (seconds)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Looping"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Clips:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Clips:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Track Path"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Toggle this track on/off."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Update Mode (How this property is set)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Interpolation Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove this track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Time (s): "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Toggle Track Enabled"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Capture"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Nearest"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
+#: editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Cubic"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clamp Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Wrap Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Key(s)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Key(s)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Update Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Interpolation Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Loop Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/create_dialog.cpp
+#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "AnimationPlayer can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Rearrange Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Transform tracks only apply to Spatial-based nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"Audio tracks can only point to nodes of type:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation tracks can only point to AnimationPlayer nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "An animation player can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Not possible to add a new track without a root"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Bezier Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track is not of type Spatial, can't insert key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Transform Track Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Track Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a method key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Method Track Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Method not found in object: "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clipboard is empty"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Paste Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"This option does not work for Bezier editing, as it's only a single track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"This animation belongs to an imported scene, so changes to imported tracks "
+"will not be saved.\n"
+"\n"
+"To enable the ability to add custom tracks, navigate to the scene's import "
+"settings and set\n"
+"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks"
+"\", then re-import.\n"
+"Alternatively, use an import preset that imports animations to separate "
+"files."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Warning: Editing imported animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Select All"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Select None"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Only show tracks from nodes selected in tree."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Group tracks by node or display them as plain list."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Snap:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation step value."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Seconds"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "FPS"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/project_manager.cpp editor/project_settings_editor.cpp
+#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Edit"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation properties."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Copy Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Next Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Previous Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Pick the node that will be animated:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Use Bezier Curves"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Select tracks to copy:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_log.cpp
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Copy"
+msgstr ""
+
+#: editor/animation_track_editor_plugins.cpp
+msgid "Add Audio Track Clip"
+msgstr ""
+
+#: editor/animation_track_editor_plugins.cpp
+msgid "Change Audio Track Clip Start Offset"
+msgstr ""
+
+#: editor/animation_track_editor_plugins.cpp
+msgid "Change Audio Track Clip End Offset"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replaced %d occurrence(s)."
+msgstr ""
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
+msgstr ""
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Match Case"
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: editor/code_editor.cpp editor/rename_dialog.cpp
+msgid "Replace"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
+#: editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Warnings"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line and column numbers."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Method in target node must be specified."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid ""
+"Target method not found. Specify a valid method or attach a script to the "
+"target node."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect to Node:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect to Script:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "From Signal:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Scene does not contain any script."
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
+#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+msgid "Add"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/editor_feature_profile.cpp editor/groups_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp
+msgid "Remove"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Advanced"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid ""
+"Defers the signal, storing it in a queue and only firing it at idle time."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnects the signal after its first emission."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Cannot connect signal"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/export_template_manager.cpp editor/groups_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
+#: editor/project_settings_editor.cpp editor/property_editor.cpp
+#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Close"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Signal:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect '%s' from '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect all from signal: '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect a Signal to a Method"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit Connection:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from this signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect All"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Go To Method"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Change %s Type"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/project_settings_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Create New %s"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Matches:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Description:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will only take effect when reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will only take effect when reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
+msgid "Path"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Open"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (Can't be restored)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Cannot remove:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Load failed due to missing dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Show Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
+#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Key"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Value"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Godot Engine contributors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Founders"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Lead Developer"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Manager "
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Developers"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Authors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Platinum Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Mini Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Silver Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "License"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Third-party Licenses"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid ""
+"Godot Engine relies on a number of third-party free and open source "
+"libraries, all compatible with the terms of its MIT license. The following "
+"is an exhaustive list of all such third-party components with their "
+"respective copyright statements and license terms."
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "All Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Licenses"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Error opening package file, not in ZIP format."
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Uncompressing Assets"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Package installed successfully!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Success!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/editor_node.cpp
+msgid "Install"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Package Installer"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Speakers"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Rename Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Change Audio Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Bypass Effects"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Select Audio Bus Send"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio Bus, Drag and Drop to rearrange."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bypass"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bus options"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Master bus can't be deleted!"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Duplicate Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save Audio Bus Layout As..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Location for New Layout..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Open Audio Bus Layout"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "There is no '%s' file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Layout"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Invalid file, not an audio bus layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add a new Audio Bus to this layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load an existing Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save As"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save this Bus Layout to a file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/import_dock.cpp
+msgid "Load Default"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load the default Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Create a new Bus Layout."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Must not collide with an existing engine class name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Must not collide with an existing built-in type name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Must not collide with an existing global constant name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Keyword cannot be used as an autoload name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
+msgid "Name"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Storing local changes..."
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating scene..."
+msgstr ""
+
+#: editor/editor_data.cpp editor/editor_properties.cpp
+msgid "[empty]"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "[unsaved]"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Please select a base directory first."
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp editor/project_manager.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Name:"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "No export template found at the expected path:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid ""
+"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
+"Etc' in Project Settings."
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid ""
+"Target platform requires 'ETC2' texture compression for GLES3. Enable "
+"'Import Etc 2' in Project Settings."
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid ""
+"Target platform requires 'ETC' texture compression for the driver fallback "
+"to GLES2.\n"
+"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
+"Enabled'."
+msgstr ""
+
+#: editor/editor_export.cpp platform/android/export/export.cpp
+#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
+#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
+msgid "Custom debug template not found."
+msgstr ""
+
+#: editor/editor_export.cpp platform/android/export/export.cpp
+#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
+#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
+msgid "Custom release template not found."
+msgstr ""
+
+#: editor/editor_export.cpp platform/javascript/export/export.cpp
+msgid "Template file not found:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "3D Editor"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Script Editor"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Asset Library"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Scene Tree Editing"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Node Dock"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "FileSystem and Import Docks"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Erase profile '%s'? (no undo)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Profile must be a valid filename and must not contain '.'"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Profile with this name already exists."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "(Editor Disabled, Properties Disabled)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "(Properties Disabled)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "(Editor Disabled)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Class Options:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Enable Contextual Editor"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Enabled Properties:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Enabled Features:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Enabled Classes:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "File '%s' format is invalid, import aborted."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid ""
+"Profile '%s' already exists. Remove it first before importing, import "
+"aborted."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Error saving profile to path: '%s'."
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Unset"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Current Profile:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Make Current"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp editor/editor_node.cpp
+#: editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Available Profiles:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Class Options"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "New profile name:"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Erase Profile"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Profile(s)"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Export Profile"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Manage Editor Feature Profiles"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select This Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Open in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/project_manager.cpp
+msgid "Show in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "New Folder..."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Save"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go to previous folder."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go to next folder."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Go to parent folder."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Refresh files."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "(Un)favorite current folder."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Toggle the visibility of hidden files."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "View items as a grid of thumbnails."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "View items as a list."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
+#: editor/plugins/style_box_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Preview:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid ""
+"There are multiple importers for different types pointing to file %s, import "
+"aborted"
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "(Re)Importing Assets"
+msgstr ""
+
+#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class:"
+msgstr ""
+
+#: editor/editor_help.cpp editor/scene_tree_editor.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Signals:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "enum "
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Online Tutorials:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There are currently no tutorials for this class, you can [color=$color][url="
+"$url]contribute one[/url][/color] or [color=$color][url=$url2]request one[/"
+"url][/color]."
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this property. Please help us by "
+"[color=$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this method. Please help us by [color="
+"$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set Multiple:"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Output:"
+msgstr ""
+
+#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
+msgid "Copy Selection"
+msgstr ""
+
+#: editor/editor_log.cpp editor/editor_profiler.cpp
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/property_editor.cpp editor/scene_tree_dock.cpp
+#: editor/script_editor_debugger.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Clear"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Clear Output"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project export failed with error code %d."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Imported resources can't be saved."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource can't be saved because it does not belong to the edited scene. "
+"Make it unique first."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save Resource As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Can't open '%s'. The file could have been moved or deleted."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while parsing '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unexpected end of file '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Missing '%s' or its dependencies."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while loading '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a tree root."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
+"be satisfied."
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was imported, so it's not editable.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was instanced or inherited.\n"
+"Changes to it won't be kept when saving the current scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource was imported, so it's not editable. Change its settings in the "
+"import panel and then re-import."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene was imported, so changes to it won't be kept.\n"
+"Instancing it or inheriting will allow making changes to it.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This is a remote object, so changes to it won't be kept.\n"
+"Please read the documentation relevant to debugging to better understand "
+"this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: editor/editor_node.cpp editor/filesystem_dock.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Script..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Close"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to '%s' before closing?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Saved %s modified resource(s)."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "A root node is required to save the scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "No"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a root node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a selected node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Run Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to the following scene(s) before quitting?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes the following scene(s) before opening Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This option is deprecated. Situations where refresh must be forced are now "
+"considered a bug. Please report."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Scene '%s' was automatically imported, so it can't be modified.\n"
+"To make changes to it, a new inherited scene can be created."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Clear Recent Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: editor/editor_node.cpp editor/import_dock.cpp
+#: editor/script_create_dialog.cpp
+msgid "Default"
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play This Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Close Other Tabs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Tabs to the Right"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close All Tabs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files or folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Dock Position"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle distraction-free mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Add a new scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Copy Text"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Filter Files..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save All Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Convert To..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "MeshLibrary..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "TileSet..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Undo"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Redo"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
+msgid "Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project Settings..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Orphan Resource Explorer..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
+msgid "Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Take Screenshot"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Screenshots are stored in the Editor Data/Settings Folder."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle System Console"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data/Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Manage Editor Features..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
+msgid "Help"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+msgid "Search"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Online Docs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Q&A"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Issue Tracker"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_profiler.cpp
+msgid "Stop"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Changing the video driver requires restarting the editor."
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_settings_editor.cpp
+#: editor/settings_config_dialog.cpp
+msgid "Save & Restart"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Spins when the editor window redraws."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update Continuously"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update When Changed"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Hide Update Spinner"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Expand Bottom Panel"
+msgstr ""
+
+#: editor/editor_node.cpp scene/resources/visual_shader.cpp
+msgid "Output"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Don't Save"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Android build template is missing, please install relevant templates."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Manage Templates"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This will install the Android project for custom builds.\n"
+"Note that, in order to use it, it needs to be enabled per export preset."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Android build template is already installed and it won't be overwritten.\n"
+"Remove the \"build\" directory manually before attempting this operation "
+"again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Password:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 2D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 3D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Script Editor"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "Open Asset Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the next Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the previous Editor"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Creating Mesh Previews"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Thumbnail..."
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit Plugin"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Update"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Version:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Author:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit:"
+msgstr ""
+
+#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
+#: editor/rename_dialog.cpp
+msgid "Start"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Physics Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Time"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Calls"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Edit Text:"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/script_create_dialog.cpp
+msgid "On"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Layer"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Bit %d, value %d"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "[Empty]"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Pick a Viewport"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New %s"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Make Unique"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Paste"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Convert To %s"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Open Editor"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Selected node is not a Viewport!"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Size: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Page: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Key:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Value:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Add Key/Value Pair"
+msgstr ""
+
+#: editor/editor_run_native.cpp
+msgid ""
+"No runnable export preset found for this platform.\n"
+"Please add a runnable preset in the export menu."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Redownload"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Uninstall"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Installed)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Missing)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Current)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Retrieving mirrors, please wait..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove template version '%s'?"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Invalid version.txt format inside templates: %s."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "No version.txt found inside templates."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error creating path for templates:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Extracting Export Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Importing:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"No download links found for this version. Direct download is only available "
+"for official releases."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Request Failed."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Redirect Loop."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Complete."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error requesting URL:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connecting to Mirror..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Disconnected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Resolving"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Resolve"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connecting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Connect"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Requesting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Downloading"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connection Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "SSL Handshake Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Uncompressing Android Build Sources"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Current Version:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Installed Versions:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Install From File"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove Template"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select Template File"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Export Template Manager"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select mirror from list: (Shift+Click: Open in Browser)"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Status: Import of file failed. Please fix file and reimport manually."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move/rename resources root."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move a folder into itself."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error moving:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error duplicating:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Unable to update dependencies:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Provided name contains invalid characters."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "A file or folder with this name already exists."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Inherited Scene"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Open Scenes"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Add to Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Edit Dependencies..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View Owners..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicate..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "New Script..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Resource..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/project_manager.cpp editor/rename_dialog.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Rename"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Previous Folder/File"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Next Folder/File"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Toggle Split Mode"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Search files"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid ""
+"Scanning Files,\n"
+"Please Wait..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "There is already file or folder with the same name in this location."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Overwrite"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Create Scene"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Find in Files"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Folder:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Filters:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid ""
+"Include the files with the following extensions. Add or remove them in "
+"ProjectSettings."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
+msgid "Replace..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
+msgid "Cancel"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace all (no undo)"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Searching..."
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Search complete"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Group name already exists."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Invalid group name."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Delete Group"
+msgstr ""
+
+#: editor/groups_editor.cpp editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes Not in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Filter nodes"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Empty groups will be automatically removed."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Group Editor"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Manage Groups"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Single Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Importing Scene..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating Lightmaps"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating for Mesh: "
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Running Custom Script..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Saving..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Set as Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Clear Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid " Files"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Import As:"
+msgstr ""
+
+#: editor/import_dock.cpp editor/property_editor.cpp
+msgid "Preset..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Reimport"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Save scenes, re-import and restart"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Changing the type of an imported file requires editor restart."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid ""
+"WARNING: Assets exist that use this resource, they may stop loading properly."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Expand All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Collapse All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save As..."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Edit Resource Clipboard"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Object properties."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Filter properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Changes may be lost!"
+msgstr ""
+
+#: editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: editor/node_dock.cpp
+msgid "Select a single node to edit its signals and groups."
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Edit a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Create a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Plugin Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Subfolder:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Language:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Script Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Activate now?"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid ""
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Insert Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon (Remove Point)"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Remove Polygon And Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Load..."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Move Node Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Change BlendSpace1D Limits"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Change BlendSpace1D Labels"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "This type of node can't be used. Only root nodes are allowed."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Add Node Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Add Animation Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Remove BlendSpace1D Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Move BlendSpace1D Node Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"AnimationTree is inactive.\n"
+"Activate to enable playback, check node warnings if activation fails."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Set the blending position within the space"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Select and move points, create points with RMB."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Open Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Triangle already exists."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Add Triangle"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Change BlendSpace2D Limits"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Change BlendSpace2D Labels"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Remove BlendSpace2D Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Remove BlendSpace2D Triangle"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "BlendSpace2D does not belong to an AnimationTree node."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "No triangles exist, so no blending can take place."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Toggle Auto Triangles"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create triangles by connecting points."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Erase points and triangles."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Generate blend triangles automatically (instead of manually)"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Parameter Changed"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Filters"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Output node can't be added to the blend tree."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Add Node to BlendTree"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Node Moved"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Unable to connect, port may be in use or connection may be invalid."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Nodes Connected"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Nodes Disconnected"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Set Animation"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Delete Node"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Toggle Filter On/Off"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Change Filter"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "No animation player set, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Player path set is invalid, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid ""
+"Animation player has no valid root node path, so unable to retrieve track "
+"names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Node Renamed"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Node..."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Edit Filtered Tracks:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Enable Filtering"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Delete Animation?"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Invalid animation name!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation name already exists!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to copy!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation resource on clipboard!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to edit!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Transitions..."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Open in Inspector"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Enable Onion Skinning"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Onion Skinning Options"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Directions"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Past"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Future"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Depth"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "1 step"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "2 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "3 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Differences Only"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Force White Modulate"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Include Gizmos (3D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pin AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Move Node"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Add Transition"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Immediate"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Sync"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "At End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Travel"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Start and end nodes are needed for a sub-transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "No playback resource set at path: %s."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Node Removed"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition Removed"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Set Start Node (Autoplay)"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"Select and move nodes.\n"
+"RMB to add new nodes.\n"
+"Shift+LMB to create connections."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Create new nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Connect nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Remove selected node or transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Toggle autoplay this animation on start, restart or seek to zero."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Set the end animation. This is useful for sub-transitions."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition: "
+msgstr ""
+
+#: editor/plugins/animation_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "AnimationTree"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Import Animations..."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Filters..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Contents:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "View Files"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connection error, please try again."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect to host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response from host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, return code:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, too many redirects"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Bad download hash, assuming file has been tampered with."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Expected:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Got:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed sha256 hash check"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Asset Download Error:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading (%s / %s)..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Resolving..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Error making request"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Idle"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Install..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Retry"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download Error"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download for this asset is already in progress!"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "First"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Previous"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Next"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Last"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+msgid "Sort:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Reverse sorting."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Category:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Support"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"Can't determine a save path for lightmap images.\n"
+"Save your scene (for images to be saved in the same dir), or pick a save "
+"path from the BakedLightmap properties."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
+"Light' flag is on."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Failed creating lightmap images, make sure path is writable."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Bake Lightmaps"
+msgstr ""
+
+#: editor/plugins/camera_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Preview"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Vertical Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Vertical Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove Vertical Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Horizontal Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Horizontal Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove Horizontal Guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Horizontal and Vertical Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move pivot"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Resize CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Children of containers have their anchors and margins values overridden by "
+"their parent."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Presets for the anchors and margins values of a Control node."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"When active, moving Control nodes changes their anchors instead of their "
+"margins."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchors only"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors and Margins"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock Selected"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Unlock Selected"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Group Selected"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Ungroup Selected"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Custom Bone(s) from Node(s)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Toggle snapping."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snapping Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Smart Snapping"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Parent"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Node Anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Node Sides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Node Center"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Other Nodes"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Custom Bone(s) from Node(s)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Custom Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Helpers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Rulers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Origin"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Viewport"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Preview Canvas Scale"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Translation mask for inserting keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation mask for inserting keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale mask for inserting keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert keys (based on mask)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Auto insert keys when objects are translated, rotated on scaled (based on "
+"mask).\n"
+"Keys are only added to existing tracks, no new tracks will be created.\n"
+"Keys must be inserted manually for the first time."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Auto Insert Key"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Multiply grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Divide grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan View"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Cannot instantiate multiple nodes without root."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Default Type"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Polygon3D"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Restart"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Particles"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Mask"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Capture from Pixel"
+msgstr ""
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Colors"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+msgid "CPUParticles"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Mesh"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Node"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat 0"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat 1"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Smoothstep"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load Curve Preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Add Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Left Linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Right Linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load Preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Toggle Curve Linear Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Hold Shift to edit tangents individually"
+msgstr ""
+
+#: editor/plugins/gi_probe_editor_plugin.cpp
+msgid "Bake GI Probe"
+msgstr ""
+
+#: editor/plugins/gradient_editor_plugin.cpp
+msgid "Gradient Edited"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Failed creating shapes!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape(s)"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Contained Mesh is not of type ArrayMesh."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "UV Unwrap failed, mesh may not be manifold?"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "No mesh to debug."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Model has no UV in this layer"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling(s)"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh..."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV1"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV2"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Unwrap UV2 for Lightmap/AO"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generating Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generate Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Can only set point into a ParticlesMaterial process material"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generation Time (sec):"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry doesn't contain any faces."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Points:"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points+Normal (Directed)"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Source: "
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "A processor material of type 'ParticlesMaterial' is required."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generating AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate Visibility AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Out-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove In-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Angles"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Lengths"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Out-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove In-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/physical_bone_plugin.cpp
+msgid "Move Joint"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"Polygon 2D has internal vertices, so it can no longer be edited in the "
+"viewport."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon & UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Add Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygons"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create a custom polygon. Enables custom polygon rendering."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Unpaint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Radius:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Settings"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Configure Grid:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones to Polygon"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Type:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ResourcePreloader"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "AnimationTree has no path set to an AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Path to AnimationPlayer is invalid"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Files"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close and save changes?"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error writing TextFile:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Could not load file at:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving file!"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Importing"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "New Text File..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save File As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "%s Class Reference"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Filter scripts"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle alphabetical sorting of the method list."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Filter methods"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Sort"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Up"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Down"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Copy Script Path"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Previous"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle Scripts Panel"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Debug with External Editor"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open Godot online documentation."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Request Docs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Help improve the Godot documentation by giving feedback."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Discard"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Results"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Connections to method:"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Source"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Signal"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Target"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid ""
+"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "(ignore)"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Only resources from filesystem can be dropped."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Lookup Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Convert Case"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Uppercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Lowercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Capitalize"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Syntax Highlighter"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+msgid "Go To"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+msgid "Bookmarks"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Cut"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Delete Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold/Unfold Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Unfold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Evaluate Selection"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Spaces"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Tabs"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find in Files..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Bookmark"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Bookmark"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Bookmark"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Line..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr ""
+
+#: editor/plugins/shader_editor_plugin.cpp
+msgid ""
+"This shader has been modified on on disk.\n"
+"What action should be taken?"
+msgstr ""
+
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Shader"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "This skeleton has no bones, create some children Bone2D nodes."
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Create Rest Pose from Bones"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Set Rest Pose to Bones"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Skeleton2D"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Make Rest Pose (From Bones)"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Set Bones to Rest Pose"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical bones"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_ik_editor_plugin.cpp
+msgid "Play IK"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translating: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Objects Drawn"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Material Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Shader Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Surface Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Draw Calls"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Vertices"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Transform with View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Rotation with View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock View Rotation"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Unshaded"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Environment"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Information"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View FPS"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Half Resolution"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Enable Doppler"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Cinematic Preview"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Forward"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Backwards"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Up"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Down"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Speed Modifier"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Note: The FPS value displayed is the editor's framerate.\n"
+"It cannot be used as a reliable indication of in-game performance."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Nodes To Floor"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Drag: Rotate\n"
+"Alt+Drag: Move\n"
+"Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Local Space"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Toggle Freelook"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Object to Floor"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog..."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Settings..."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Nameless gizmo"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create Mesh2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create Polygon2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create CollisionPolygon2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create LightOccluder2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite is empty!"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Can't convert a sprite using animation frames to mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't replace by mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Convert to Mesh2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't create polygon."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Convert to Polygon2D"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't create collision polygon."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create CollisionPolygon2D Sibling"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't create light occluder."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create LightOccluder2D Sibling"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Simplification: "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Grow (Pixels): "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Update Preview"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Settings:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "No Frames Selected"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add %d Frame(s)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "New Animation"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add a Texture from File"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frames from a Sprite Sheet"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Select Frames"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Horizontal:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Vertical:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Select/Clear All Frames"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Create Frames from Sprite Sheet"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "SpriteFrames"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Region Rect"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Sep.:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "TextureRegion"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
+msgid "Remove All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Edit Theme"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme editing menu."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create From Current Editor Theme"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Toggle Button"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Disabled Button"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Disabled Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Named Sep."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Submenu"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Subitem 1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Subitem 2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Disabled LineEdit"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Editable Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Subtree"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has,Many,Options"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Style"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Fix Invalid Tiles"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Line Draw"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rectangle Paint"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket Fill"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Disable Autotile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Enable Priority"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid ""
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate Left"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate Right"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip Horizontally"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip Vertically"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear Transform"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Texture(s) to TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected Texture from TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Next Coordinate"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Select the next shape, subtile, or Tile."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Previous Coordinate"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Select the previous shape, subtile, or Tile."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Region Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Collision Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Occlusion Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Navigation Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Bitmask Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Priority Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Icon Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Z Index Mode"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new rectangle."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "You haven't selected a texture to remove."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Texture"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Drag handles to edit Rect.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select current edited sub-tile.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Shift+LMB: Set wildcard bit.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to use as icon, this will be also used on invalid autotile "
+"bindings.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its priority.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Make Polygon Concave"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Make Polygon Convex"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "This property can't be changed."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "TileSet"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add input +"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add output +"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Boolean"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add input port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add output port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change input port type"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change output port type"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change input port name"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change output port name"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Remove input port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Remove output port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Set expression"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Resize VisualShader node"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Set Uniform Name"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Set Input Default Port"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Node to Visual Shader"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Duplicate Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Delete Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Visual Shader Input Type Changed"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vertex"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Fragment"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Light"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Create Shader Node"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Grayscale function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts HSV vector to RGB equivalent."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts RGB vector to HSV equivalent."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Sepia function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Burn operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Darken operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Difference operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Dodge operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "HardLight operator"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Lighten operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Overlay operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Screen operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "SoftLight operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the boolean result of the %s comparison between two parameters."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Equal (==)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Greater Than (>)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Greater Than or Equal (>=)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns an associated vector if the provided scalars are equal, greater or "
+"less."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the boolean result of the comparison between INF and a scalar "
+"parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the boolean result of the comparison between NaN and a scalar "
+"parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Less Than (<)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Less Than or Equal (<=)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Not Equal (!=)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns an associated vector if the provided boolean value is true or false."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the boolean result of the comparison between two parameters."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the boolean result of the comparison between INF (or NaN) and a "
+"scalar parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Boolean constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Boolean uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for all shader modes."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Input parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for vertex and fragment shader modes."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for fragment and light shader modes."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for fragment shader mode."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for light shader mode."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for vertex shader mode."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for vertex and fragment shader mode."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "E constant (2.718282). Represents the base of the natural logarithm."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Epsilon constant (0.00001). Smallest possible scalar number."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Phi constant (1.618034). Golden ratio."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Pi/4 constant (0.785398) or 45 degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Pi/2 constant (1.570796) or 90 degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Pi constant (3.141593) or 180 degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Tau constant (6.283185) or 360 degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Sqrt2 constant (1.414214). Square root of 2."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the absolute value of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-cosine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse hyperbolic cosine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-sine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse hyperbolic sine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-tangent of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-tangent of the parameters."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse hyperbolic tangent of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Finds the nearest integer that is greater than or equal to the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Constrains a value to lie between two further values."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the cosine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the hyperbolic cosine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts a quantity in radians to degrees."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Base-e Exponential."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Base-2 Exponential."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the nearest integer less than or equal to the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Computes the fractional part of the argument."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse of the square root of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Natural logarithm."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Base-2 logarithm."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the greater of two values."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the lesser of two values."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two scalars."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the opposite value of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 - scalar"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the value of the first parameter raised to the power of the second."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts a quantity in degrees to radians."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 / scalar"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the nearest integer to the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the nearest even integer to the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Clamps the value between 0.0 and 1.0."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Extracts the sign of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the sine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the hyperbolic sine of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the square root of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
+"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
+"using Hermite polynomials."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Step function( scalar(edge), scalar(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the tangent of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the hyperbolic tangent of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the truncated value of the parameter."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Adds scalar to scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Divides scalar by scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies scalar by scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the remainder of the two scalars."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Subtracts scalar from scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Perform the cubic texture lookup."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Perform the texture lookup."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Cubic texture uniform lookup."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "2D texture uniform lookup."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "2D texture uniform lookup with triplanar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Calculate the outer product of a pair of vectors.\n"
+"\n"
+"OuterProduct treats the first parameter 'c' as a column vector (matrix with "
+"one column) and the second parameter 'r' as a row vector (matrix with one "
+"row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix "
+"whose number of rows is the number of components in 'c' and whose number of "
+"columns is the number of components in 'r'."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Composes transform from four vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Decomposes transform to four vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the determinant of a transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the inverse of a transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the transpose of a transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies transform by transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies vector by transform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector operator."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Composes vector from three scalars."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Decomposes vector to three scalars."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the cross product of two vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the distance between two points."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the dot product of two vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the vector that points in the same direction as a reference vector. "
+"The function has three vector parameters : N, the vector to orient, I, the "
+"incident vector, and Nref, the reference vector. If the dot product of I and "
+"Nref is smaller than zero the return value is N. Otherwise -N is returned."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the length of a vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the normalize product of vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 - vector"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 / vector"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the vector that points in the direction of reflection ( a : incident "
+"vector, b : normal vector )."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the vector that points in the direction of refraction."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
+"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
+"using Hermite polynomials."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
+"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
+"using Hermite polynomials."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Step function( vector(edge), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Step function( scalar(edge), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Adds vector to vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Divides vector by vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies vector by vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the remainder of the two vectors."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Subtracts vector from vector."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector constant."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector uniform."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, with custom amount of input and "
+"output ports. This is a direct injection of code into the vertex/fragment/"
+"light function, do not use it to write the function declarations inside."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns falloff based on the dot product of surface normal and view "
+"direction of camera (pass associated inputs to it)."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(Fragment/Light mode only) Scalar derivative function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(Fragment/Light mode only) Vector derivative function."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
+"differencing."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
+"differencing."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
+"differencing."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
+"differencing."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
+"'y'."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
+"'y'."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "VisualShader"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Edit Visual Property"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Visual Shader Mode Changed"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Runnable"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete patch '%s' from list?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete preset '%s'?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Failed to export the project for platform '%s'.\n"
+"Export templates seem to be missing or invalid."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Failed to export the project for platform '%s'.\n"
+"This might be due to a configuration issue in the export preset or your "
+"export settings."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "The given export path doesn't exist:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing/corrupted:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Presets"
+msgstr ""
+
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+msgid "Add..."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export all resources in the project"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected scenes (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected resources (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources to export:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Patches"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Make Patch"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Features"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Custom (comma-separated):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Feature List:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export With Debug"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The path does not exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose an empty folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose a 'project.godot' or '.zip' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Directory already contains a Godot project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid Project Name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "There is already a folder in this path with the specified name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "It would be a good idea to name your project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Couldn't load project.godot in project path (error %d). It may be missing or "
+"corrupted."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't edit project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Rename Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Installation Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Renderer:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "OpenGL ES 3.0"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Higher visual quality\n"
+"All features available\n"
+"Incompatible with older hardware\n"
+"Not recommended for web games"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "OpenGL ES 2.0"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Lower visual quality\n"
+"Some features not available\n"
+"Works on most hardware\n"
+"Recommended for web games"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Renderer can be changed later, but scenes may need to be adjusted."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't open project at '%s'."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file does not specify the version of Godot "
+"through which it was created.\n"
+"\n"
+"%s\n"
+"\n"
+"If you proceed with opening it, it will be converted to Godot's current "
+"configuration file format.\n"
+"Warning: You won't be able to open the project with previous versions of the "
+"engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You won't be able to open the project with previous versions of the "
+"engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: no main scene defined.\n"
+"Please edit the project and set the main scene in the Project Settings under "
+"the \"Application\" category."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: Assets need to be imported.\n"
+"Please edit the project to trigger the initial import."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to run %d projects at once?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Remove %d projects from the list?\n"
+"The project folders' contents won't be modified."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Remove this project from the list?\n"
+"The project folder's contents won't be modified."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Language changed.\n"
+"The interface will update after restarting the editor or project manager."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Are you sure to scan %s folders for existing Godot projects?\n"
+"This could take a while."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Projects"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Remove Missing"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Templates"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Restart Now"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't run project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"You currently don't have any projects.\n"
+"Would you like to explore official example projects in the Asset Library?"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Key "
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "An action with the name '%s' already exists."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Action deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "All Devices"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Press a Key..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 1"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 2"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Axis Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Global Property"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Select a setting item first!"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "No property '%s' exists."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Setting '%s' is internal, and it can't be deleted."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Delete Item"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override for Feature"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter Mode"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Project Settings (project.godot)"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override For..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "The editor must be restarted for changes to take effect."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Input Map"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Localization"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resources:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locale"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show All Locales"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show Selected Locales Only"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Filter mode:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "File..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Dir..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Select Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Pick a Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Virtual Method"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Batch Rename"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Prefix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Advanced Options"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Substitute"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node's parent name, if available"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node type"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Current scene name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Root node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Sequential integer counter.\n"
+"Compare counter options."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Per Level counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "If set the counter restarts for each group of child nodes"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Initial value for the counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Step"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Amount by which counter is incremented for each node"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Padding"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Minimum number of digits for the counter.\n"
+"Missing digits are padded with leading zeros."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Regular Expressions"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Post-Process"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Keep"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "CamelCase to under_scored"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "under_scored to CamelCase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Case"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Lowercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Uppercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Reset"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Error"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Node must belong to the edited scene to become root."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instantiated scenes can't become root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make node as Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can not perform with the root node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Save New Scene As..."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "New Scene Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Create Root Node:"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "2D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "3D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "User Interface"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Other Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Sub-Resources"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Open Documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Expand/Collapse All"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Extend Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Reparent to New Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Scene Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+msgid "Copy Node Path"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remote"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visible"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Unlock Node"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Button Group"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "(Connecting From)"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node configuration warning:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has %s connection(s) and %s group(s).\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has %s connection(s).\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is in %s group(s).\n"
+"Click to show groups dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Open Script:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is locked.\n"
+"Click to unlock it."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Children are not selectable.\n"
+"Click to make selectable."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visibility"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"AnimationPlayer is pinned.\n"
+"Click to unpin."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node Configuration Warning!"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is empty."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Filename is empty."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is not local."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid base path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "A directory with the same name exists."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid extension."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Wrong extension chosen."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading template '%s'"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error - Could not create script in filesystem."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Open Script / Choose Location"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Open Script"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "File exists, it will be reused."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid class name."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid inherited parent name or path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Script is valid."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Allowed: a-z, A-Z, 0-9, _ and ."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in script (into scene file)."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Will create a new script file."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Will load an existing script file."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Inherits"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Class Name"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Template"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in Script"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Remote "
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Trace"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Pick one or more items from the list to display the graph."
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Copy Error"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Export measures as CSV"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Erase Shortcut"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Restore Shortcut"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Change Shortcut"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Binding"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change AudioStreamPlayer3D Emission Angle"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Particles AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Height"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Inner Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Outer Radius"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select the dynamic library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select dependencies of the library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Remove current entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Double click to create a new entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform:"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dynamic Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Add an architecture entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "GDNativeLibrary"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Enabled GDNative Singleton"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Disabled GDNative Singleton"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Status"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Libraries: "
+msgstr ""
+
+#: modules/gdnative/register_types.cpp
+msgid "GDNative"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Object can't provide a length."
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Plane:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Floor:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Delete Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Paste Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Paint"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Grid Map"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Snap View"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Disabled"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Above"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Below"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit X Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Y Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Z Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Clear Rotation"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clear Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Settings"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Pick Distance:"
+msgstr ""
+
+#: modules/mono/csharp_script.cpp
+msgid "Class name can't be a reserved keyword"
+msgstr ""
+
+#: modules/mono/mono_gd/gd_mono_utils.cpp
+msgid "End of inner exception stack trace"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Bake NavMesh"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Clear the navigation mesh."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Setting up Configuration..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Calculating grid size..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Marking walkable triangles..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Constructing compact heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Eroding walkable area..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Partitioning..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating contours..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating polymesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Converting to native navigation mesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Navigation Mesh Generator Setup:"
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Parsing Geometry..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Done!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Signal Arguments"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument name"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Default Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Duplicate VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Base Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Move Node(s)"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Data"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Script already has function '%s'"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Input Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Resize Comment"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Can't copy the function node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Clipboard is empty!"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit its graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Member"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search VisualScript"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Get %s"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Set %s"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Package name is missing."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Package segments must be of non-zero length."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "The character '%s' is not allowed in Android application package names."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "A digit cannot be the first character in a package segment."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "The character '%s' cannot be the first character in a package segment."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "The package must have at least one '.' separator."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "ADB executable not configured in the Editor Settings."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "OpenJDK jarsigner not configured in the Editor Settings."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Debug keystore not configured in the Editor Settings nor in the preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Custom build requires a valid Android SDK path in Editor Settings."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Invalid Android SDK path for custom build in Editor Settings."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"Android project is not installed for compiling. Install from Editor menu."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Invalid public key for APK expansion."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Invalid package name:"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"Trying to build from a custom built template, but no version info for it "
+"exists. Please reinstall from the 'Project' menu."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"Android build version mismatch:\n"
+" Template installed: %s\n"
+" Godot Version: %s\n"
+"Please reinstall Android build template from 'Project' menu."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "Building Android Project (gradle)"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"Building of Android project failed, check output for the error.\n"
+"Alternatively visit docs.godotengine.org for Android build documentation."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "No build apk generated at: "
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "Identifier is missing."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "Identifier segments must be of non-zero length."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "The character '%s' is not allowed in Identifier."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "A digit cannot be the first character in a Identifier segment."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid ""
+"The character '%s' cannot be the first character in a Identifier segment."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "The Identifier must have at least one '.' separator."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "App Store Team ID not specified - cannot configure the project."
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "Invalid Identifier:"
+msgstr ""
+
+#: platform/iphone/export/export.cpp
+msgid "Required icon is not specified in the preset."
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run in Browser"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run exported HTML in the system's default browser."
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not write file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not open template for export:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Invalid export template:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read custom HTML shell:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read boot splash image file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Using default boot splash image."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid package unique name."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the \"Frames\" property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_object_2d.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
+"define its shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the \"Texture\" "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid ""
+"GPU-based particles are not supported by the GLES2 video driver.\n"
+"Use the CPUParticles2D node instead. You can use the \"Convert to "
+"CPUParticles\" option for this purpose."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
+msgid ""
+"A material to process the particles is not assigned, so no behavior is "
+"imprinted."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/physics_body_2d.cpp
+msgid ""
+"Size changes to RigidBody2D (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "This Bone2D chain should end at a Skeleton2D node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid ""
+"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
+msgstr ""
+
+#: scene/2d/tile_map.cpp
+msgid ""
+"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes "
+"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
+"KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnabler2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRCamera must have an ARVROrigin node as its parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRController must have an ARVROrigin node as its parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The controller ID must not be 0 or this controller won't be bound to an "
+"actual controller."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRAnchor must have an ARVROrigin node as its parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The anchor ID must not be 0 or this anchor won't be bound to an actual "
+"anchor."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVROrigin requires an ARVRCamera child node."
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "%d%%"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "(Time Left: %d:%02d s)"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Meshes: "
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Lights:"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
+msgid "Finishing Plot"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Lighting Meshes: "
+msgstr ""
+
+#: scene/3d/collision_object.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape or CollisionPolygon as a child to define "
+"its shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"Plane shapes don't work well and will be removed in future versions. Please "
+"don't use them."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial whose "
+"Billboard Mode is set to \"Particle Billboard\"."
+msgstr ""
+
+#: scene/3d/gi_probe.cpp
+msgid "Plotting Meshes"
+msgstr ""
+
+#: scene/3d/gi_probe.cpp
+msgid ""
+"GIProbes are not supported by the GLES2 video driver.\n"
+"Use a BakedLightmap instead."
+msgstr ""
+
+#: scene/3d/light.cpp
+msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"GPU-based particles are not supported by the GLES2 video driver.\n"
+"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles"
+"\" option for this purpose."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Nothing is visible because meshes have not been assigned to draw passes."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial whose Billboard "
+"Mode is set to \"Particle Billboard\"."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
+"parent Path's Curve resource."
+msgstr ""
+
+#: scene/3d/physics_body.cpp
+msgid ""
+"Size changes to RigidBody (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid ""
+"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
+"derived node to work."
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid "This body will be ignored until you set a mesh."
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid ""
+"Size changes to SoftBody will be overridden by the physics engine when "
+"running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the \"Frames\" property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/3d/vehicle_body.cpp
+msgid ""
+"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
+"it as a child of a VehicleBody."
+msgstr ""
+
+#: scene/3d/world_environment.cpp
+msgid ""
+"WorldEnvironment requires its \"Environment\" property to contain an "
+"Environment to have a visible effect."
+msgstr ""
+
+#: scene/3d/world_environment.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/world_environment.cpp
+msgid ""
+"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
+"this environment's Background Mode to Canvas (for 2D scenes)."
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "On BlendTree node '%s', animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "Animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "In node '%s', invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Nothing connected to input '%s' of node '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "No root AnimationNode for the graph is set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path to an AnimationPlayer node containing animations is not set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "The AnimationPlayer root node is not a valid node."
+msgstr ""
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Pick a color from the screen."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "HSV"
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Raw"
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Switch between hexadecimal and code values."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Add current color as a preset."
+msgstr ""
+
+#: scene/gui/container.cpp
+msgid ""
+"Container by itself serves no purpose unless a script configures its "
+"children placement behavior.\n"
+"If you don't intend to add a script, use a plain Control node instead."
+msgstr ""
+
+#: scene/gui/control.cpp
+msgid ""
+"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
+"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine, but they will hide upon "
+"running."
+msgstr ""
+
+#: scene/gui/range.cpp
+msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
+msgstr ""
+
+#: scene/gui/scroll_container.cpp
+msgid ""
+"ScrollContainer is intended to work with a single child control.\n"
+"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
+"minimum size manually."
+msgstr ""
+
+#: scene/gui/tree.cpp
+msgid "(Other)"
+msgstr ""
+
+#: scene/main/scene_tree.cpp
+msgid ""
+"Default Environment as specified in Project Settings (Rendering -> "
+"Environment -> Default Environment) could not be loaded."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/visual_shader.cpp
+msgid "Input"
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid source for preview."
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid source for shader."
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid comparison function for that type."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to function."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to uniform."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Varyings can only be assigned in vertex function."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Constants cannot be modified."
+msgstr ""
diff --git a/editor/translations/pl.po b/editor/translations/pl.po
index 61af6ef9b8..df28369163 100644
--- a/editor/translations/pl.po
+++ b/editor/translations/pl.po
@@ -39,7 +39,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-29 19:20+0000\n"
+"PO-Revision-Date: 2019-08-29 13:35+0000\n"
"Last-Translator: Tomek <kobewi4e@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/"
"godot/pl/>\n"
@@ -49,7 +49,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -93,7 +93,6 @@ msgid "On call to '%s':"
msgstr "Przy wywołaniu \"%s\":"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Wolny"
@@ -162,29 +161,24 @@ msgid "Anim Change Call"
msgstr "Animacja - wywołanie funkcji"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Zmiana czasu klatki kluczowej"
+msgstr "Zmień czas wielu klatek animacji"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Zmiana przejścia"
+msgstr "Zmień przejście wielu klatek animacji"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Zmiana transformacji"
+msgstr "Zmień transformację wielu klatek animacji"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Zmiana wartości klatki kluczowej"
+msgstr "Zmień wartość wielu klatek animacji"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "Animacja - wywołanie funkcji"
+msgstr "Zmień wywołanie wielu klatek animacji"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -534,7 +528,7 @@ msgstr "sekund"
#: editor/animation_track_editor.cpp
msgid "FPS"
-msgstr "Klatki na sekundÄ™"
+msgstr "klatek na sekundÄ™"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -687,16 +681,18 @@ msgid "Line Number:"
msgstr "Numer linii:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "Znaleziono %d dopasowań."
+msgid "Replaced %d occurrence(s)."
+msgstr "Zastąpiono %d wystąpień."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Nie znaleziono"
+#, fuzzy
+msgid "%d match."
+msgstr "Znaleziono %d dopasowań."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Zastąpiono %d wystąpień."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Znaleziono %d dopasowań."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -922,8 +918,7 @@ msgstr "Ulubione:"
msgid "Recent:"
msgstr "Ostatnie:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1023,7 +1018,7 @@ msgstr ""
"Usuwany plik jest wymagany przez inne zasoby do działania.\n"
"Usunąć mimo to? (Nie można tego cofnąć)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Nie można usunąć:"
@@ -1059,7 +1054,7 @@ msgstr "Permanentnie usuń %d obiekt(ów) (Nie można tego cofnąć)"
msgid "Show Dependencies"
msgstr "Pokaż zależności"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Eksplorator osieroconych zasobów"
@@ -1148,14 +1143,16 @@ msgid "License"
msgstr "Licencja"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Licencja zewnętrzna"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine opiera się na wielu niezależnych i otwartych bibliotekach stron "
@@ -1176,7 +1173,8 @@ msgid "Licenses"
msgstr "Licencje"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Błąd otwierania pliku pakietu (nie jest w formacie zip)."
#: editor/editor_asset_installer.cpp
@@ -1668,12 +1666,11 @@ msgid "New"
msgstr "Nowy"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importuj"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Eksportuj"
@@ -1810,30 +1807,26 @@ msgid "Move Favorite Down"
msgstr "Przesuń Ulubiony w dół"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Przejdź folder wyżej."
+msgstr "Przejdź do poprzedniego folderu."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Przejdź folder wyżej."
+msgstr "Przejdź do następnego folderu."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "Przejdź folder wyżej."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Przeszukaj pliki"
+msgstr "Odśwież pliki."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "Dodaj/usuń aktualny folder z ulubionych."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
msgstr "Przełącz widoczność ukrytych plików."
@@ -1964,7 +1957,7 @@ msgid ""
"url][/color]."
msgstr ""
"Obecnie nie ma żadnych samouczków dla tej klasy, możesz [color=$color][url="
-"$url]dodać jeden[/url][/color] lub [color=$color] [url=$url2]poprosić o "
+"$url]dodać jeden[/url][/color] lub [color=$color][url=$url2]poprosić o "
"jakiÅ›[/url][/color]."
#: editor/editor_help.cpp
@@ -2074,6 +2067,11 @@ msgstr "Wyczyść"
msgid "Clear Output"
msgstr "Wyczyść dane wyjściowe"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "Okno"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Eksport projektu nie powiódł się, kod błędu to %d."
@@ -2397,6 +2395,15 @@ msgid "Pick a Main Scene"
msgstr "Wybierz główną scenę"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Zamknij scenÄ™"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Zamknij scenÄ™"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Nie można włączyć dodatku: \"%s\" - parsowanie konfiguracji nie powiodło się."
@@ -2509,6 +2516,11 @@ msgstr "Odtwórz tę scenę"
msgid "Close Tab"
msgstr "Zamknij kartÄ™"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Zamknij kartÄ™"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Zamknij inne karty"
@@ -2593,6 +2605,10 @@ msgstr "Nowa scena dziedziczÄ…ca..."
msgid "Open Scene..."
msgstr "Otwórz scenę..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Ostatnio otwierane"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Zapisz scenÄ™"
@@ -2602,14 +2618,6 @@ msgid "Save All Scenes"
msgstr "Zapisz wszystkie sceny"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Zamknij scenÄ™"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Ostatnio otwierane"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Konwertuj na..."
@@ -2633,31 +2641,42 @@ msgstr "Ponów"
#: editor/editor_node.cpp
msgid "Revert Scene"
-msgstr "Resetuj scenÄ™"
+msgstr "Przywróć scenę"
#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Różne narzędzia dla scen lub projektu."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Projekt"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Ustawienia projektu"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Narzędzia"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr "Eksport..."
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Zainstaluj szablon eksportu dla Androida"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Otwórz folder danych projektu"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Narzędzia"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Zainstaluj szablon eksportu dla Androida"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Eksplorator osieroconych zasobów"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2752,12 +2771,13 @@ msgstr ""
"(działające instancje będą zrestartowane). Opcja ta działa szybciej z "
"użyciem sieciowych systemów plików."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Edytor"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Ustawienia edytora"
#: editor/editor_node.cpp
@@ -2793,14 +2813,16 @@ msgid "Open Editor Settings Folder"
msgstr "Otwórz folder ustawień edytora"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "Zarządzaj funkcjonalnościami edytora"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "ZarzÄ…dzaj szablonami eksportu"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Pomoc"
@@ -2808,12 +2830,13 @@ msgstr "Pomoc"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Szukaj"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Dokumentacja online"
@@ -3090,9 +3113,8 @@ msgid "Calls"
msgstr "Wywołania"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Edytuj motyw"
+msgstr "Edytuj tekst:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3266,7 +3288,8 @@ msgid "Import From Node:"
msgstr "Zaimportuj z węzła:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Pobierz ponownie"
#: editor/export_template_manager.cpp
@@ -3283,6 +3306,10 @@ msgid "Download"
msgstr "Pobierz"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Nie znaleziono)"
@@ -3346,12 +3373,10 @@ msgid "No response."
msgstr "Brak odpowiedzi."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Żądanie nie powiodło się."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Pętla przekierowań."
@@ -3365,15 +3390,22 @@ msgid "Download Complete."
msgstr "Pobieranie zakończone."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Nie mogę zapisać motywu do pliku:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Instalacja szablonów się nie udała. Problematyczne archiwa szablonów mogą "
"być znalezione w \"%s\"."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Błąd podczas żądania adresu url: "
#: editor/export_template_manager.cpp
@@ -3458,21 +3490,11 @@ msgstr "Pobierz szablony eksportu"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Wybierz serwer z listy: (Shift+Klik: Otwórz w przeglądarce)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Nie udało się otworzyć pliku file_type_cache.cch do zapisu, pamięć podręczna "
-"typu plików nie będzie zapisana!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Ulubione"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "Nie można przejść do \"%s\" - nie znaleziono w tym systemie plików!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Status: Importowanie pliku nie powiodło się. Proszę naprawić plik i ponownie "
@@ -3507,14 +3529,14 @@ msgid "Provided name contains invalid characters."
msgstr "Podana nazwa zawiera niedozwolone znaki."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Nazwa zawiera niedozwolone znaki."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Plik lub katalog o tej nazwie już istnieje."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Nazwa zawiera niedozwolone znaki."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Zmiana nazwy pliku:"
@@ -3570,6 +3592,11 @@ msgstr "Duplikuj..."
msgid "Move To..."
msgstr "PrzenieÅ› do..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Nowa scena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Nowy skrypt..."
@@ -3635,6 +3662,11 @@ msgstr "W tej lokalizacji istnieje już plik lub folder o podanej nazwie."
msgid "Overwrite"
msgstr "Nadpisz"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Utwórz ze sceny"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Utwórz Skrypt"
@@ -3697,6 +3729,14 @@ msgid "Search complete"
msgstr "Wyszukiwanie zakończone"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Dodaj do Grupy"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Usuń z Grupy"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Nazwa grupy już istnieje."
@@ -3704,12 +3744,23 @@ msgstr "Nazwa grupy już istnieje."
msgid "Invalid group name."
msgstr "Niewłaściwa nazwa grupy."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "ZarzÄ…dzaj grupami"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Usuń grupę obrazków"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupy"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Węzły nie w grupie"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3722,12 +3773,13 @@ msgid "Nodes in Group"
msgstr "Węzły w grupie"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Dodaj do Grupy"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Usuń z Grupy"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Edytor skryptów"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3937,7 +3989,8 @@ msgid "MultiNode Set"
msgstr "Zestaw wielowęzłowy"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Wybierz węzeł do edycji sygnałów i grup."
#: editor/plugin_config_dialog.cpp
@@ -4697,10 +4750,6 @@ msgid "View Files"
msgstr "Pokaż pliki"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Nie udało się odnaleźć hosta:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Błąd połączenia. Spróbuj ponownie."
@@ -4713,14 +4762,47 @@ msgid "No response from host:"
msgstr "Brak odpowiedzi hosta:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Nie udało się odnaleźć hosta:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Żądanie nie powiodło się, zwracany kod:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Żądanie nie powiodło się."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Nie mogę zapisać motywu do pliku:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Żądanie nieudane, zbyt dużo przekierowań"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Pętla przekierowań."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Żądanie nie powiodło się, zwracany kod:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Czas"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
"Zły hash pobranego pliku. Zakładamy, że ktoś przy nim majstrował, lub został "
@@ -4799,8 +4881,13 @@ msgid "All"
msgstr "Wszystko"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Importuj ponownie..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Wtyczki"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4821,7 +4908,8 @@ msgid "Site:"
msgstr "Źródło:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Wsparcie..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4833,6 +4921,11 @@ msgid "Testing"
msgstr "Testowanie"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Wczytaj..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Plik ZIP assetów"
@@ -4999,6 +5092,11 @@ msgid "Paste Pose"
msgstr "Wklej pozÄ™"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Wyczyść kości"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Utwórz własne kości z węzłów"
@@ -5029,6 +5127,7 @@ msgid "Zoom Reset"
msgstr "Zresetuj powiększenie"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Tryb zaznaczenia"
@@ -5051,14 +5150,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt + RMB: Głębokość listy"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Tryb przesuwania"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Tryb Rotacji"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Tryb skalowania"
@@ -5084,6 +5186,7 @@ msgid "Toggle snapping."
msgstr "Przełącz przyciąganie."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Użyj przyciągania"
@@ -5100,11 +5203,6 @@ msgid "Use Rotation Snap"
msgstr "Użyj kroków obrotu"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Konfiguruj przyciÄ…ganie..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Przyciągaj względnie"
@@ -5117,6 +5215,11 @@ msgid "Smart Snapping"
msgstr "Inteligentne przyciÄ…ganie"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Konfiguruj przyciÄ…ganie..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "PrzyciÄ…gaj do rodzica"
@@ -5331,16 +5434,6 @@ msgstr "Ustaw Uchwyt"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Błąd wczytywania obrazu:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Brak pikseli z przeźroczystością > 128 w obrazie..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Wczytaj maskÄ™ emisji"
@@ -5651,14 +5744,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Płaszczyzna jest niepoprawna (brak ścian)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "Rodzic nie ma stałych powierzchni do zapełnienia."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Nie można zmapować obszaru."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Wybierz siatkę źródłową:"
@@ -5742,20 +5827,27 @@ msgid "Generation Time (sec):"
msgstr "Czas generowania (sek):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Åšciana nie ma powierzchni!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Węzeł nie zawiera geometrii (ściany)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Brak ścian!"
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Węzeł nie zawiera geometrii."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Węzeł nie zawiera geometrii (ściany)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Węzeł nie zawiera geometrii."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6087,7 +6179,6 @@ msgid "Grid Settings"
msgstr "Ustawienia siatki"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "PrzyciÄ…gaj"
@@ -6193,12 +6284,9 @@ msgid "Error writing TextFile:"
msgstr "Błąd pisania pliku tekstowego:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Błąd: nie udało się wczytać pliku."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "Błąd nie udało się wczytać pliku."
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "Nie mogłem znaleźć tile:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6221,7 +6309,8 @@ msgid "Error Importing"
msgstr "Błąd importowania"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Nowy plik tekstowy..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6302,6 +6391,11 @@ msgid "Open..."
msgstr "Otwórz..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Otwórz skrypt"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Zapisz wszystko"
@@ -6339,13 +6433,13 @@ msgid "Save Theme"
msgstr "Zapisz motyw"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Zamknij pliki pomocy"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Zamknij wszystkie"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Zamknij pliki pomocy"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Uruchom"
@@ -6413,7 +6507,7 @@ msgid ""
"What action should be taken?:"
msgstr ""
"Następujące pliki są nowsze na dysku.\n"
-"Jakie działania należy podjąć?:"
+"Jakie działania powinny zostać podjęte?:"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
@@ -6433,6 +6527,11 @@ msgstr "Debugger"
msgid "Search Results"
msgstr "Wyniki wyszukiwania"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Wyczyść listę ostatnio otwieranych scen"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "Połączenia do metody:"
@@ -6501,6 +6600,7 @@ msgid "Syntax Highlighter"
msgstr "Podświetlacz składni"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr "Idź do"
@@ -6535,22 +6635,6 @@ msgid "Toggle Comment"
msgstr "Przełącz komentarz"
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr "Przełącz zakładkę"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "Przejdź do następnej zakładki"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr "Przejdź do poprzedniej zakładki"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "Usuń wszystkie zakładki"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Zwiń/rozwiń wiersz"
@@ -6571,6 +6655,11 @@ msgid "Complete Symbol"
msgstr "Uzupełnij symbol"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Skaluj zaznaczone"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Przytnij końcowe spacje"
@@ -6587,29 +6676,32 @@ msgid "Auto Indent"
msgstr "Automatyczne wcięcie"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Przełącz punkt wstrzymania"
+msgid "Find Previous"
+msgstr "Znajdź poprzedni"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Usuń wszystkie punkty wstrzymania"
+msgid "Find in Files..."
+msgstr "Znajdź w plikach..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Przejdź do następnego punktu wstrzymania"
+msgid "Contextual Help"
+msgstr "Pomoc kontekstowa"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Przejdź do poprzedniego punktu wstrzymania"
+msgid "Toggle Bookmark"
+msgstr "Przełącz zakładkę"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Znajdź poprzedni"
+msgid "Go to Next Bookmark"
+msgstr "Przejdź do następnej zakładki"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Znajdź w plikach..."
+msgid "Go to Previous Bookmark"
+msgstr "Przejdź do poprzedniej zakładki"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Usuń wszystkie zakładki"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6620,8 +6712,21 @@ msgid "Go to Line..."
msgstr "Przejdź do linii..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Pomoc kontekstowa"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Przełącz punkt wstrzymania"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Usuń wszystkie punkty wstrzymania"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Przejdź do następnego punktu wstrzymania"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Przejdź do poprzedniego punktu wstrzymania"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -6800,14 +6905,12 @@ msgid "Rear"
msgstr "Tył"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Transform with View"
-msgstr "Dopasuj do widoku"
+msgstr "Dopasuj położenie do widoku"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Rotation with View"
-msgstr "Dopasuj zaznaczenie do widoku"
+msgstr "Dopasuj obrót do widoku"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -6862,8 +6965,9 @@ msgid "Audio Listener"
msgstr "Słuchacz dźwięku"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Efekt Dopplera"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Włącz filtrowanie"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6918,8 +7022,8 @@ msgid "Snap Nodes To Floor"
msgstr "Przyciągnij węzły do podłogi"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Tryb zaznaczenia (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6932,30 +7036,11 @@ msgstr ""
"Alt+PPM: Lista wyboru głębi"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Tryb Przesuwania (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Tryb Rotacji (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Tryb skalowania (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Lokalne koordynaty"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Tryb lokalny przestrzeni (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Tryb przyciÄ…gania (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Widok z dołu"
@@ -6996,22 +7081,6 @@ msgid "Focus Selection"
msgstr "Wycentruj na zaznaczeniu"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Narzędzie wyboru"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Narzędzie poruszania"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Narzędzie obracania"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Narzędzie skalowania"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Przełącz swobodny widok"
@@ -7066,7 +7135,8 @@ msgstr "Pokaż siatkę"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Ustawienia"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7360,10 +7430,6 @@ msgid "TextureRegion"
msgstr "Obszar tekstury"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "Nie mogę zapisać motywu do pliku:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Dodaj wszystkie elementy"
@@ -7448,11 +7514,13 @@ msgid "Submenu"
msgstr "Podmenu"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+#, fuzzy
+msgid "Subitem 1"
msgstr "Element 1"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+#, fuzzy
+msgid "Subitem 2"
msgstr "Element 2"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7569,9 +7637,10 @@ msgid "Paint Tile"
msgstr "Maluj kafelek"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Shift+PPM: Rysuj liniÄ™\n"
"Shift+Ctrl+PPM: Maluj prostokÄ…t"
@@ -7868,6 +7937,10 @@ msgid "TileSet"
msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(Tylko GLES3)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr "Dodaj wejście+"
@@ -7944,6 +8017,11 @@ msgid "Duplicate Nodes"
msgstr "Duplikuj węzły"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Wklej węzły"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "Usuń węzły"
@@ -7952,10 +8030,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "Typ wejścia shadera wizualnego zmieniony"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr "(Tylko GLES3)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "Wierzchołki"
@@ -7968,6 +8042,11 @@ msgid "Light"
msgstr "Światło"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Utwórz węzeł shadera"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr "Utwórz węzeł shadera"
@@ -8330,10 +8409,11 @@ msgid "Returns the square root of the parameter."
msgstr "Zwraca pierwiastek kwadratowy parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8345,10 +8425,11 @@ msgstr ""
"pomiędzy 0.0 i 1.0 używając wielomianów Hermite'a."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Funkcja przejścia( skalar(krawędź), skalar(x) ).\n"
"\n"
@@ -8522,6 +8603,11 @@ msgid "Linear interpolation between two vectors."
msgstr "Liniowo interpoluje pomiędzy dwoma wektorami."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Liniowo interpoluje pomiędzy dwoma wektorami."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr "Liczy znormalizowany wektor."
@@ -8546,10 +8632,11 @@ msgid "Returns the vector that points in the direction of refraction."
msgstr "Zwraca wektor skierowany w kierunku załamania."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8561,10 +8648,11 @@ msgstr ""
"pomiędzy 0.0 i 1.0 używając wielomianów Hermite'a."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8576,20 +8664,22 @@ msgstr ""
"pomiędzy 0.0 i 1.0 używając wielomianów Hermite'a."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Funkcja przejścia( wektor(krawędź), wektor(x) ).\n"
"\n"
"Zwraca 0.0 jeśli \"x\" jest mniejsze niż krawędź, w innym przypadku 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Funkcja przejścia( skalar(krawędź), wektor(x) ).\n"
"\n"
@@ -8642,6 +8732,13 @@ msgstr ""
"kierunku widoku kamery (podaj tu powiązane wejście)."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr "(Tylko tryb fragmentów/światła) Skalarna pochodna funkcji."
@@ -8870,6 +8967,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Brakuje eksportu szablonów dla tej platformy:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "ZarzÄ…dzaj szablonami eksportu"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "Eksport z debugowaniem"
@@ -9029,6 +9130,15 @@ msgid "Unnamed Project"
msgstr "Projekt bez nazwy"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Importuj istniejÄ…cy projekt"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "Nie można otworzyć projektu w \"%s\"."
@@ -9125,12 +9235,13 @@ msgstr ""
"Zawartość folderu projektu nie zostanie zmodyfikowana."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
-"Usunąć wszystkie brakujące projekty z listy? (Zawartość folderów nie "
-"zostanie zmodyfikowana)"
+"Usunąć %d projektów z listy?\n"
+"Zawartość folderów projektów nie zostanie zmodyfikowana."
#: editor/project_manager.cpp
msgid ""
@@ -9154,8 +9265,9 @@ msgid "Project Manager"
msgstr "Menedżer projektów"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Lista projektów"
+#, fuzzy
+msgid "Projects"
+msgstr "Projekt"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9178,10 +9290,6 @@ msgid "Templates"
msgstr "Szablony"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Wyjdź"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Uruchom ponownie"
@@ -9521,6 +9629,10 @@ msgstr "Lokalizacje:"
msgid "AutoLoad"
msgstr "Autoładowanie"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Wtyczki"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Zero"
@@ -9573,15 +9685,6 @@ msgstr "Wybierz metoda wirtualnÄ…"
msgid "Select Method"
msgstr "Wybierz metodÄ™"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "Nie można wykonać narzędzia PVRTC:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-"Nie można załadować przekonwertowanego obrazka używając narzędzia PVRTC:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "Grupowa zmiana nazwy"
@@ -9877,6 +9980,11 @@ msgid "Remove Node(s)"
msgstr "Usuń węzeł(y)"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Zmień nazwę portu wyjściowego"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9921,7 +10029,6 @@ msgid "Extend Script"
msgstr "Rozszerz skrypt"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
msgstr "Zmień nadrzędny węzeł"
@@ -9998,24 +10105,27 @@ msgid "Node configuration warning:"
msgstr "Ostrzeżenie konfiguracji węzła:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"Węzeł posiada połączenie(a) i grupę(y).\n"
"Kliknij, aby wyświetlić panel sygnałów."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"Węzeł posiada połączenia.\n"
"Kliknij, aby wyświetlić panel sygnałów."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"Węzeł jest w grupach.\n"
@@ -10114,6 +10224,11 @@ msgid "Error loading script from %s"
msgstr "Błąd ładowania skryptu z %s"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Nadpisz"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "N/A"
@@ -10302,6 +10417,10 @@ msgid "Change Shortcut"
msgstr "Zmień skrót"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Ustawienia edytora"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Skróty"
@@ -10719,10 +10838,30 @@ msgid "Set Variable Type"
msgstr "Ustaw typ zmiennej"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Nie może kolidować z nazwą istniejącego wbudowanego typu."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Utwórz nowy prostokąt."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Zmienne:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Utwórz nowy prostokąt."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Utwórz nowy wielokąt."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Nazwa nie jest prawidłowym identyfikatorem:"
@@ -10911,10 +11050,6 @@ msgid "Cut Nodes"
msgstr "Wytnij Węzły"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Wklej węzły"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "Edytuj członka"
@@ -11794,22 +11929,6 @@ msgstr ""
"otrzymał jakiś rozmiar. W przeciwnym wypadku ustawi opcję RenderTarget i "
"przyporządkuj jego teksturę dla któregoś węzła."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Błąd przy inicjalizacji FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Nieznany format czcionki."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Błąd ładowania fonta."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Niepoprawny rozmiar fonta."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Wejście"
@@ -11842,6 +11961,107 @@ msgstr "Varying może być przypisane tylko w funkcji wierzchołków."
msgid "Constants cannot be modified."
msgstr "Stałe nie mogą być modyfikowane."
+#~ msgid "No Matches"
+#~ msgstr "Nie znaleziono"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Nie udało się otworzyć pliku file_type_cache.cch do zapisu, pamięć "
+#~ "podręczna typu plików nie będzie zapisana!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "Nie można przejść do \"%s\" - nie znaleziono w tym systemie plików!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Błąd wczytywania obrazu:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Brak pikseli z przeźroczystością > 128 w obrazie..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Rodzic nie ma stałych powierzchni do zapełnienia."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Nie można zmapować obszaru."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Åšciana nie ma powierzchni!"
+
+#~ msgid "No faces!"
+#~ msgstr "Brak ścian!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Błąd: nie udało się wczytać pliku."
+
+#~ msgid "Error could not load file."
+#~ msgstr "Błąd nie udało się wczytać pliku."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Efekt Dopplera"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Tryb zaznaczenia (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Tryb Przesuwania (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Tryb Rotacji (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Tryb skalowania (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Lokalne koordynaty"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Tryb przyciÄ…gania (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Narzędzie wyboru"
+
+#~ msgid "Tool Move"
+#~ msgstr "Narzędzie poruszania"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Narzędzie obracania"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Narzędzie skalowania"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "Usunąć wszystkie brakujące projekty z listy? (Zawartość folderów nie "
+#~ "zostanie zmodyfikowana)"
+
+#~ msgid "Project List"
+#~ msgstr "Lista projektów"
+
+#~ msgid "Exit"
+#~ msgstr "Wyjdź"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "Nie można wykonać narzędzia PVRTC:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr ""
+#~ "Nie można załadować przekonwertowanego obrazka używając narzędzia PVRTC:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Błąd przy inicjalizacji FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Nieznany format czcionki."
+
+#~ msgid "Error loading font."
+#~ msgstr "Błąd ładowania fonta."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Niepoprawny rozmiar fonta."
+
#~ msgid "Previous Folder"
#~ msgstr "Poprzedni folder"
@@ -12456,9 +12676,6 @@ msgstr "Stałe nie mogą być modyfikowane."
#~ msgid "Erase selection"
#~ msgstr "Usuń zaznaczenie"
-#~ msgid "Could not find tile:"
-#~ msgstr "Nie mogłem znaleźć tile:"
-
#~ msgid "Item name or ID:"
#~ msgstr "Nazwa elementu lub ID:"
@@ -12707,9 +12924,6 @@ msgstr "Stałe nie mogą być modyfikowane."
#~ msgid "Info"
#~ msgstr "Informacje"
-#~ msgid "Re-Import..."
-#~ msgstr "Importuj ponownie..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "Brak mask bitowych do zaimportowania!"
@@ -13077,9 +13291,6 @@ msgstr "Stałe nie mogą być modyfikowane."
#~ msgid "Stereo"
#~ msgstr "Stereo"
-#~ msgid "Window"
-#~ msgstr "Okno"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Skalowanie do %s%%."
@@ -13268,9 +13479,6 @@ msgstr "Stałe nie mogą być modyfikowane."
#~ msgid "Add Image Group"
#~ msgstr "Dodaj grupę obrazków"
-#~ msgid "Delete Image Group"
-#~ msgstr "Usuń grupę obrazków"
-
#~ msgid "Project Export Settings"
#~ msgstr "Opcje eksportu projektu"
@@ -13322,9 +13530,6 @@ msgstr "Stałe nie mogą być modyfikowane."
#~ msgid "Export Project PCK"
#~ msgstr "Eksport projektu PCK"
-#~ msgid "Export..."
-#~ msgstr "Eksport..."
-
#~ msgid "Project Export"
#~ msgstr "Eksport projektu"
diff --git a/editor/translations/pr.po b/editor/translations/pr.po
index 1ab60028e0..e9d7b98fac 100644
--- a/editor/translations/pr.po
+++ b/editor/translations/pr.po
@@ -65,7 +65,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr ""
@@ -662,15 +661,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -903,8 +902,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -998,7 +996,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -1034,7 +1032,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1123,14 +1121,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1147,7 +1145,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1648,12 +1646,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2059,6 +2056,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2357,6 +2358,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2452,6 +2461,11 @@ msgstr ""
msgid "Close Tab"
msgstr "Close"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Close"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2538,20 +2552,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2584,16 +2594,21 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Edit"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
@@ -2601,8 +2616,12 @@ msgstr ""
msgid "Open Project Data Folder"
msgstr "Slit th' Node"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2682,13 +2701,13 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
#, fuzzy
msgid "Editor"
msgstr "Edit"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
msgstr ""
#: editor/editor_node.cpp
@@ -2725,14 +2744,15 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
-msgstr ""
-
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+msgid "Manage Editor Features..."
msgstr ""
#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
+msgstr "Discharge ye' Variable"
+
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2740,12 +2760,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3190,7 +3211,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3207,6 +3228,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3270,12 +3295,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3289,16 +3312,21 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
-msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+msgid "Cannot remove temporary file:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid ""
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Error requesting URL:"
+msgstr "Rename Variable"
+
+#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
msgstr ""
@@ -3386,19 +3414,11 @@ msgstr "Discharge ye' Variable"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3433,11 +3453,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3500,6 +3520,10 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3566,6 +3590,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Yar, Blow th' Selected Down!"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3628,6 +3657,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3636,12 +3673,22 @@ msgstr ""
msgid "Invalid group name."
msgstr "Yer unique name be evil."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Rename Function"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Slit th' Node"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3655,12 +3702,13 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
+#, fuzzy
+msgid "Group Editor"
+msgstr "Edit"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3869,7 +3917,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4639,10 +4687,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4655,14 +4699,42 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4739,8 +4811,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4761,7 +4836,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4773,6 +4848,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4938,6 +5017,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Change yer Anim Transform"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4967,6 +5051,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4987,14 +5072,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "Slit th' Node"
@@ -5020,6 +5108,7 @@ msgid "Toggle snapping."
msgstr "Toggle ye Breakpoint"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5036,11 +5125,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5053,6 +5137,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5264,16 +5353,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5589,14 +5668,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5680,19 +5751,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6030,7 +6105,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6136,11 +6210,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6169,7 +6239,7 @@ msgid "Error Importing"
msgstr "Error loading yer Calligraphy Pen."
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6252,6 +6322,11 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Edit"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6290,11 +6365,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6384,6 +6459,10 @@ msgstr ""
msgid "Search Results"
msgstr "Discharge ye' Variable"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6453,6 +6532,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6490,26 +6570,6 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Toggle ye Breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Toggle ye Breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Toggle ye Breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Discharge ye' Variable"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Fold/Unfold Line"
msgstr "Yar, Blow th' Selected Down!"
@@ -6530,6 +6590,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Yar, Blow th' Selected Down!"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6546,32 +6611,37 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Toggle ye Breakpoint"
+msgid "Find Previous"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Find ye Node Type"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
+msgid "Toggle Bookmark"
msgstr "Toggle ye Breakpoint"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
+msgid "Go to Next Bookmark"
msgstr "Toggle ye Breakpoint"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Toggle ye Breakpoint"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Find ye Node Type"
+msgid "Remove All Bookmarks"
+msgstr "Discharge ye' Variable"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6583,9 +6653,24 @@ msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Toggle ye Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Toggle ye Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Toggle ye Breakpoint"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -6823,8 +6908,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Change"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6877,9 +6963,8 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Select Mode (Q)"
-msgstr "Slit th' Node"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6889,27 +6974,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6954,23 +7019,6 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Tool Select"
-msgstr "Yar, Blow th' Selected Down!"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Freelook"
msgstr "Toggle ye Breakpoint"
@@ -7025,7 +7073,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7330,10 +7378,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7424,11 +7468,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7551,8 +7595,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7861,6 +7905,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Add Signal"
@@ -7945,6 +7993,11 @@ msgid "Duplicate Nodes"
msgstr "Rename Variable"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Paste yer Node"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Slit th' Node"
@@ -7954,10 +8007,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7970,6 +8019,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8331,7 +8384,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8340,7 +8393,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8501,6 +8554,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8526,7 +8583,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8535,7 +8592,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8544,14 +8601,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8596,6 +8653,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8806,6 +8870,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8954,6 +9022,15 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Rename Function"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -9023,8 +9100,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9044,8 +9121,9 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "Rename Function"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9070,10 +9148,6 @@ msgid "Templates"
msgstr "Discharge ye' Variable"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9411,6 +9485,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9465,14 +9543,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9761,6 +9831,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9886,19 +9960,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9994,6 +10068,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10188,6 +10266,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10618,10 +10700,29 @@ msgid "Set Variable Type"
msgstr "Edit yer Variable:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Yar, Blow th' Selected Down!"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Yer variables:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Yar, Blow th' Selected Down!"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Yar, Blow th' Selected Down!"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Yer name's got no valid identifier:"
@@ -10823,10 +10924,6 @@ msgid "Cut Nodes"
msgstr "Slit th' Node"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Paste yer Node"
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "th' Members:"
@@ -11566,22 +11663,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Cant Load the FreeType Captain."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Unknown Calligraphy format."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Error loading yer Calligraphy Pen."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Yer Calligraphy be wrongly sized."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11618,6 +11699,26 @@ msgid "Constants cannot be modified."
msgstr ""
#, fuzzy
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Slit th' Node"
+
+#, fuzzy
+#~ msgid "Tool Select"
+#~ msgstr "Yar, Blow th' Selected Down!"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Cant Load the FreeType Captain."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Unknown Calligraphy format."
+
+#~ msgid "Error loading font."
+#~ msgstr "Error loading yer Calligraphy Pen."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Yer Calligraphy be wrongly sized."
+
+#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "Slit th' Node"
diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po
index 6648ae1f7e..3a42ddaad7 100644
--- a/editor/translations/pt_BR.po
+++ b/editor/translations/pt_BR.po
@@ -65,12 +65,13 @@
# Rarysson Guilherme <r_guilherme12@hotmail.com>, 2019.
# Gustavo da Silva Santos <gustavo94.rb@gmail.com>, 2019.
# Rafael Roque <rafael.roquec@gmail.com>, 2019.
+# José Victor Dias Rodrigues <zoldyakopersonal@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: 2016-05-30\n"
-"PO-Revision-Date: 2019-07-29 19:20+0000\n"
-"Last-Translator: Rafael Roque <rafael.roquec@gmail.com>\n"
+"PO-Revision-Date: 2019-08-21 15:56+0000\n"
+"Last-Translator: Julio Yagami <juliohenrique31501234@hotmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
"godot-engine/godot/pt_BR/>\n"
"Language: pt_BR\n"
@@ -78,7 +79,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -120,7 +121,6 @@ msgid "On call to '%s':"
msgstr "Na chamada para '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Livre"
@@ -715,16 +715,18 @@ msgid "Line Number:"
msgstr "Número da Linha:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "%d correspondência(s) encontrada(s)."
+msgid "Replaced %d occurrence(s)."
+msgstr "%d ocorrência(s) substituída(s)."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Sem Correspondências"
+#, fuzzy
+msgid "%d match."
+msgstr "%d correspondência(s) encontrada(s)."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d ocorrência(s) substituída(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "%d correspondência(s) encontrada(s)."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -950,8 +952,7 @@ msgstr "Favoritos:"
msgid "Recent:"
msgstr "Recente:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1052,7 +1053,7 @@ msgstr ""
"funcionem.\n"
"Removê-los mesmo assim? (irreversível)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Não pode remover:"
@@ -1088,7 +1089,7 @@ msgstr "Excluir permanentemente %d item(s)? (Irreversível)"
msgid "Show Dependencies"
msgstr "Mostrar Dependências"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Explorador de Recursos Órfãos"
@@ -1177,14 +1178,16 @@ msgid "License"
msgstr "Licença"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Licença de Terceiros"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"A Godot Engine conta com várias bibliotecas de código aberto e gratuitas de "
@@ -1205,7 +1208,8 @@ msgid "Licenses"
msgstr "Licenças"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Erro ao abrir arquivo de pacote, não está em formato zip."
#: editor/editor_asset_installer.cpp
@@ -1697,12 +1701,11 @@ msgid "New"
msgstr "Novo"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importar"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Exportar"
@@ -1839,32 +1842,28 @@ msgid "Move Favorite Down"
msgstr "Mover Favorito Abaixo"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Ir para diretório (pasta) pai."
+msgstr "Ir para a pasta anterior."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Ir para diretório (pasta) pai."
+msgstr "Ir para a próxima pasta."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "Ir para diretório (pasta) pai."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Pesquisar arquivos"
+msgstr "Atualizar arquivos."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "(Des)favoritar pasta atual."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "Alternar visibilidade de arquivos ocultos."
+msgstr "Alternar a visibilidade de arquivos ocultos."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
@@ -2105,6 +2104,11 @@ msgstr "Limpar"
msgid "Clear Output"
msgstr "Limpar Saída"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "Janela"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Falha na exportação do projeto com código de erro %d."
@@ -2427,6 +2431,15 @@ msgid "Pick a Main Scene"
msgstr "Escolha uma Cena Principal"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Fechar Cena"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Fechar Cena"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Não foi possível ativar o plugin em: '%s' processamento da configuração "
@@ -2543,6 +2556,11 @@ msgstr "Rodar Cena"
msgid "Close Tab"
msgstr "Fechar aba"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Fechar aba"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Fechas as outras abas"
@@ -2627,6 +2645,10 @@ msgstr "Nova Cena Herdada..."
msgid "Open Scene..."
msgstr "Abrir Cena..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Abrir Recente"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Salvar Cena"
@@ -2636,14 +2658,6 @@ msgid "Save All Scenes"
msgstr "Salvar Todas as Cenas"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Fechar Cena"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Abrir Recente"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Converter Para..."
@@ -2673,25 +2687,36 @@ msgstr "Reverter Cena"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Ferramentas diversas atuantes no projeto ou cena."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Projeto"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Configurações do Projeto"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Ferramentas"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr "Exportar..."
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Instalar o Modelo de Compilação do Android"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Abrir Pasta do Projeto"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Ferramentas"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Instalar o Modelo de Compilação do Android"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Explorador de Recursos Órfãos"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2789,12 +2814,13 @@ msgstr ""
"Quando usado remotamente em um dispositivo, isso é mais eficiente com o "
"sistema de arquivos via rede."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Editor"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Configurações do Editor"
#: editor/editor_node.cpp
@@ -2830,14 +2856,16 @@ msgid "Open Editor Settings Folder"
msgstr "Abrir Configurações do Editor"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "Gerenciar Recursos do Editor"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Gerenciar Modelos de Exportação"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Ajuda"
@@ -2845,12 +2873,13 @@ msgstr "Ajuda"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Pesquisar"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Documentação Online"
@@ -3130,9 +3159,8 @@ msgid "Calls"
msgstr "Chamadas"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Editar Tema"
+msgstr "Editar Texto:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3307,7 +3335,8 @@ msgid "Import From Node:"
msgstr "Importar a Partir do Nó:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Baixar Novamente"
#: editor/export_template_manager.cpp
@@ -3324,6 +3353,10 @@ msgid "Download"
msgstr "Baixar"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Faltando)"
@@ -3387,12 +3420,10 @@ msgid "No response."
msgstr "Sem resposta."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Solicitação Falhou."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Loop de Redirecionamento."
@@ -3406,15 +3437,22 @@ msgid "Download Complete."
msgstr "Download completo."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Não pôde salvar tema ao arquivo:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Instalação de templates falhou. Os arquivos problemáticos podem ser achados "
"em '%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Erro ao solicitar url: "
#: editor/export_template_manager.cpp
@@ -3499,21 +3537,11 @@ msgstr "Baixar Modelos"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Selecione um espelho da lista: (Shift+Click: Abrir no Navegador)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Falha ao abrir file_type_cache.cch para escrita, cache de tipos de arquivo "
-"não salvo!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Favoritos"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "Impossível navegar até '%s' pois não existe no sistema de arquivos!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Estado: Falha na importação do arquivo. Por favor, conserte o arquivo e "
@@ -3548,14 +3576,14 @@ msgid "Provided name contains invalid characters."
msgstr "O nome fornecido contém caracteres inválidos."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Nome contém caracteres inválidos."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Um arquivo ou pasta com esse nome já existe."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Nome contém caracteres inválidos."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Renomear arquivo:"
@@ -3611,6 +3639,11 @@ msgstr "Duplicar..."
msgid "Move To..."
msgstr "Mover Para..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Nova Cena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Novo Script..."
@@ -3676,6 +3709,11 @@ msgstr "Já há uma pasta ou arquivo neste caminho com o nome especificado."
msgid "Overwrite"
msgstr "Sobrescrever"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Criar a partir de Cena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Criar Script"
@@ -3738,6 +3776,14 @@ msgid "Search complete"
msgstr "Pesquisa concluída"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Adicionar ao Grupo"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Remover do Grupo"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Nome do grupo já existe."
@@ -3745,12 +3791,23 @@ msgstr "Nome do grupo já existe."
msgid "Invalid group name."
msgstr "Nome de grupo inválido."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Gerenciar Grupos"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Excluir Imagem do Grupo"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupos"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Nós fora do Grupo"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3763,12 +3820,12 @@ msgid "Nodes in Group"
msgstr "Nós no Grupo"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Adicionar ao Grupo"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Remover do Grupo"
+msgid "Group Editor"
+msgstr "Editor de Grupos"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3977,7 +4034,8 @@ msgid "MultiNode Set"
msgstr "Múltiplos Nodes definidos"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Selecione um nó para editar Sinais e Grupos."
#: editor/plugin_config_dialog.cpp
@@ -4741,10 +4799,6 @@ msgid "View Files"
msgstr "Ver Arquivos"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Não foi possível resolver o hostname:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Erro na conexão, por favor tente novamente."
@@ -4757,14 +4811,47 @@ msgid "No response from host:"
msgstr "Sem resposta do host:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Não foi possível resolver o hostname:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Solicitação falhou, código de retorno:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Solicitação Falhou."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Não pôde salvar tema ao arquivo:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Solicitação falhou, redirecionamentos demais"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Loop de Redirecionamento."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Solicitação falhou, código de retorno:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Tempo"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Hash de download ruim, assumindo que o arquivo foi adulterado."
@@ -4841,8 +4928,13 @@ msgid "All"
msgstr "Todos"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Re-importar..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Plugins"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4863,7 +4955,8 @@ msgid "Site:"
msgstr "Site:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Suporte..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4875,6 +4968,11 @@ msgid "Testing"
msgstr "Testando"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Carregar..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Arquivo ZIP de Assets"
@@ -5041,6 +5139,11 @@ msgid "Paste Pose"
msgstr "Colar Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Limpar Esqueletos"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Criar esqueleto(s) customizado(s) do(s) nó(s)"
@@ -5071,6 +5174,7 @@ msgid "Zoom Reset"
msgstr "Restaurar Ampliação"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Modo de Seleção"
@@ -5093,14 +5197,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt + botão direito do mouse: Lista de seleção de profundidade"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Modo Mover"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Modo Rotacionar"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Modo Escala"
@@ -5126,6 +5233,7 @@ msgid "Toggle snapping."
msgstr "Alternar o snap."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Usar Snap"
@@ -5142,11 +5250,6 @@ msgid "Use Rotation Snap"
msgstr "Usar Snap de Rotação"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Configurar Snap..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Snap Relativo"
@@ -5159,6 +5262,11 @@ msgid "Smart Snapping"
msgstr "Encaixe inteligente"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Configurar Snap..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "Encaixar no Pai"
@@ -5373,16 +5481,6 @@ msgstr "Definir Manipulador"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Erro ao carregar imagem:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Nenhum pixel com transparência > 128 na imagem."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Carregar Máscara de Emissão"
@@ -5696,14 +5794,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Superfície de origem é inválida (sem faces)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "Pai não tem faces sólidas para popular."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Não foi possível mapear área."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Selecione uma Malha de origem:"
@@ -5788,20 +5878,27 @@ msgid "Generation Time (sec):"
msgstr "Gerando Tempo (seg):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "As faces não têm área!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "O nó não contém geometria (faces)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Nenhuma face!"
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "O nó não contém geometria."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "O nó não contém geometria (faces)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "O nó não contém geometria."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6135,7 +6232,6 @@ msgid "Grid Settings"
msgstr "Configurações da grade"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Snap"
@@ -6241,12 +6337,9 @@ msgid "Error writing TextFile:"
msgstr "Erro ao escrever arquivo:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Erro: Não foi possível carregar o arquivo."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "Erro: não pôde carregar o arquivo."
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "Não se pôde achar tile:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6269,7 +6362,8 @@ msgid "Error Importing"
msgstr "Erro ao importar"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Novo arquivo de texto ..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6350,6 +6444,11 @@ msgid "Open..."
msgstr "Abrir..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Abrir script"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Salvar Tudo"
@@ -6387,13 +6486,13 @@ msgid "Save Theme"
msgstr "Salvar Tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Fechar Docs"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Fechar Tudo"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Fechar Docs"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Rodar"
@@ -6481,6 +6580,11 @@ msgstr "Depurador"
msgid "Search Results"
msgstr "Pesquisar resultados"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Limpar Cenas Recentes"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "Conexões com o método:"
@@ -6547,6 +6651,7 @@ msgid "Syntax Highlighter"
msgstr "Realce de sintaxe"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr "Ir Para"
@@ -6582,22 +6687,6 @@ msgid "Toggle Comment"
msgstr "Alternar Comentário"
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr "Alternar Marcador"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "Ir para o Próximo Marcador"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr "Ir para o Marcador Anterior"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "Remover Todos os Marcadores"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Dobrar/Desdobrar Linha"
@@ -6618,6 +6707,11 @@ msgid "Complete Symbol"
msgstr "Completar Símbolo"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Selecionar Escala"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Apagar Espaços em Branco"
@@ -6634,29 +6728,32 @@ msgid "Auto Indent"
msgstr "Auto Recuar"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Alternar Ponto de interrupção"
+msgid "Find Previous"
+msgstr "Encontrar Anterior"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Remover Todos os Pontos de Interrupção"
+msgid "Find in Files..."
+msgstr "Procurar nos Arquivos..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Vá para o próximo ponto de interrupção"
+msgid "Contextual Help"
+msgstr "Ajuda Contextual"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Ir para ponto de interrupção anterior"
+msgid "Toggle Bookmark"
+msgstr "Alternar Marcador"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Encontrar Anterior"
+msgid "Go to Next Bookmark"
+msgstr "Ir para o Próximo Marcador"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Procurar nos Arquivos..."
+msgid "Go to Previous Bookmark"
+msgstr "Ir para o Marcador Anterior"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Remover Todos os Marcadores"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6667,8 +6764,21 @@ msgid "Go to Line..."
msgstr "Ir para Linha..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Ajuda Contextual"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Alternar Ponto de interrupção"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Remover Todos os Pontos de Interrupção"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Vá para o próximo ponto de interrupção"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Ir para ponto de interrupção anterior"
#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
@@ -6850,12 +6960,12 @@ msgstr "Traseira"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Align Transform with View"
-msgstr "Alinhar com a Vista"
+msgstr "Alinhar Transformação com a Vista"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Align Rotation with View"
-msgstr "Alinhar Seleção com Visualização"
+msgstr "Alinhar Rotação com a Vista"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -6910,8 +7020,9 @@ msgid "Audio Listener"
msgstr "Ouvinte de Ãudio"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Habilitar Doppler"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Habilitar Filtragem"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6966,8 +7077,8 @@ msgid "Snap Nodes To Floor"
msgstr "Encaixar Nó(s) no Chão"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Modo de Seleção (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6980,30 +7091,11 @@ msgstr ""
"Alt + botão direito do mouse: Lista de Profundidade"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Modo Mover (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Modo Rotacionar"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Modo Escala (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Local Coords"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Modo Espaço Local (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Modo Encaixe (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Visão inferior"
@@ -7044,22 +7136,6 @@ msgid "Focus Selection"
msgstr "Focar Seleção"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Ferramenta Selecionar"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Ferramenta Mover"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Ferramenta Rotacionar"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Ferramenta Escalar"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Alternar Visão Livre"
@@ -7114,7 +7190,8 @@ msgstr "Ver Grade"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Configurações"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7409,10 +7486,6 @@ msgid "TextureRegion"
msgstr "Região da Textura"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "Não pôde salvar tema ao arquivo:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Adicionar Todos os Itens"
@@ -7497,11 +7570,13 @@ msgid "Submenu"
msgstr "Submenu"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+#, fuzzy
+msgid "Subitem 1"
msgstr "Item 1"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+#, fuzzy
+msgid "Subitem 2"
msgstr "Item 2"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7618,9 +7693,10 @@ msgid "Paint Tile"
msgstr "Pintar Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Shift+RMB: Desenhar Linha\n"
"Shift+Ctrl+RMB: Pintar Retângulo"
@@ -7835,7 +7911,7 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Region"
-msgstr "Definir a região da Telha"
+msgstr "Definir a região do Mosaico"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Tile"
@@ -7918,6 +7994,10 @@ msgid "TileSet"
msgstr "Conjunto de Telha"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(Apenas GLES3)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr "Adicionar Entrada +"
@@ -7946,14 +8026,12 @@ msgid "Add output port"
msgstr "Adicionar porta de saída"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port type"
-msgstr "Mudar tipo de porta de entrada"
+msgstr "Alterar tipo da porta de entrada"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change output port type"
-msgstr "Mudar tipo de porta de saída"
+msgstr "Alterar tipo da porta de saída"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Change input port name"
@@ -7996,6 +8074,11 @@ msgid "Duplicate Nodes"
msgstr "Duplicar Nó(s)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Colar Nodes"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "Excluir Nós"
@@ -8004,10 +8087,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "Tipo de Entrada de Shader Visual Alterado"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr "(Apenas GLES3)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "Vértice"
@@ -8021,6 +8100,11 @@ msgstr "Luz"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Criar Nó Shader"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Criar Nó Shader"
@@ -8402,11 +8486,11 @@ msgstr "Retorna a raiz quadrada do parâmetro."
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
-"Função SmoothStep( scalar(edge0), scalar(edge1), scalar(x) ).\n"
+"Função SmoothStep( escalar(edge0), escalar(edge1), escalar(x) ).\n"
"\n"
"Retorna 0.0 se 'x' é menor que 'edge0' e 1.0 se 'x' é maior que 'edge1'. "
"Caso contrário o valor retornado é interpolado entre 0.0 e 1.0 utilizando "
@@ -8417,9 +8501,9 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
-"Função Step( scalar(edge), scalar(x) ).\n"
+"Função Step( escalar(edge), escalar(x) ).\n"
"\n"
"Retorna 0.0 se 'x' é menor que 'edge' e 1.0 caso contrário."
@@ -8428,14 +8512,12 @@ msgid "Returns the tangent of the parameter."
msgstr "Retorna a tangente do parâmetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the hyperbolic tangent of the parameter."
-msgstr "(Somente em GLES3) Retorna a tangente hiperbólica do parâmetro."
+msgstr "Retorna a tangente hiperbólica do parâmetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Finds the truncated value of the parameter."
-msgstr "(Somente em GLES3) Encontra o valor truncado do parâmetro."
+msgstr "Encontra o valor truncado do parâmetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8443,19 +8525,17 @@ msgid "Adds scalar to scalar."
msgstr "Adiciona escalar a escalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Divides scalar by scalar."
msgstr "Divide escalar por escalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Multiplies scalar by scalar."
msgstr "Multiplica escalar por escalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Returns the remainder of the two scalars."
-msgstr "Retorna o resto das duas escalares."
+msgstr "Retorna o resto de dois escalares."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8478,8 +8558,9 @@ msgid "Perform the cubic texture lookup."
msgstr "Faça a pesquisa da textura cúbica."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Perform the texture lookup."
-msgstr ""
+msgstr "Fazer pesquisa da textura."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8608,6 +8689,11 @@ msgid "Linear interpolation between two vectors."
msgstr "Interpolação linear entre dois vetores."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Interpolação linear entre dois vetores."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr "Calcula o produto normalizado do vetor."
@@ -8634,36 +8720,56 @@ msgid "Returns the vector that points in the direction of refraction."
msgstr "Retorna um vetor que aponta na direção da refração."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"Função SmoothStep( escalar(edge0), escalar(edge1), escalar(x) ).\n"
+"\n"
+"Retorna 0.0 se 'x' é menor que 'edge0' e 1.0 se 'x' é maior que 'edge1'. "
+"Caso contrário o valor retornado é interpolado entre 0.0 e 1.0 utilizando "
+"polinômios de Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"Função SmoothStep( escalar(edge0), escalar(edge1), escalar(x) ).\n"
+"\n"
+"Retorna 0.0 se 'x' é menor que 'edge0' e 1.0 se 'x' é maior que 'edge1'. "
+"Caso contrário o valor retornado é interpolado entre 0.0 e 1.0 utilizando "
+"polinômios de Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Função Step( escalar(edge), escalar(x) ).\n"
+"\n"
+"Retorna 0.0 se 'x' é menor que 'edge' e 1.0 caso contrário."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Função Step( escalar(edge), escalar(x) ).\n"
+"\n"
+"Retorna 0.0 se 'x' é menor que 'edge' e 1.0 caso contrário."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds vector to vector."
@@ -8709,6 +8815,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8927,6 +9040,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Modelos de exportação para esta plataforma não foram encontrados:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Gerenciar Modelos de Exportação"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "Exportar Com Depuração"
@@ -9086,6 +9203,15 @@ msgid "Unnamed Project"
msgstr "Projeto Sem Nome"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Importar Projeto Existente"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "Não é possível abrir o projeto em '%s'."
@@ -9184,8 +9310,8 @@ msgstr "Remover projeto da lista? (O conteúdo da pasta não será modificado)"
#: editor/project_manager.cpp
#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr "Remover projeto da lista? (O conteúdo da pasta não será modificado)"
#: editor/project_manager.cpp
@@ -9212,8 +9338,9 @@ msgid "Project Manager"
msgstr "Gerenciador de Projetos"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Lista de Projetos"
+#, fuzzy
+msgid "Projects"
+msgstr "Projeto"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9237,10 +9364,6 @@ msgid "Templates"
msgstr "Modelos"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Sair"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Reiniciar Agora"
@@ -9585,6 +9708,10 @@ msgstr "Idiomas:"
msgid "AutoLoad"
msgstr "AutoLoad"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Plugins"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Zero"
@@ -9637,14 +9764,6 @@ msgstr "Selecionar Método Virtual"
msgid "Select Method"
msgstr "Selecionar Mtéodo"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "Não se pôde executar a ferramenta PVRTC:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr "Não se pôde carregar de volta imagem convertida por PVRTC:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "Renomear em lote"
@@ -9942,6 +10061,11 @@ msgid "Remove Node(s)"
msgstr "Remover Nó(s)"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Alterar nome da porta de saída"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10069,24 +10193,27 @@ msgid "Node configuration warning:"
msgstr "Aviso de configuração de nó:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"O nó tem conexão(ões) e grupo(s)\n"
"Clique para mostrar o painel de sinais."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"O nó tem conexões.\n"
"Clique para mostrar o painel de sinais."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"O nó está em grupo(s).\n"
@@ -10193,6 +10320,11 @@ msgid "Error loading script from %s"
msgstr "Erro ao carregar script de %s"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Sobrescrever"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "N/D"
@@ -10390,6 +10522,10 @@ msgid "Change Shortcut"
msgstr "Modificar Atalho"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Configurações do Editor"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Atalhos"
@@ -10811,10 +10947,30 @@ msgid "Set Variable Type"
msgstr "Definir o Tipo da Variável"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Não deve coincidir com um nome de tipo interno existente."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Criar um novo retângulo."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Variáveis:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Criar um novo retângulo."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Criar um novo polígono."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "O nome não é um identificador valido:"
@@ -11004,10 +11160,6 @@ msgid "Cut Nodes"
msgstr "Recortar Nodes"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Colar Nodes"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "Editar Membro"
@@ -11891,22 +12043,6 @@ msgstr ""
"para que ele possa ter um tamanho. Caso contrário, defina-o como destino de "
"render e atribua sua textura interna a algum nó para exibir."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Erro ao inicializar FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Formato de fonte desconhecido."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Erro ao carregar fonte."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Tamanho de fonte inválido."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Entrada"
@@ -11941,6 +12077,105 @@ msgstr "Variáveis só podem ser atribuídas na função de vértice."
msgid "Constants cannot be modified."
msgstr "Constantes não podem serem modificadas."
+#~ msgid "No Matches"
+#~ msgstr "Sem Correspondências"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Falha ao abrir file_type_cache.cch para escrita, cache de tipos de "
+#~ "arquivo não salvo!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "Impossível navegar até '%s' pois não existe no sistema de arquivos!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Erro ao carregar imagem:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Nenhum pixel com transparência > 128 na imagem."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Pai não tem faces sólidas para popular."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Não foi possível mapear área."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "As faces não têm área!"
+
+#~ msgid "No faces!"
+#~ msgstr "Nenhuma face!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Erro: Não foi possível carregar o arquivo."
+
+#~ msgid "Error could not load file."
+#~ msgstr "Erro: não pôde carregar o arquivo."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Habilitar Doppler"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Modo de Seleção (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Modo Mover (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Modo Rotacionar"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Modo Escala (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Local Coords"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Modo Encaixe (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Ferramenta Selecionar"
+
+#~ msgid "Tool Move"
+#~ msgstr "Ferramenta Mover"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Ferramenta Rotacionar"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Ferramenta Escalar"
+
+#, fuzzy
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr "Remover projeto da lista? (O conteúdo da pasta não será modificado)"
+
+#~ msgid "Project List"
+#~ msgstr "Lista de Projetos"
+
+#~ msgid "Exit"
+#~ msgstr "Sair"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "Não se pôde executar a ferramenta PVRTC:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr "Não se pôde carregar de volta imagem convertida por PVRTC:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Erro ao inicializar FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Formato de fonte desconhecido."
+
+#~ msgid "Error loading font."
+#~ msgstr "Erro ao carregar fonte."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Tamanho de fonte inválido."
+
#~ msgid "Previous Folder"
#~ msgstr "Pasta Anterior"
@@ -12545,9 +12780,6 @@ msgstr "Constantes não podem serem modificadas."
#~ msgid "Erase selection"
#~ msgstr "Apagar Seleção"
-#~ msgid "Could not find tile:"
-#~ msgstr "Não se pôde achar tile:"
-
#~ msgid "Item name or ID:"
#~ msgstr "Nome ou ID do item:"
@@ -12815,9 +13047,6 @@ msgstr "Constantes não podem serem modificadas."
#~ msgid "Info"
#~ msgstr "Informação"
-#~ msgid "Re-Import..."
-#~ msgstr "Re-importar..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "Sem máscaras de bits para importar!"
@@ -13210,9 +13439,6 @@ msgstr "Constantes não podem serem modificadas."
#~ msgid "Stereo"
#~ msgstr "Estéreo"
-#~ msgid "Window"
-#~ msgstr "Janela"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Escalonando para %s%%."
@@ -13433,9 +13659,6 @@ msgstr "Constantes não podem serem modificadas."
#~ msgid "Add Image Group"
#~ msgstr "Adicionar Grupo de Imagens"
-#~ msgid "Delete Image Group"
-#~ msgstr "Excluir Imagem do Grupo"
-
#~ msgid "Project Export Settings"
#~ msgstr "Configurações de Exportação de Projeto"
@@ -13520,9 +13743,6 @@ msgstr "Constantes não podem serem modificadas."
#~ msgid "Export Project PCK"
#~ msgstr "Exportar PCK do Projeto"
-#~ msgid "Export..."
-#~ msgstr "Exportar..."
-
#~ msgid "Project Export"
#~ msgstr "Exportação de Projeto"
@@ -13614,9 +13834,6 @@ msgstr "Constantes não podem serem modificadas."
#~ msgid "Deploy File Server Clients"
#~ msgstr "Instalar Clientes do Servidor de Arquivos"
-#~ msgid "Group Editor"
-#~ msgstr "Editor de Grupos"
-
#~ msgid "Overwrite Existing Scene"
#~ msgstr "Sobrescrever Cena Existente"
diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po
index b223e41766..7016f39d39 100644
--- a/editor/translations/pt_PT.po
+++ b/editor/translations/pt_PT.po
@@ -70,7 +70,6 @@ msgid "On call to '%s':"
msgstr "Em chamada para '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Livre"
@@ -666,16 +665,18 @@ msgid "Line Number:"
msgstr "Numero da linha:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "Encontrada(s) %d correspondência(s)."
+msgid "Replaced %d occurrence(s)."
+msgstr "Substituído %d ocorrência(s)."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Sem combinações"
+#, fuzzy
+msgid "%d match."
+msgstr "Encontrada(s) %d correspondência(s)."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Substituído %d ocorrência(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Encontrada(s) %d correspondência(s)."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -902,8 +903,7 @@ msgstr "Favoritos:"
msgid "Recent:"
msgstr "Recente:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1004,7 +1004,7 @@ msgstr ""
"funcionem.\n"
"Remover mesmo assim? (sem anular)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Impossível remover:"
@@ -1040,7 +1040,7 @@ msgstr "Apagar permanentemente %d itens? (Sem desfazer!)"
msgid "Show Dependencies"
msgstr "Mostra Dependências"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Explorador de Recursos Órfãos"
@@ -1129,14 +1129,16 @@ msgid "License"
msgstr "Licença"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Licença de Terceiros"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"O Godot Engine conta com várias Bibliotecas abertas e gratuitas de "
@@ -1157,7 +1159,8 @@ msgid "Licenses"
msgstr "Licenças"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Error ao abrir Ficheiro comprimido, não está no formato zip."
#: editor/editor_asset_installer.cpp
@@ -1651,12 +1654,11 @@ msgid "New"
msgstr "Novo"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importar"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Exportar"
@@ -2059,6 +2061,10 @@ msgstr "Limpar"
msgid "Clear Output"
msgstr "Limpar Saída"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Exportação do projeto falhou com código de erro %d."
@@ -2383,6 +2389,15 @@ msgid "Pick a Main Scene"
msgstr "Escolha a Cena Principal"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Fechar Cena"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Fechar Cena"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr "Incapaz de ativar plugin em: '%s' falha de análise ou configuração."
@@ -2496,6 +2511,11 @@ msgstr "Executar esta Cena"
msgid "Close Tab"
msgstr "Fechar Separador"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Fechar Separador"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Fechar outros separadores"
@@ -2580,6 +2600,10 @@ msgstr "Nova Cena Herdada..."
msgid "Open Scene..."
msgstr "Abrir Cena..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Abrir Recente"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Guardar Cena"
@@ -2589,14 +2613,6 @@ msgid "Save All Scenes"
msgstr "Guardar todas as Cenas"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Fechar Cena"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Abrir Recente"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Converter Para..."
@@ -2626,25 +2642,37 @@ msgstr "Reverter Cena"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Ferramentas diversas atuantes no Projeto ou Cena."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Projeto"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Configurações de Projeto"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Ferramentas"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Exportar"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Instalar Modelo Android de Compilação"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Abrir Pasta de Dados do Projeto"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Ferramentas"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Instalar Modelo Android de Compilação"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Explorador de Recursos Órfãos"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2741,12 +2769,13 @@ msgstr ""
"Quando usada num dispositivo remoto, é mais eficiente com um Sistema de "
"Ficheiros em rede."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Editor"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Configurações do Editor"
#: editor/editor_node.cpp
@@ -2783,14 +2812,16 @@ msgid "Open Editor Settings Folder"
msgstr "Abrir Pasta de Configurações do Editor"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "Gerir Características do Editor"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Gerir Modelos de Exportação"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Ajuda"
@@ -2798,12 +2829,13 @@ msgstr "Ajuda"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Procurar"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Documentação Online"
@@ -3255,7 +3287,8 @@ msgid "Import From Node:"
msgstr "Importar do Nó:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Transferir novamente"
#: editor/export_template_manager.cpp
@@ -3272,6 +3305,10 @@ msgid "Download"
msgstr "Download"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Em Falta)"
@@ -3335,12 +3372,10 @@ msgid "No response."
msgstr "Sem resposta."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Pedido falhado."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Redirecionar ciclo."
@@ -3354,15 +3389,22 @@ msgid "Download Complete."
msgstr "Download Completo."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Impossível guardar tema para Ficheiro:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Falhou a instalação de Modelos. Os ficheiros problemáticos podem ser "
"encontrados em '%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Erro ao solicitar url: "
#: editor/export_template_manager.cpp
@@ -3447,21 +3489,11 @@ msgstr "Transferir Modelos"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Selecionar servidor da lista: (Shift+Click: Abrir no Navegador)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"file_type_cache.cch não for guardada, por não se conseguir abrir para "
-"leitura!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Favoritos"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "'%s' não foi encontrado no Sistema de Ficheiros!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Estado: A importação do Ficheiro falhou. Corrija o Ficheiro e importe "
@@ -3496,14 +3528,14 @@ msgid "Provided name contains invalid characters."
msgstr "O nome fornecido contém carateres inválidos."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "O nome contém carateres inválidos."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Um Ficheiro ou diretoria já existe com este nome."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "O nome contém carateres inválidos."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Mudar nome do Ficheiro:"
@@ -3559,6 +3591,11 @@ msgstr "Duplicar..."
msgid "Move To..."
msgstr "Mover para..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Nova Cena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Novo Script..."
@@ -3624,6 +3661,11 @@ msgstr "Já existe um ficheiro ou pasta com o mesmo nome nesta localização."
msgid "Overwrite"
msgstr "Sobrescrever"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Criar a partir da Cena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Criar Script"
@@ -3686,6 +3728,14 @@ msgid "Search complete"
msgstr "Pesquisa completa"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Adicionar ao Grupo"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Remover do Grupo"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Já existe o nome de grupo ."
@@ -3693,12 +3743,23 @@ msgstr "Já existe o nome de grupo ."
msgid "Invalid group name."
msgstr "Nome de grupo inválido."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Gerir Grupos"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Apagar Modelo"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupos"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Nós fora do Grupo"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3711,12 +3772,13 @@ msgid "Nodes in Group"
msgstr "Nós no Grupo"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Adicionar ao Grupo"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Remover do Grupo"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Editor de Script"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3924,7 +3986,8 @@ msgid "MultiNode Set"
msgstr "Conjunto MultiNode"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Selecionar um Nó para editar sinais e grupos."
#: editor/plugin_config_dialog.cpp
@@ -4683,10 +4746,6 @@ msgid "View Files"
msgstr "Ver Ficheiros"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Impossível resolver hostname:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Erro de ligação, tente novamente."
@@ -4699,14 +4758,47 @@ msgid "No response from host:"
msgstr "Sem resposta do host:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Impossível resolver hostname:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Falha na solicitação, código de retorno:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Pedido falhado."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Impossível guardar tema para Ficheiro:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Falha na solicitação, demasiados redirecionamentos"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Redirecionar ciclo."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Falha na solicitação, código de retorno:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Tempo"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Mau hash na transferência, assume-se que o Ficheiro foi manipulado."
@@ -4783,8 +4875,13 @@ msgid "All"
msgstr "Todos"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Importar"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Plugins"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4805,7 +4902,8 @@ msgid "Site:"
msgstr "Site:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Suporte..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4817,6 +4915,11 @@ msgid "Testing"
msgstr "Em teste"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Carregar..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Ficheiro ZIP de Ativos"
@@ -4980,6 +5083,11 @@ msgid "Paste Pose"
msgstr "Colar Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Apagar Ossos"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Criar Osso(s) Personalizado(s) a partis de Nó(s)"
@@ -5010,6 +5118,7 @@ msgid "Zoom Reset"
msgstr "Repor zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Modo seleção"
@@ -5031,14 +5140,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+RMB: seleção da lista de profundidade"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Modo mover"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Modo rodar"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Modo Escalar"
@@ -5064,6 +5176,7 @@ msgid "Toggle snapping."
msgstr "Alternar Ajuste."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Usar Ajuste"
@@ -5080,11 +5193,6 @@ msgid "Use Rotation Snap"
msgstr "Usar Ajuste de rotação"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Configurar Ajuste..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Ajuste relativo"
@@ -5097,6 +5205,11 @@ msgid "Smart Snapping"
msgstr "Ajuste Inteligente"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Configurar Ajuste..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "Ajustar ao Parente"
@@ -5311,16 +5424,6 @@ msgstr "Definir Manipulador"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Erro ao carregar imagem:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Sem pixeis com transparência > 128 na imagem..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Carregar máscara de emissão"
@@ -5631,14 +5734,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "A fonte de superfície é inválida (sem faces)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "O parente não tem faces sólidas para povoar."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Ãrea não pode ser mapeada."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Selecione uma fonte Malha:"
@@ -5722,20 +5817,27 @@ msgid "Generation Time (sec):"
msgstr "Tempo de geração (s):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "As faces não contêm Ãrea!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Sem faces!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "O Nó não contêm geometria (faces)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "O Nó não contêm geometria."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "O Nó não contêm geometria (faces)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "O Nó não contêm geometria."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6067,7 +6169,6 @@ msgid "Grid Settings"
msgstr "Configurações da Grelha"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Ajustar"
@@ -6173,12 +6274,9 @@ msgid "Error writing TextFile:"
msgstr "Erro ao escrever TextFile:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Erro ao carregar ficheiro."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "Erro ao carregar ficheiro."
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "Tile não encontrado:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6201,7 +6299,8 @@ msgid "Error Importing"
msgstr "Erro ao importar"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Novo TextFile..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6282,6 +6381,11 @@ msgid "Open..."
msgstr "Abrir..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Abrir Script"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Guardar tudo"
@@ -6319,13 +6423,13 @@ msgid "Save Theme"
msgstr "Guardar tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Fechar documentos"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Fechar tudo"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Fechar documentos"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Executar"
@@ -6413,6 +6517,11 @@ msgstr "Depurador"
msgid "Search Results"
msgstr "Resultados da Pesquisa"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Limpar Cenas Recentes"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "Conecções ao método:"
@@ -6479,6 +6588,7 @@ msgid "Syntax Highlighter"
msgstr "Destaque de Sintaxe"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr "Ir Para"
@@ -6513,22 +6623,6 @@ msgid "Toggle Comment"
msgstr "Alternar comentário"
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr "Alternar Marcador"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "Ir para Próximo Marcador"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr "Ir para Marcador Anterior"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "Remover todos os Marcadores"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Fechar/Abrir Linha"
@@ -6549,6 +6643,11 @@ msgid "Complete Symbol"
msgstr "Completar símbolo"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Escalar Selecção"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Apagar espaços nos limites"
@@ -6565,29 +6664,32 @@ msgid "Auto Indent"
msgstr "Indentação automática"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Alternar Breakpoint"
+msgid "Find Previous"
+msgstr "Localizar Anterior"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Remover todos os Breakpoints"
+msgid "Find in Files..."
+msgstr "Localizar em Ficheiros..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Ir para Próximo Breakpoint"
+msgid "Contextual Help"
+msgstr "Ajuda contextual"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Ir para Breakpoint Anterior"
+msgid "Toggle Bookmark"
+msgstr "Alternar Marcador"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Localizar Anterior"
+msgid "Go to Next Bookmark"
+msgstr "Ir para Próximo Marcador"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Localizar em Ficheiros..."
+msgid "Go to Previous Bookmark"
+msgstr "Ir para Marcador Anterior"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Remover todos os Marcadores"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6598,8 +6700,21 @@ msgid "Go to Line..."
msgstr "Ir para Linha..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Ajuda contextual"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Alternar Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Remover todos os Breakpoints"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Ir para Próximo Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Ir para Breakpoint Anterior"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -6840,8 +6955,9 @@ msgid "Audio Listener"
msgstr "Audição de áudio"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Doppler Ativo"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Ativar Filtragem"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6896,8 +7012,8 @@ msgid "Snap Nodes To Floor"
msgstr "Ajustar Nós ao Fundo"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Modo seleção (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6910,30 +7026,11 @@ msgstr ""
"Alt+RMB: Seleção lista de profundidade"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Modo mover (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Modo rodar (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Modo escalar (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Coordenadas Locais"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Modo Espaço Local (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Modo Ajuste (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Vista de fundo"
@@ -6974,22 +7071,6 @@ msgid "Focus Selection"
msgstr "Focar na seleção"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Seleção de ferramenta"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Ferramenta Mover"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Ferramenta Rodar"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Ferramenta escalar"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Alternar Freelook"
@@ -7044,7 +7125,8 @@ msgstr "Ver grelha"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Configuração"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7337,10 +7419,6 @@ msgid "TextureRegion"
msgstr "TextureRegion"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "Impossível guardar tema para Ficheiro:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Adicionar todos os itens"
@@ -7425,11 +7503,13 @@ msgid "Submenu"
msgstr "Sub-menu"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+#, fuzzy
+msgid "Subitem 1"
msgstr "Item 1"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+#, fuzzy
+msgid "Subitem 2"
msgstr "Item 2"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7546,9 +7626,10 @@ msgid "Paint Tile"
msgstr "Pintar Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Shift+RMB: Desenho de Linha\n"
"Shift+Ctrl+RMB: Pintura de Retângulo"
@@ -7845,6 +7926,10 @@ msgid "TileSet"
msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(Apenas GLES3)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr "Adicionar entrada +"
@@ -7921,6 +8006,11 @@ msgid "Duplicate Nodes"
msgstr "Duplicar Nós"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Colar Nós"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "Apagar Nós"
@@ -7929,10 +8019,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "Alterado Tipo de Entrada do Visual Shader"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr "(Apenas GLES3)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "Vértice"
@@ -7945,6 +8031,11 @@ msgid "Light"
msgstr "Luz"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Criar Nó Shader"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr "Criar Nó Shader"
@@ -8307,10 +8398,11 @@ msgid "Returns the square root of the parameter."
msgstr "Devolve a raiz quadrada do parâmetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8321,10 +8413,11 @@ msgstr ""
"usando polinomiais Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Função Step( escalar(limite), escalar(x) ).\n"
"\n"
@@ -8497,6 +8590,11 @@ msgid "Linear interpolation between two vectors."
msgstr "Interpolação linear entre dois vetores."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Interpolação linear entre dois vetores."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr "Calcula o produto normalizado do vetor."
@@ -8521,10 +8619,11 @@ msgid "Returns the vector that points in the direction of refraction."
msgstr "Devolve um vetor que aponta na direção da refração."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8535,10 +8634,11 @@ msgstr ""
"usando polinomiais Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8549,20 +8649,22 @@ msgstr ""
"usando polinomiais Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Função Step( vetor(limite), vetor(x) ).\n"
"\n"
"Devolve 0.0 se 'x' for menor que 'limite', senão devolve 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"Função Step( escalar(limite), vetor(x) ).\n"
"\n"
@@ -8616,6 +8718,13 @@ msgstr ""
"da câmara (passa entradas associadas)."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr "(Apenas modo Fragment/Light) Função derivada escalar."
@@ -8842,6 +8951,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Não existem Modelos de exportação para esta plataforma:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Gerir Modelos de Exportação"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "Exportar com depuração"
@@ -9001,6 +9114,15 @@ msgid "Unnamed Project"
msgstr "Projeto sem nome"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Importar Projeto existente"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "Impossível abrir Projeto em '%s'."
@@ -9097,12 +9219,13 @@ msgstr ""
"O conteúdo da pasta não será modificado."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
-"Remover da lista todos os projeto em falta? (O conteúdo da pasta não será "
-"modificado)"
+"Remover %d projetos da lista?\n"
+"O conteúdo das pastas não será modificado."
#: editor/project_manager.cpp
msgid ""
@@ -9126,8 +9249,9 @@ msgid "Project Manager"
msgstr "Gestor de Projeto"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Lista de Projetos"
+#, fuzzy
+msgid "Projects"
+msgstr "Projeto"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9150,10 +9274,6 @@ msgid "Templates"
msgstr "Modelos"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Sair"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Reiniciar agora"
@@ -9493,6 +9613,10 @@ msgstr "Localizações:"
msgid "AutoLoad"
msgstr "Carregamento automático"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Plugins"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Zero"
@@ -9545,14 +9669,6 @@ msgstr "Selecione Método virtual"
msgid "Select Method"
msgstr "Selecione Método"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "Impossível executar ferramenta PVRTC:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr "Impossível carregar imagem convertida com a ferramenta PVRTC:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "Renomear em massa"
@@ -9846,6 +9962,11 @@ msgid "Remove Node(s)"
msgstr "Remover Nó(s)"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Mudar nome de porta de saída"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9967,24 +10088,27 @@ msgid "Node configuration warning:"
msgstr "Aviso de configuração do Nó:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"Nó tem conexões e grupos.\n"
"Clique para mostrar doca dos sinais."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"Nó tem conexões.\n"
"Clique para mostrar doca dos sinais."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"Nó está em grupo(s).\n"
@@ -10083,6 +10207,11 @@ msgid "Error loading script from %s"
msgstr "Erro ao carregar Script de '%s'"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Sobrescrever"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "N/A"
@@ -10271,6 +10400,10 @@ msgid "Change Shortcut"
msgstr "Alterar Atalho"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Configurações do Editor"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Atalhos"
@@ -10689,10 +10822,30 @@ msgid "Set Variable Type"
msgstr "Definir tipo de variável"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Não pode coincidir com um nome de um tipo incorporado já existente."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Criar novo retângulo."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Variáveis:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Criar novo retângulo."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Criar um novo polígono."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "O nome não é um identificador válido:"
@@ -10881,10 +11034,6 @@ msgid "Cut Nodes"
msgstr "Cortar Nós"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Colar Nós"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "Editar Membros"
@@ -11762,22 +11911,6 @@ msgstr ""
"Control de modo a que obtenha um tamanho. Caso contrário, torne-a um "
"RenderTarget e atribua a sua textura interna a outro Nó para visualizar."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Erro ao inicializar FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Formato de letra inválido."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Erro ao carregar letra."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Tamanho de letra inválido."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Entrada"
@@ -11810,6 +11943,106 @@ msgstr "Variações só podem ser atribuídas na função vértice."
msgid "Constants cannot be modified."
msgstr "Constantes não podem ser modificadas."
+#~ msgid "No Matches"
+#~ msgstr "Sem combinações"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "file_type_cache.cch não for guardada, por não se conseguir abrir para "
+#~ "leitura!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "'%s' não foi encontrado no Sistema de Ficheiros!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Erro ao carregar imagem:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Sem pixeis com transparência > 128 na imagem..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "O parente não tem faces sólidas para povoar."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Ãrea não pode ser mapeada."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "As faces não contêm Ãrea!"
+
+#~ msgid "No faces!"
+#~ msgstr "Sem faces!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Erro ao carregar ficheiro."
+
+#~ msgid "Error could not load file."
+#~ msgstr "Erro ao carregar ficheiro."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Doppler Ativo"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Modo seleção (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Modo mover (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Modo rodar (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Modo escalar (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Coordenadas Locais"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Modo Ajuste (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Seleção de ferramenta"
+
+#~ msgid "Tool Move"
+#~ msgstr "Ferramenta Mover"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Ferramenta Rodar"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Ferramenta escalar"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "Remover da lista todos os projeto em falta? (O conteúdo da pasta não será "
+#~ "modificado)"
+
+#~ msgid "Project List"
+#~ msgstr "Lista de Projetos"
+
+#~ msgid "Exit"
+#~ msgstr "Sair"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "Impossível executar ferramenta PVRTC:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr "Impossível carregar imagem convertida com a ferramenta PVRTC:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Erro ao inicializar FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Formato de letra inválido."
+
+#~ msgid "Error loading font."
+#~ msgstr "Erro ao carregar letra."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Tamanho de letra inválido."
+
#~ msgid "Previous Folder"
#~ msgstr "Pasta Anterior"
@@ -12581,9 +12814,6 @@ msgstr "Constantes não podem ser modificadas."
#~ msgid "Erase selection"
#~ msgstr "Apagar seleção"
-#~ msgid "Could not find tile:"
-#~ msgstr "Tile não encontrado:"
-
#~ msgid "Item name or ID:"
#~ msgstr "Nome ou ID do item:"
diff --git a/editor/translations/ro.po b/editor/translations/ro.po
index efb7ff3a4c..93589e06f6 100644
--- a/editor/translations/ro.po
+++ b/editor/translations/ro.po
@@ -63,7 +63,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Gratuit"
@@ -680,17 +679,18 @@ msgid "Line Number:"
msgstr "Linia Numărul:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "ÃŽnlocuit %d potriviri."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+#, fuzzy
+msgid "%d matches."
msgstr "Nici o Potrivire"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "ÃŽnlocuit %d potriviri."
-
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Potrivește Caz-ul"
@@ -930,8 +930,7 @@ msgstr "Favorite:"
msgid "Recent:"
msgstr "Recent:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1035,7 +1034,7 @@ msgstr ""
"sa funcționeze.\n"
"Ștergeți oricum? (fără anulare)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Nu se poate șterge:"
@@ -1073,7 +1072,7 @@ msgstr "Ștergeți permanent %d articol(e)? (Fără anulare!)"
msgid "Show Dependencies"
msgstr "Dependențe"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Explorator de Resurse Orfane"
@@ -1162,14 +1161,16 @@ msgid "License"
msgstr "Licență"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Licenţe Thirdparty"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Motorul Godot se bazează pe un număr de biblioteci thirdparty gratis și "
@@ -1190,7 +1191,8 @@ msgid "Licenses"
msgstr "Licențe"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Eroare la deschiderea fişierului pachet, nu este în format zip."
#: editor/editor_asset_installer.cpp
@@ -1704,12 +1706,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importă"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Exportare"
@@ -2144,6 +2145,10 @@ msgstr "Curăță"
msgid "Clear Output"
msgstr "Curăță Afișarea"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Exportul de proiect nu a reuÅŸit cu un cod de eroare %d."
@@ -2470,6 +2475,15 @@ msgid "Pick a Main Scene"
msgstr "Alege o Scenă Principală"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "ÃŽnchide Scena"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "ÃŽnchide Scena"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Nu se poate inițializa plugin-ul la: '%s' analizarea configurației a eșuat."
@@ -2586,6 +2600,11 @@ msgstr "Rulează Scena"
msgid "Close Tab"
msgstr "Aproape"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Aproape"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2672,6 +2691,10 @@ msgstr "Scenă Derivată Nouă..."
msgid "Open Scene..."
msgstr "Deschide Scena..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Deschide Recente"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Salvează Scena"
@@ -2682,14 +2705,6 @@ msgid "Save All Scenes"
msgstr "Salvează toate Scenele"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "ÃŽnchide Scena"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Deschide Recente"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Convertește În..."
@@ -2719,26 +2734,37 @@ msgstr "Restabilește Scena"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Proiect Divers sau unelte pentru scenă."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Proiect"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Setări ale Proiectului"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Unelte"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Exportare"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "Deschizi Managerul de Proiect?"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Unelte"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Explorator de Resurse Orfane"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2836,12 +2862,13 @@ msgstr ""
"Când această opțiune este folosită de la distanță pe un dispozitiv, este "
"mult mai eficient dacă este folosit un sistem de fișiere în rețea."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Editor"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Setări ale Editorului"
#: editor/editor_node.cpp
@@ -2883,14 +2910,15 @@ msgstr "Setări ale Editorului"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "Administrează Șabloanele de Export"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Administrează Șabloanele de Export"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Ajutor"
@@ -2898,12 +2926,13 @@ msgstr "Ajutor"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Căutare"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Documentație Online"
@@ -3357,7 +3386,8 @@ msgid "Import From Node:"
msgstr "Importă Din Nod:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Descarcă din nou"
#: editor/export_template_manager.cpp
@@ -3374,6 +3404,10 @@ msgid "Download"
msgstr "Descarcă"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Lipsește)"
@@ -3438,12 +3472,10 @@ msgid "No response."
msgstr "Niciun răspuns."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Cerere Eșuată."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Buclă de Redirecționare."
@@ -3457,13 +3489,19 @@ msgid "Download Complete."
msgstr "Descărcare Completă."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Nu se poate șterge:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Eroare la solicitarea URL: "
#: editor/export_template_manager.cpp
@@ -3551,24 +3589,12 @@ msgstr "Descarcă Șabloane"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Selectează oglinda din listă: "
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Nu se poate deschide file_type_cache.cch pentru scriere, nu se salvează "
-"fișierul tip cache!"
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "Favorite:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"Nu se poate naviga către '%s' pentru că nu a fost găsit în sistemul de "
-"fișiere!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Stare: Importarea fișierului eșuată. Te rog repară fișierul și reimportă "
@@ -3604,14 +3630,14 @@ msgid "Provided name contains invalid characters."
msgstr "Numele furnizat conține caractere nevalide"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Numele furnizat conține caractere nevalide."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Un fișier sau un director cu acest nume există deja."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Numele furnizat conține caractere nevalide."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Redenumind fișierul:"
@@ -3671,6 +3697,11 @@ msgstr "Duplicați..."
msgid "Move To..."
msgstr "Mută În..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Scenă Nouă"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3745,6 +3776,11 @@ msgstr "Un fișier sau un director cu acest nume există deja."
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Salvează Scena"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3814,6 +3850,14 @@ msgid "Search complete"
msgstr "Căutați Text"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Adaugă în Grup"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Elimină din Grup"
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "EROARE: Numele animației există deja!"
@@ -3823,13 +3867,23 @@ msgstr "EROARE: Numele animației există deja!"
msgid "Invalid group name."
msgstr "Nume nevalid."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Grupuri"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Șterge Schema"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupuri"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr "Adaugă în Grup"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3843,12 +3897,13 @@ msgid "Nodes in Group"
msgstr "Adaugă în Grup"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Adaugă în Grup"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Elimină din Grup"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Deschide Editorul de Scripturi"
#: editor/groups_editor.cpp
#, fuzzy
@@ -4060,7 +4115,8 @@ msgid "MultiNode Set"
msgstr "Set MultiNod"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Selectează un Nod pentru a edita Semnalele și Grupurile."
#: editor/plugin_config_dialog.cpp
@@ -4860,10 +4916,6 @@ msgid "View Files"
msgstr "Vizualizează Fișierele"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Nu se poate rezolva numele gazdei:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Eroare la conectare, te rog încearcă din nou."
@@ -4876,14 +4928,47 @@ msgid "No response from host:"
msgstr "Nciun răspuns de la gazda:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Nu se poate rezolva numele gazdei:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Cerere eșuată, cod returnat:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Cerere Eșuată."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Nu se poate șterge:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Cerere eșuată, prea multe redirecționări"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Buclă de Redirecționare."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Cerere eșuată, cod returnat:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Timp"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Hash eronat de descărcare, se presupune că fișierul este falsificat."
@@ -4966,8 +5051,13 @@ msgid "All"
msgstr "Toate"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Importă"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Plugin-uri"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4989,7 +5079,8 @@ msgid "Site:"
msgstr "Site:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Suport..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -5001,6 +5092,11 @@ msgid "Testing"
msgstr "Se Testează"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Încărcați"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Fișier ZIP cu Asset-uri"
@@ -5179,6 +5275,11 @@ msgstr "Lipește Postura"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "Curăță Postura"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Creează Puncte de Emisie Din Mesh"
@@ -5209,6 +5310,7 @@ msgid "Zoom Reset"
msgstr "Zoom-ați Afară"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Mod Selectare"
@@ -5231,14 +5333,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+RMB: Selecție adâncime listă"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Mod Mutare"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Mod Rotație"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "Mod Redimensionare (R)"
@@ -5266,6 +5371,7 @@ msgid "Toggle snapping."
msgstr "Comutare snapping"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Utilizează Snap"
@@ -5284,11 +5390,6 @@ msgid "Use Rotation Snap"
msgstr "Folosește Rotația Snap"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Configurare Snap..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Snap Relativ"
@@ -5302,6 +5403,11 @@ msgid "Smart Snapping"
msgstr "Snapping inteligent"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Configurare Snap..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
msgstr "Snap către părinte"
@@ -5524,16 +5630,6 @@ msgstr "Setează Mâner"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Eroare la încărcarea imaginii:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Nici un pixel cu transparența > 128 în imagine..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Încărcare Mască de Emisie"
@@ -5856,14 +5952,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Sursa suprafeței nevalidă (nu există fețe)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "Părintele nu are fețe solide pentru a fi populate."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Nu s-a putut mapa zona."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Selectează un Mesh Sursă:"
@@ -5950,20 +6038,27 @@ msgid "Generation Time (sec):"
msgstr "Timp de Generare (sec):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Unele fețe nu conțin zonă!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Nici o zonă!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Nodul nu conține geometrie (fețe)."
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Nodul nu conține geometrie."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Nodul nu conține geometrie (fețe)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Nodul nu conține geometrie."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6305,7 +6400,6 @@ msgid "Grid Settings"
msgstr "Setări ale Editorului"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Aliniere"
@@ -6420,12 +6514,7 @@ msgstr "Eroare la salvarea TileSet!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "Directorul nu a putut fi creat."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "Directorul nu a putut fi creat."
#: editor/plugins/script_editor_plugin.cpp
@@ -6455,7 +6544,7 @@ msgstr "Eroare mutând:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "Director Nou..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6541,6 +6630,11 @@ msgid "Open..."
msgstr "Deschide"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Execută Scriptul"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6580,11 +6674,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6675,6 +6769,11 @@ msgstr ""
msgid "Search Results"
msgstr "Căutați în Ajutor"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Curăță Scenele Recente"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6747,6 +6846,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6782,26 +6882,6 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Modul de Comutare"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Mergeți la Pasul Următor"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Mergeți la Pasul Anterior"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Eliminați Autoload"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr ""
@@ -6822,6 +6902,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Scalați Selecția"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6838,32 +6923,37 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Filtrează fișierele..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "Mergeți la Pasul Următor"
+msgid "Toggle Bookmark"
+msgstr "Modul de Comutare"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "Mergeți la Pasul Anterior"
+msgid "Go to Next Bookmark"
+msgstr "Mergeți la Pasul Următor"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Mergeți la Pasul Anterior"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Filtrează fișierele..."
+msgid "Remove All Bookmarks"
+msgstr "Eliminați Autoload"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6876,9 +6966,24 @@ msgid "Go to Line..."
msgstr "Duceți-vă la Linie"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Mergeți la Pasul Următor"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Mergeți la Pasul Anterior"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -7120,8 +7225,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Activare mod Doppler"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Schimbați Lung Anim"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7177,7 +7283,7 @@ msgid "Snap Nodes To Floor"
msgstr "Snap pe grilă"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7188,30 +7294,10 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Mod Redimensionare (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Mod Snap (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr ""
@@ -7252,22 +7338,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Unealtă Dimensiune"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -7323,8 +7393,9 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
-msgstr ""
+#, fuzzy
+msgid "Settings..."
+msgstr "Setări Snap"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7634,10 +7705,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7727,12 +7794,12 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "Obiect %d"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "Obiect %d"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7856,8 +7923,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8174,6 +8241,10 @@ msgid "TileSet"
msgstr "Set_de_Plăci..."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Adaugă Intrare(Input)"
@@ -8263,6 +8334,11 @@ msgid "Duplicate Nodes"
msgstr "Anim Clonare Chei"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Creează Nod"
@@ -8272,10 +8348,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -8289,6 +8361,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Creează Nod"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Creează Nod"
@@ -8656,7 +8733,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8665,7 +8742,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8829,6 +8906,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8854,7 +8935,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8863,7 +8944,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8872,14 +8953,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8924,6 +9005,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9138,6 +9226,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Administrează Șabloanele de Export"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9285,6 +9377,15 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "Proiect"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "Imposibil de deschis '%s'."
@@ -9361,8 +9462,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9382,8 +9483,9 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "Proiect"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9407,10 +9509,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9753,6 +9851,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Plugin-uri"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9805,14 +9907,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10114,6 +10208,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10241,19 +10339,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10350,6 +10448,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10547,6 +10649,10 @@ msgid "Change Shortcut"
msgstr "Modifică Ancorele"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Setări ale Editorului"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10964,10 +11070,32 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr ""
+"Nume nevalid. Nu trebuie să se lovească cu un nume de tip deja existent în "
+"motor tip."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Creați %s Nou"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Creați %s Nou"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Creează un nou poligon de la zero."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -11155,10 +11283,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "Membri"
@@ -11901,22 +12025,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
#, fuzzy
msgid "Input"
@@ -11950,6 +12058,51 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Nu se poate deschide file_type_cache.cch pentru scriere, nu se salvează "
+#~ "fișierul tip cache!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "Nu se poate naviga către '%s' pentru că nu a fost găsit în sistemul de "
+#~ "fișiere!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Eroare la încărcarea imaginii:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Nici un pixel cu transparența > 128 în imagine..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Părintele nu are fețe solide pentru a fi populate."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Nu s-a putut mapa zona."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Unele fețe nu conțin zonă!"
+
+#~ msgid "No faces!"
+#~ msgstr "Nici o zonă!"
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "Directorul nu a putut fi creat."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Activare mod Doppler"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Mod Redimensionare (R)"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Mod Snap (%s)"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Unealtă Dimensiune"
+
#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "Fila anterioară"
diff --git a/editor/translations/ru.po b/editor/translations/ru.po
index 24fb5100bb..3e61d4d683 100644
--- a/editor/translations/ru.po
+++ b/editor/translations/ru.po
@@ -53,12 +53,14 @@
# Sergey <www.window1@mail.ru>, 2019.
# Vladislav <onion.ring@mail.ru>, 2019.
# knightpp <kotteam99@gmail.com>, 2019.
+# КонÑтантин Рин <email.to.rean@gmail.com>, 2019.
+# Maxim Samburskiy <alpacones@outlook.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-29 19:20+0000\n"
-"Last-Translator: knightpp <kotteam99@gmail.com>\n"
+"PO-Revision-Date: 2019-08-29 13:35+0000\n"
+"Last-Translator: КонÑтантин Рин <email.to.rean@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/"
"godot/ru/>\n"
"Language: ru\n"
@@ -67,7 +69,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -110,7 +112,6 @@ msgid "On call to '%s':"
msgstr "Ðа вызове '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "ОÑвободить"
@@ -120,7 +121,7 @@ msgstr "СбаланÑированный"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
-msgstr "Отобразить"
+msgstr "Отразить"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
@@ -238,7 +239,7 @@ msgstr "Трек ВоÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ðнимации"
#: editor/animation_track_editor.cpp
msgid "Animation length (frames)"
-msgstr "ПродолжительноÑть анимации (в кадрах)"
+msgstr "Длина анимации (в кадрах)"
#: editor/animation_track_editor.cpp
msgid "Animation length (seconds)"
@@ -509,7 +510,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
-msgstr "Внимание: Редактирование импортированной анимации. "
+msgstr "Предупреждение: Редактирование импортированной анимации"
#: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
@@ -695,16 +696,18 @@ msgid "Line Number:"
msgstr "Ðомер Ñтроки:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "Ðайдено %d Ñовпадений."
+msgid "Replaced %d occurrence(s)."
+msgstr "Заменено %d Ñовпадений."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Ðет Ñовпадений"
+#, fuzzy
+msgid "%d match."
+msgstr "Ðайдено %d Ñовпадений."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Заменено %d Ñовпадений."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Ðайдено %d Ñовпадений."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -757,7 +760,7 @@ msgstr "Ðомера Ñтрок и Ñтолбцов."
#: editor/connections_dialog.cpp
msgid "Method in target node must be specified."
-msgstr "Метод должен быть указан в целевом Узле. "
+msgstr "Метод должен быть указан в целевом узле."
#: editor/connections_dialog.cpp
msgid ""
@@ -856,7 +859,6 @@ msgid "Connect"
msgstr "ПриÑоединить"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Signal:"
msgstr "Сигналы:"
@@ -883,7 +885,7 @@ msgstr "ОтÑоединить"
#: editor/connections_dialog.cpp
msgid "Connect a Signal to a Method"
-msgstr "Подключить Сигнал к Методу: "
+msgstr "Подключить Сигнал к Методу"
#: editor/connections_dialog.cpp
msgid "Edit Connection:"
@@ -934,8 +936,7 @@ msgstr "Избранное:"
msgid "Recent:"
msgstr "Ðедавнее:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1023,9 +1024,8 @@ msgid "Owners Of:"
msgstr "Владельцы:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr "Удалить выбранный файл из проекта? (ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ!)"
+msgstr "Удалить выбранные файлы из проекта? (ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ!)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1036,7 +1036,7 @@ msgstr ""
"УдалÑемый файл требуетÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð¹ работы других реÑурÑов.\n"
"Ð’ÑÑ‘ равно удалить его? (ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ!)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ:"
@@ -1072,7 +1072,7 @@ msgstr "ÐавÑегда удалить %d Ñлемент(ов)? (ÐÐµÐ»ÑŒÐ·Ñ Ð
msgid "Show Dependencies"
msgstr "Показать завиÑимоÑти"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Обзор подключённых реÑурÑов"
@@ -1161,14 +1161,16 @@ msgid "License"
msgstr "ЛицензиÑ"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Сторонние Лицензии"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Движок Godot опираетÑÑ Ð½Ð° Ñ€Ñд Ñторонних беÑплатных и открытых библиотек, "
@@ -1189,7 +1191,8 @@ msgid "Licenses"
msgstr "Лицензии"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Ошибка при открытии файла пакета, не в формате zip."
#: editor/editor_asset_installer.cpp
@@ -1401,7 +1404,6 @@ msgid "Must not collide with an existing global constant name."
msgstr "Ðе должно конфликтовать Ñ ÑущеÑтвующим глобальным именем конÑтанты."
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Keyword cannot be used as an autoload name."
msgstr "Ключевое Ñлово Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать как Ð¸Ð¼Ñ Ð°Ð²Ñ‚Ð¾Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸."
@@ -1625,17 +1627,14 @@ msgid "Profile with this name already exists."
msgstr "Профиль Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует."
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled, Properties Disabled)"
msgstr "(Редактор отключен, СвойÑтва отключены)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Properties Disabled)"
msgstr "(СвойÑтва отключены)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled)"
msgstr "(Редактор отключен)"
@@ -1650,23 +1649,20 @@ msgid "Enable Contextual Editor"
msgstr "Открыть Ñледующий редактор"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Properties:"
-msgstr "СвойÑтва:"
+msgstr "ДоÑтупные ÑвойÑтва:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Features:"
-msgstr "ОÑобенноÑти"
+msgstr "ДоÑтупные функции:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Classes:"
-msgstr "ПоиÑк клаÑÑов"
+msgstr "ДоÑтупные клаÑÑÑ‹:"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
-msgstr ""
+msgstr "Ðеверный формат файла \"% s\", импорт прерван."
#: editor/editor_feature_profile.cpp
msgid ""
@@ -1700,12 +1696,11 @@ msgid "New"
msgstr "Ðовый"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Импорт"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "ЭкÑпорт"
@@ -1849,7 +1844,6 @@ msgid "Move Favorite Down"
msgstr "ПеремеÑтить избранное вниз"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
msgstr "Перейти к родительÑкой папке."
@@ -2113,6 +2107,11 @@ msgstr "ОчиÑтить"
msgid "Clear Output"
msgstr "ОчиÑтить вывод"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "Окно"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "ЭкÑпорт проекта не удалÑÑ, код %d."
@@ -2316,9 +2315,8 @@ msgid "Open Base Scene"
msgstr "Открыть оÑновную Ñцену"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "БыÑтро открыть Ñцену..."
+msgstr "БыÑтрый доÑтуп..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
@@ -2438,6 +2436,15 @@ msgid "Pick a Main Scene"
msgstr "Выберите главную Ñцену"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Закрыть Ñцену"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Закрыть Ñцену"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr "Ðе удаётÑÑ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ плагин: '%s' ошибка конфигурации."
@@ -2551,6 +2558,11 @@ msgstr "ЗапуÑтить Ñцену"
msgid "Close Tab"
msgstr "Закрыть вкладку"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Закрыть вкладку"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Закрыть другие вкладки"
@@ -2560,9 +2572,8 @@ msgid "Close Tabs to the Right"
msgstr "Закрыть вкладки Ñправа"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "Закрыть вÑÑ‘"
+msgstr "Закрыть вÑе вкладки"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2637,6 +2648,10 @@ msgstr "ÐÐ¾Ð²Ð°Ñ ÑƒÐ½Ð°ÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¡Ñ†ÐµÐ½Ð°..."
msgid "Open Scene..."
msgstr "Открыть Ñцену..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Открыть поÑледнее"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Сохранить Ñцену"
@@ -2646,14 +2661,6 @@ msgid "Save All Scenes"
msgstr "Сохранить вÑе Ñцены"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Закрыть Ñцену"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Открыть поÑледнее"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Конвертировать в..."
@@ -2683,25 +2690,36 @@ msgstr "ВоÑÑтановить Ñцену"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Прочие инÑтрументы."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Проект"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Параметры проекта"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "ИнÑтрументы"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr "ЭкÑпортировать..."
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "УÑтановить шаблон Ñборки Android"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Открыть папку Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ проекта"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "ИнÑтрументы"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "УÑтановить шаблон Ñборки Android"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Обзор подключённых реÑурÑов"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2799,12 +2817,13 @@ msgstr ""
"При удалённом иÑпользовании на уÑтройÑтве, Ñто работает более Ñффективно Ñ "
"Ñетевой файловой ÑиÑтемой."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Редактор"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "ÐаÑтройки редактора"
#: editor/editor_node.cpp
@@ -2812,9 +2831,8 @@ msgid "Editor Layout"
msgstr "Макет редактора"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Take Screenshot"
-msgstr "Создать корневой узел Ñцены"
+msgstr "Сделать Ñнимок Ñкрана"
#: editor/editor_node.cpp
#, fuzzy
@@ -2844,14 +2862,15 @@ msgstr "Открыть папку наÑтроек редактора"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "Управление шаблонами ÑкÑпорта"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Управление шаблонами ÑкÑпорта"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Справка"
@@ -2859,12 +2878,13 @@ msgstr "Справка"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "ПоиÑк"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Онлайн ДокументациÑ"
@@ -2938,9 +2958,8 @@ msgid "Spins when the editor window redraws."
msgstr "ВращаетÑÑ, когда окно редактора перериÑовываетÑÑ."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Continuously"
-msgstr "ÐепрерывнаÑ"
+msgstr "Ðепрерывное обновление"
#: editor/editor_node.cpp
#, fuzzy
@@ -2948,9 +2967,8 @@ msgid "Update When Changed"
msgstr "ОбновлÑть при изменениÑÑ…"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Hide Update Spinner"
-msgstr "Отключить Ñчётчик обновлений"
+msgstr "Скрыть индикатор обновлений"
#: editor/editor_node.cpp
msgid "FileSystem"
@@ -3318,7 +3336,8 @@ msgid "Import From Node:"
msgstr "Импортировать из Узла:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Перезагрузить"
#: editor/export_template_manager.cpp
@@ -3335,6 +3354,10 @@ msgid "Download"
msgstr "Загрузка"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(ОтÑутÑтвует)"
@@ -3398,12 +3421,10 @@ msgid "No response."
msgstr "Ðет ответа."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Ðе удалоÑÑŒ выполнить запроÑ."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "ЦикличеÑкое перенаправление."
@@ -3417,14 +3438,21 @@ msgid "Download Complete."
msgstr "Загрузка завершена."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Ðевозможно Ñохранить тему в файл:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Ошибка уÑтановки шаблона. Ðрхив Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð½Ñ‹Ð¼ шаблоном можно найти в '%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Ошибка запроÑа адреÑа ÑÑылки: "
#: editor/export_template_manager.cpp
@@ -3495,7 +3523,6 @@ msgid "Remove Template"
msgstr "Удалить шаблон"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select Template File"
msgstr "Выбрать файл шаблона"
@@ -3511,22 +3538,11 @@ msgstr "Загрузить Шаблоны"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Выберите зеркало из ÑпиÑка: (Shift+Click: Открыть в браузере)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Ðевозможно открыть file_type_cache.cch Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи. Ðе будет Ñохранён кÑш "
-"типов файлов!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Избранное"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"Ðе удаетÑÑ Ð¿ÐµÑ€ÐµÐ¹Ñ‚Ð¸ к '%s', так как он не был найден в файловой ÑиÑтеме!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"СтатуÑ: Импорт файла не удалÑÑ. ПожалуйÑта, иÑправьте файл и "
@@ -3557,12 +3573,7 @@ msgid "No name provided."
msgstr "Ðе предоÑтавлено имÑ."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Provided name contains invalid characters."
-msgstr "Ð˜Ð¼Ñ Ñодержит недопуÑтимые Ñимволы"
-
-#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
msgstr "Ð˜Ð¼Ñ Ñодержит недопуÑтимые Ñимволы."
#: editor/filesystem_dock.cpp
@@ -3570,6 +3581,10 @@ msgid "A file or folder with this name already exists."
msgstr "Файл или папка Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Ð˜Ð¼Ñ Ñодержит недопуÑтимые Ñимволы."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Переименование файла:"
@@ -3586,26 +3601,22 @@ msgid "Duplicating folder:"
msgstr "Дублирование папки:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Inherited Scene"
-msgstr "ÐÐ¾Ð²Ð°Ñ ÑƒÐ½Ð°ÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¡Ñ†ÐµÐ½Ð°..."
+msgstr "ÐÐ¾Ð²Ð°Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ñцена"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open Scenes"
-msgstr "Открыть Ñцену"
+msgstr "Открыть Ñцены"
#: editor/filesystem_dock.cpp
msgid "Instance"
msgstr "Добавить ÑкземплÑÑ€"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to Favorites"
msgstr "Добавить в избранное"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from Favorites"
msgstr "Удалить из избранного"
@@ -3629,6 +3640,11 @@ msgstr "Дублировать..."
msgid "Move To..."
msgstr "ПеремеÑтить в..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "ÐÐ¾Ð²Ð°Ñ Ñцена"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Ðовый Ñкрипт..."
@@ -3655,21 +3671,18 @@ msgid "Rename"
msgstr "Переименовать"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Previous Folder/File"
-msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°"
+msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°/файл"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Next Folder/File"
-msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°"
+msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°/файл"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
msgstr "ПереÑканировать файловую ÑиÑтему"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle Split Mode"
msgstr "Переключить режим разделениÑ"
@@ -3697,6 +3710,11 @@ msgstr "По Ñтому пути уже ÑущеÑтвует файл или пÐ
msgid "Overwrite"
msgstr "ПерезапиÑать"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Создать из Ñцены"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Создать Ñкрипт"
@@ -3757,6 +3775,14 @@ msgid "Search complete"
msgstr "ПоиÑк завершен"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Добавить в группу"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Удалить из группы"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ уже ÑущеÑтвует."
@@ -3764,12 +3790,23 @@ msgstr "Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ уже ÑущеÑтвует."
msgid "Invalid group name."
msgstr "Ðеверное название группы."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Управление Группами"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Удалено изображение группы"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Группы"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Узлы не в Группе"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3782,12 +3819,12 @@ msgid "Nodes in Group"
msgstr "Узлы в Группе"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Добавить в группу"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Удалить из группы"
+msgid "Group Editor"
+msgstr "Редактор групп"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3995,7 +4032,8 @@ msgid "MultiNode Set"
msgstr "Мульти-узловый набор"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Выберите узел Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñигналов и групп."
#: editor/plugin_config_dialog.cpp
@@ -4161,9 +4199,8 @@ msgid "Open Animation Node"
msgstr "Открыть Узел Ðнимации"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists."
-msgstr "Треугольник уже ÑущеÑтвует"
+msgstr "Треугольник уже ÑущеÑтвует."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Add Triangle"
@@ -4233,9 +4270,8 @@ msgstr "Добавить узел к BlendTree"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Node Moved"
-msgstr "Режим перемещениÑ"
+msgstr "Узел перемещён"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
@@ -4253,9 +4289,8 @@ msgid "Nodes Disconnected"
msgstr "Узлы разъединены"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Set Animation"
-msgstr "ÐнимациÑ"
+msgstr "Задать Ðнимацию"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -4760,10 +4795,6 @@ msgid "View Files"
msgstr "ПроÑмотр Файлов"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Ðевозможно определить Ð¸Ð¼Ñ Ñ…Ð¾Ñта:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Ошибка подключениÑ, попробуйте ещё раз."
@@ -4776,14 +4807,47 @@ msgid "No response from host:"
msgstr "Ðет ответа от хоÑта:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Ðевозможно определить Ð¸Ð¼Ñ Ñ…Ð¾Ñта:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ удалÑÑ, код:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Ðе удалоÑÑŒ выполнить запроÑ."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Ðевозможно Ñохранить тему в файл:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ прошёл, Ñлишком много перенаправлений"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "ЦикличеÑкое перенаправление."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ удалÑÑ, код:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "ВремÑ"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "ÐеÑовпадение Ñ…Ñша загрузки, возможно файл был изменён."
@@ -4824,9 +4888,8 @@ msgid "Idle"
msgstr "ПроÑтой"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "УÑтановить"
+msgstr "УÑтановить..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -4861,8 +4924,13 @@ msgid "All"
msgstr "Ð’Ñе"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Переимпортировать..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Плагины"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4870,9 +4938,8 @@ msgid "Sort:"
msgstr "Сортировать:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Reverse sorting."
-msgstr "Запрашиваю..."
+msgstr "ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ Ñортировка."
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
@@ -4884,7 +4951,8 @@ msgid "Site:"
msgstr "Сайт:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Поддержка..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4896,6 +4964,11 @@ msgid "Testing"
msgstr "ТеÑтируемые"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Загрузка..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "ZIP файл аÑÑетов"
@@ -4957,14 +5030,12 @@ msgid "Move Vertical Guide"
msgstr "Перемещение вертикальной направлÑющей"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Vertical Guide"
msgstr "Создать вертикальную направлÑющую"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Vertical Guide"
-msgstr "Убрать вертикальную направлÑющую"
+msgstr "Удалить вертикальную направлÑющую"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -4972,19 +5043,16 @@ msgid "Move Horizontal Guide"
msgstr "ПеремеÑтить горизонтальную направлÑющую"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal Guide"
-msgstr "Создать новую горизонтальную направлÑющую"
+msgstr "Создать горизонтальную направлÑющую"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Horizontal Guide"
msgstr "Удалить горизонтальную направлÑющую"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal and Vertical Guides"
-msgstr "Создание новых горизонтальных и вертикальных направлÑющих"
+msgstr "Создать горизонтальные и вертикальные направлÑющие"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move pivot"
@@ -5040,27 +5108,23 @@ msgstr "Изменить привÑзку"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock Selected"
-msgstr "ИнÑтрумент выбора"
+msgstr "Заблокировать выбранное"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Unlock Selected"
-msgstr "Удалить выделенное"
+msgstr "Разблокировать выделенное"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Group Selected"
-msgstr "Копировать выделенное"
+msgstr "Сгруппировать выделенное"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Ungroup Selected"
-msgstr "Копировать выделенное"
+msgstr "Разгруппировать выделенное"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Paste Pose"
@@ -5068,6 +5132,11 @@ msgstr "Ð’Ñтавить позу"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "ОчиÑтить позу"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Сделать ПользовательÑкие КоÑть(и) от Узла(ов)"
@@ -5099,6 +5168,7 @@ msgid "Zoom Reset"
msgstr "СброÑить маÑштабирование"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Режим выделениÑ"
@@ -5121,14 +5191,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+ПКМ: СпиÑок выбора глубины"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Режим перемещениÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Режим поворота"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Режим маÑштабированиÑ"
@@ -5154,6 +5227,7 @@ msgid "Toggle snapping."
msgstr "Переключить привÑзки."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "ИÑпользовать привÑзку"
@@ -5162,7 +5236,6 @@ msgid "Snapping Options"
msgstr "Параметры ПривÑзки"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Grid"
msgstr "ПривÑзка к Ñетке"
@@ -5171,11 +5244,6 @@ msgid "Use Rotation Snap"
msgstr "ИÑпользовать привÑзку вращениÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "ÐаÑтроить привÑзку..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "ОтноÑÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¸Ð²Ñзка"
@@ -5184,12 +5252,15 @@ msgid "Use Pixel Snap"
msgstr "ИÑпользовать попикÑельную привÑзку"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Smart Snapping"
msgstr "Ð˜Ð½Ñ‚ÐµÐ»Ð»ÐµÐºÑ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¸Ð²Ñзка"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "ÐаÑтроить привÑзку..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "ПривÑзка к родителю"
@@ -5214,7 +5285,6 @@ msgid "Snap to Other Nodes"
msgstr "ПривÑзка к другим узлам"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Guides"
msgstr "ПривÑзка к направлÑющим"
@@ -5418,16 +5488,6 @@ msgstr "Задать обработчик"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Ошибка при загрузке изображениÑ:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Ðикаких пикÑелей Ñ Ð¿Ñ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ð¾Ñтью > 128 в изображении..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "МаÑка выброÑа загружена"
@@ -5435,9 +5495,8 @@ msgstr "МаÑка выброÑа загружена"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Restart"
-msgstr "ПерезапуÑтить ÑейчаÑ"
+msgstr "ПерезапуÑтить"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5519,12 +5578,10 @@ msgid "Load Curve Preset"
msgstr "Загрузить заготовку кривой"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Add Point"
msgstr "Добавить точку"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Remove Point"
msgstr "Удалить точку"
@@ -5605,9 +5662,8 @@ msgid "Failed creating shapes!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Create Convex Shape(s)"
-msgstr "Создать выгнутую форму"
+msgstr "Создать выпуклую форму(ы)"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5749,14 +5805,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "ПоверхноÑть иÑточника недопуÑтима (нет граней)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "Родитель не имеет твёрдых граней Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Ðе удалоÑÑŒ отобразить облаÑть."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Выберите иÑточник полиÑетки:"
@@ -5840,20 +5888,27 @@ msgid "Generation Time (sec):"
msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ (Ñек):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Грани не Ñодержат зоны!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Узел не Ñодержит геометрии (грани)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Ðет граней!"
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Узел не Ñодержит геометрии."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Узел не Ñодержит геометрии (грани)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Узел не Ñодержит геометрии."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6187,7 +6242,6 @@ msgid "Grid Settings"
msgstr "Параметры Ñетки"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "ПривÑзка"
@@ -6293,12 +6347,9 @@ msgid "Error writing TextFile:"
msgstr "Ошибка при запиÑи:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Ошибка: Ðе удалоÑÑŒ загрузить файл."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "Ðе удалоÑÑŒ загрузить файл."
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "Ðевозможно найти тайл:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6321,7 +6372,8 @@ msgid "Error Importing"
msgstr "Ошибка Импорта"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Создать текÑтовый файл..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6405,6 +6457,11 @@ msgid "Open..."
msgstr "Открыть..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Открыть Ñкрипт"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Сохранить вÑÑ‘"
@@ -6442,13 +6499,13 @@ msgid "Save Theme"
msgstr "Сохранить тему"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Закрыть документацию"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Закрыть вÑÑ‘"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Закрыть документацию"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "ЗапуÑтить"
@@ -6538,20 +6595,23 @@ msgstr "Отладчик"
msgid "Search Results"
msgstr "Результаты поиÑка"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "ОчиÑтить поÑледние Ñцены"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
msgstr "ПриÑоединить к узлу:"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Source"
-msgstr "ИÑточник:"
+msgstr "ИÑточник"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Signal"
-msgstr "Сигналы"
+msgstr "Сигнал"
#: editor/plugins/script_text_editor.cpp
msgid "Target"
@@ -6608,18 +6668,18 @@ msgid "Syntax Highlighter"
msgstr "ПодÑветка СинтакÑиÑа"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
-msgstr ""
+msgstr "Перейти к"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Bookmarks"
-msgstr ""
+msgstr "Закладки"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Breakpoints"
-msgstr "Создать точки."
+msgstr "Точки оÑтанова"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -6643,26 +6703,6 @@ msgid "Toggle Comment"
msgstr "Переключить комментарий"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Переключить Ñвободный обзор"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Перейти к Ñледующей точке оÑтановки"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Перейти к предыдущей точке оÑтановки"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Удалить вÑе Ñлементы"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Свернуть/Развернуть Ñтроку"
@@ -6683,6 +6723,11 @@ msgid "Complete Symbol"
msgstr "СпиÑок автозавершениÑ"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "МаÑштабировать выбранное"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Удаление пробелов в конце Ñтрок"
@@ -6699,29 +6744,33 @@ msgid "Auto Indent"
msgstr "ÐвтоотÑтуп"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Точка оÑтановки"
+msgid "Find Previous"
+msgstr "Ðайти предыдущее"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Удалить вÑе точки оÑтановок"
+msgid "Find in Files..."
+msgstr "Ðайти в файлах..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Перейти к Ñледующей точке оÑтановки"
+msgid "Contextual Help"
+msgstr "КонтекÑÑ‚Ð½Ð°Ñ Ñправка"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Перейти к предыдущей точке оÑтановки"
+#, fuzzy
+msgid "Toggle Bookmark"
+msgstr "Переключить Ñвободный обзор"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Ðайти предыдущее"
+msgid "Go to Next Bookmark"
+msgstr "Перейти к Ñледующей закладке"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Ðайти в файлах..."
+msgid "Go to Previous Bookmark"
+msgstr "Перейти к предыдущей закладке"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Удалить вÑе закладки"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6732,8 +6781,21 @@ msgid "Go to Line..."
msgstr "Перейти к Ñтроке..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "КонтекÑÑ‚Ð½Ð°Ñ Ñправка"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Точка оÑтановки"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Удалить вÑе точки оÑтановок"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Перейти к Ñледующей точке оÑтановки"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Перейти к предыдущей точке оÑтановки"
#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
@@ -6977,8 +7039,9 @@ msgid "Audio Listener"
msgstr "ПроÑлушиватель звука"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "ДоплеровÑкий режим"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Включить фильтр"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -7035,8 +7098,8 @@ msgid "Snap Nodes To Floor"
msgstr "ПодравнÑть Узел Ñ ÐŸÐ¾Ð»Ð¾Ð¼"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Режим Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7049,30 +7112,11 @@ msgstr ""
"Alt+ПКМ: Выбор по ÑпиÑку"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Режим Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Режим поворота (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Режим маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Локальные координаты"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Режим локального проÑтранÑтва (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Режим привÑзки (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Вид Снизу"
@@ -7114,22 +7158,6 @@ msgid "Focus Selection"
msgstr "Показать выбранное"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "ИнÑтрумент выбора"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "ИнÑтрумент перемещениÑ"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "ИнÑтрумент поворот"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "ИнÑтрумент маÑштаб"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Переключить Ñвободный обзор"
@@ -7185,7 +7213,8 @@ msgstr "Отображать Ñетку"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "ÐаÑтройки"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7258,19 +7287,16 @@ msgid "Create Mesh2D"
msgstr "Создать 2D Mesh"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon2D"
-msgstr "Создать Polygon3D"
+msgstr "Создать Polygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create CollisionPolygon2D"
-msgstr "Создать полигон Ñтолкновений"
+msgstr "Создать CollisionPolygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create LightOccluder2D"
-msgstr "Создан затенÑющий полигон"
+msgstr "Создан LightOccluder2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
@@ -7286,9 +7312,8 @@ msgid "Invalid geometry, can't replace by mesh."
msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ, не может быть заменена Ñеткой."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Mesh2D"
-msgstr "Преобразовать в 2D Mesh"
+msgstr "Преобразовать в Mesh2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create polygon."
@@ -7344,9 +7369,8 @@ msgid "No Frames Selected"
msgstr "Кадрировать выбранное"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add %d Frame(s)"
-msgstr "Добавить кадр"
+msgstr "Добавить кадров: %d"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frame"
@@ -7397,13 +7421,12 @@ msgid "Animation Frames:"
msgstr "Кадры анимации:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add a Texture from File"
-msgstr "Добавить текÑтуру(Ñ‹) в TileSet."
+msgstr "Добавить текÑтуру из файла"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frames from a Sprite Sheet"
-msgstr ""
+msgstr "Добавить кадры из Ñпрайт-лиÑта"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (Before)"
@@ -7496,10 +7519,6 @@ msgid "TextureRegion"
msgstr "ОблаÑтьТекÑтуры"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "Ðевозможно Ñохранить тему в файл:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Добавить вÑе Ñлементы"
@@ -7585,16 +7604,16 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
msgid "Submenu"
-msgstr ""
+msgstr "Подменю"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "Элемент"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "Элемент"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7629,7 +7648,7 @@ msgstr "Редактируемые потомки"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Subtree"
-msgstr ""
+msgstr "Поддерево"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has,Many,Options"
@@ -7715,10 +7734,13 @@ msgid "Paint Tile"
msgstr "РиÑовать тайл"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
+"Shift+RMB: ÐариÑовать линию\n"
+"Shift+Ctrl+RMB: ÐариÑовать прÑмоугольник"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
@@ -8025,6 +8047,10 @@ msgid "TileSet"
msgstr "Ðабор Тайлов"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(только GLES3)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Добавить вход"
@@ -8035,27 +8061,24 @@ msgid "Add output +"
msgstr "Добавить вход"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar"
-msgstr "МаÑштаб:"
+msgstr "СкалÑÑ€"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector"
-msgstr "ИнÑпектор"
+msgstr "Вектор"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add input port"
-msgstr "Добавить вход"
+msgstr "Добавить входной порт"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add output port"
-msgstr ""
+msgstr "Добавить выходной порт"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8078,14 +8101,12 @@ msgid "Change output port name"
msgstr "Изменить Ð¸Ð¼Ñ Ð²Ñ…Ð¾Ð´Ð°"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove input port"
-msgstr "Удалить точку"
+msgstr "Удалить входной порт"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove output port"
-msgstr "Удалить точку"
+msgstr "Удалить выходной порт"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8115,6 +8136,11 @@ msgid "Duplicate Nodes"
msgstr "Дублировать узлы"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Ð’Ñтавить узлы"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "Удалить узлы"
@@ -8123,10 +8149,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "Изменен тип ввода Визуального Шейдера"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "Вершины"
@@ -8140,13 +8162,17 @@ msgstr "Свет"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Create Shader Node"
+msgid "Show resulted shader code."
msgstr "Создать узел"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Create Shader Node"
+msgstr "Создать узел"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color function."
-msgstr "Перейти к функции"
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð°."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
@@ -8159,11 +8185,11 @@ msgstr "Сделать функцию"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts HSV vector to RGB equivalent."
-msgstr ""
+msgstr "Конвертирует вектор HSV в RGB Ñквивалент."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts RGB vector to HSV equivalent."
-msgstr ""
+msgstr "Конвертирует вектор RGB в HSV Ñквивалент."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8253,7 +8279,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
-msgstr ""
+msgstr "Меньше, чем (<)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than or Equal (<=)"
@@ -8321,14 +8347,12 @@ msgid "'%s' input parameter for vertex and fragment shader mode."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar function."
-msgstr "Изменить чиÑловую функцию"
+msgstr "СкалÑÑ€Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar operator."
-msgstr "Изменить чиÑловой оператор"
+msgstr "СкалÑрный оператор."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "E constant (2.718282). Represents the base of the natural logarithm."
@@ -8397,7 +8421,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Finds the nearest integer that is greater than or equal to the parameter."
-msgstr ""
+msgstr "ВычиÑлÑет ближайшее целое чиÑло, большее или равное аргументу."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Constrains a value to lie between two further values."
@@ -8405,15 +8429,15 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the cosine of the parameter."
-msgstr ""
+msgstr "Возвращает коÑÐ¸Ð½ÑƒÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "Возвращает гиперболичеÑкий коÑÐ¸Ð½ÑƒÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
-msgstr ""
+msgstr "Переводит значение из радиан в градуÑÑ‹."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-e Exponential."
@@ -8425,35 +8449,35 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer less than or equal to the parameter."
-msgstr ""
+msgstr "ВычиÑлÑет ближайшее целое, меньшее или равное аргументу."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Computes the fractional part of the argument."
-msgstr ""
+msgstr "ВычиÑлÑет дробную чаÑть аргумента."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse of the square root of the parameter."
-msgstr ""
+msgstr "Возвращает обратный корень из аргумента."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Natural logarithm."
-msgstr ""
+msgstr "Ðатуральный логарифм."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 logarithm."
-msgstr ""
+msgstr "Логарифм по оÑнованию 2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the greater of two values."
-msgstr ""
+msgstr "Возвращает наибольшее из двух значений."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the lesser of two values."
-msgstr ""
+msgstr "Возвращает наименьшее из двух значений."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two scalars."
-msgstr ""
+msgstr "Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»ÑÑ†Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ð´Ð²ÑƒÐ¼Ñ ÑкалÑрами."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the opposite value of the parameter."
@@ -8470,7 +8494,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in degrees to radians."
-msgstr ""
+msgstr "Переводит значение из градуÑов в радианы."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / scalar"
@@ -8478,15 +8502,15 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer to the parameter."
-msgstr ""
+msgstr "ВычиÑлÑет ближайшее целое чиÑло."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest even integer to the parameter."
-msgstr ""
+msgstr "ВычиÑлÑет ближайшее чётное чиÑло."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
-msgstr ""
+msgstr "Ограничивает значение в пределах от 0.0 до 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Extracts the sign of the parameter."
@@ -8508,7 +8532,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8517,7 +8541,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8538,11 +8562,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides scalar by scalar."
-msgstr ""
+msgstr "Делит ÑкалÑÑ€ на ÑкалÑÑ€."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies scalar by scalar."
-msgstr ""
+msgstr "Умножает ÑкалÑÑ€ на ÑкалÑÑ€."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two scalars."
@@ -8615,7 +8639,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the inverse of a transform."
-msgstr ""
+msgstr "ВычиÑлÑет обратную транÑформацию."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the transpose of a transform."
@@ -8651,23 +8675,23 @@ msgstr "Изменить векторный оператор"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes vector from three scalars."
-msgstr ""
+msgstr "Создаёт вектор из трёх ÑкалÑров."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes vector to three scalars."
-msgstr ""
+msgstr "РаÑкладывает вектор на три ÑкалÑра."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the cross product of two vectors."
-msgstr ""
+msgstr "ВычиÑлÑет векторное произведение двух векторов."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the distance between two points."
-msgstr ""
+msgstr "Возвращает раÑÑтоÑние между Ð´Ð²ÑƒÐ¼Ñ Ñ‚Ð¾Ñ‡ÐºÐ°Ð¼Ð¸."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the dot product of two vectors."
-msgstr ""
+msgstr "ВычиÑлÑет ÑкалÑрное произведение двух векторов."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8679,11 +8703,16 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the length of a vector."
-msgstr ""
+msgstr "ВычиÑлÑет длину вектора."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two vectors."
-msgstr ""
+msgstr "Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»ÑÑ†Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ð´Ð²ÑƒÐ¼Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð°Ð¼Ð¸."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»ÑÑ†Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ð´Ð²ÑƒÐ¼Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð°Ð¼Ð¸."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
@@ -8711,7 +8740,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8720,7 +8749,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8729,27 +8758,27 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds vector to vector."
-msgstr ""
+msgstr "ПрибавлÑет вектор к вектору."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides vector by vector."
-msgstr ""
+msgstr "Делит вектор на вектор."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by vector."
-msgstr ""
+msgstr "Умножает вектор на вектор."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two vectors."
@@ -8783,6 +8812,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9001,6 +9037,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Шаблоны ÑкÑпорта Ð´Ð»Ñ Ñтой платформы отÑутÑтвуют:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Управление шаблонами ÑкÑпорта"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "ЭкÑпорт в режиме отладки"
@@ -9160,6 +9200,15 @@ msgid "Unnamed Project"
msgstr "БезымÑнный проект"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Импортировать ÑущеÑтвующий проект"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ проект в \"%s\"."
@@ -9258,8 +9307,8 @@ msgstr "Удалить проект из ÑпиÑка? (Содержимое пÐ
#: editor/project_manager.cpp
#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr "Удалить проект из ÑпиÑка? (Содержимое папки не будет изменено)"
#: editor/project_manager.cpp
@@ -9272,21 +9321,21 @@ msgstr ""
"ПользовательÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð±ÑƒÐ´ÐµÑ‚ обновлен при Ñледующем запуÑке редактора."
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Are you sure to scan %s folders for existing Godot projects?\n"
"This could take a while."
msgstr ""
-"Ð’Ñ‹ ÑобираетеÑÑŒ Ñканировать %s папки Ð´Ð»Ñ ÑущеÑтвующих проектов Godot. "
-"Подтверждаете?"
+"Ð’Ñ‹ дейÑтвительно хотите поиÑкать ÑущеÑтвующие проекты Godot в %s папках?\n"
+"Это может занÑть много времени."
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Менеджер проектов"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "СпиÑок проектов"
+#, fuzzy
+msgid "Projects"
+msgstr "Проект"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9310,10 +9359,6 @@ msgid "Templates"
msgstr "Шаблоны"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Выход"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "ПерезапуÑтить ÑейчаÑ"
@@ -9355,9 +9400,8 @@ msgstr ""
"\"/\", \":\", \"=\", \"\\\" или \"''\""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "ДейÑтвие '%s' уже ÑущеÑтвует!"
+msgstr "ДейÑтвие '%s' уже ÑущеÑтвует."
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
@@ -9576,9 +9620,8 @@ msgid "Override For..."
msgstr "Переопределить длÑ..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
-#, fuzzy
msgid "The editor must be restarted for changes to take effect."
-msgstr "Чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу, необходимо перезапуÑтить редактор"
+msgstr "Чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу, необходимо перезапуÑтить редактор."
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -9637,7 +9680,6 @@ msgid "Locales Filter"
msgstr "Фильтры локализации"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show All Locales"
msgstr "Показать вÑе Ñзыки"
@@ -9658,6 +9700,10 @@ msgstr "Языки:"
msgid "AutoLoad"
msgstr "Ðвтозагрузка"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Плагины"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Ðоль"
@@ -9710,16 +9756,6 @@ msgstr "Выбрать виртуальный метод"
msgid "Select Method"
msgstr "Выбрать метод"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "Ðевозможно запуÑтить PVRTC инÑтрумент:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-"Ðе возможно загрузить обратно конвертированное изображение иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ PVRTC "
-"инÑтрумент:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "Пакетное переименование"
@@ -9999,9 +10035,8 @@ msgid "User Interface"
msgstr "ПользовательÑкий интерфейÑ"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Other Node"
-msgstr "Удалить узел"
+msgstr "Другой узел"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -10020,6 +10055,11 @@ msgid "Remove Node(s)"
msgstr "Удалить узел(узлы)"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Изменить Ð¸Ð¼Ñ Ð²Ñ…Ð¾Ð´Ð°"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10044,7 +10084,6 @@ msgid "Clear Inheritance"
msgstr "ОчиÑтить наÑледование"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open Documentation"
msgstr "Открыть документацию"
@@ -10053,9 +10092,8 @@ msgid "Add Child Node"
msgstr "Добавить дочерний узел"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Expand/Collapse All"
-msgstr "Свернуть вÑе"
+msgstr "Развернуть/Ñвернуть вÑе"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
@@ -10147,24 +10185,27 @@ msgid "Node configuration warning:"
msgstr "Конфигурации узла, предупреждение:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"Узел Ñодержит ÑвÑзи и группы\n"
"Ðажмите, чтобы показать панель Ñигналов."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"Узел Ñодержит ÑвÑзи.\n"
"Ðажмите, чтобы показать панель Ñигналов."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"Узел принадлежит к группе.\n"
@@ -10271,6 +10312,11 @@ msgid "Error loading script from %s"
msgstr "Ошибка при загрузке Ñкрипта из %s"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "ПерезапиÑать"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "Ð/Д"
@@ -10469,6 +10515,10 @@ msgid "Change Shortcut"
msgstr "Изменить ПривÑзанную Кнопку"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "ÐаÑтройки редактора"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "ПривÑзанные кнопки"
@@ -10888,10 +10938,30 @@ msgid "Set Variable Type"
msgstr "УÑтановить тип переменной"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Ðе должно конфликтовать Ñ ÑущеÑтвующим вÑтроенным именем типа."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Создать новый прÑмоугольник."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Переменные:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Создать новый прÑмоугольник."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Создать новый полигон."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Ð˜Ð¼Ñ Ð½Ðµ ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым идентификатором:"
@@ -11081,10 +11151,6 @@ msgid "Cut Nodes"
msgstr "Вырезать узлы"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Ð’Ñтавить узлы"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "Редактировать Ñлемент"
@@ -11841,7 +11907,6 @@ msgid "Nothing connected to input '%s' of node '%s'."
msgstr "Ðичего не подключено к входу \"%s\" узла \"%s\"."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "No root AnimationNode for the graph is set."
msgstr "Ðе задан корневой AnimationNode Ð´Ð»Ñ Ð³Ñ€Ð°Ñ„Ð°."
@@ -11868,12 +11933,11 @@ msgstr "Выбрать цвет Ñ Ñкрана."
#: scene/gui/color_picker.cpp
msgid "HSV"
-msgstr ""
+msgstr "HSV"
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Raw"
-msgstr "РыÑкание"
+msgstr "Raw"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
@@ -11964,39 +12028,21 @@ msgstr ""
"Ñделайте её целью рендеринга и назначьте её внутреннюю текÑтуру какому-либо "
"узлу Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Ошибка инициализации FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "ÐеизвеÑтный формат шрифта."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Ошибка загрузки шрифта."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "ÐедопуÑтимый размер шрифта."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Вход"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for preview."
-msgstr "ÐедейÑтвительный иÑточник шейдера."
+msgstr "Ðеверный иÑточник Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¿Ñ€Ð¾Ñмотра."
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
msgstr "ÐедейÑтвительный иÑточник шейдера."
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid comparison function for that type."
-msgstr "ÐедейÑтвительный иÑточник шейдера."
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого типа."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
@@ -12014,6 +12060,108 @@ msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть назначены только Ð
msgid "Constants cannot be modified."
msgstr "КонÑтанты не могут быть изменены."
+#~ msgid "No Matches"
+#~ msgstr "Ðет Ñовпадений"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Ðевозможно открыть file_type_cache.cch Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи. Ðе будет Ñохранён кÑш "
+#~ "типов файлов!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "Ðе удаетÑÑ Ð¿ÐµÑ€ÐµÐ¹Ñ‚Ð¸ к '%s', так как он не был найден в файловой ÑиÑтеме!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Ошибка при загрузке изображениÑ:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Ðикаких пикÑелей Ñ Ð¿Ñ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ð¾Ñтью > 128 в изображении..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Родитель не имеет твёрдых граней Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Ðе удалоÑÑŒ отобразить облаÑть."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Грани не Ñодержат зоны!"
+
+#~ msgid "No faces!"
+#~ msgstr "Ðет граней!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Ошибка: Ðе удалоÑÑŒ загрузить файл."
+
+#~ msgid "Error could not load file."
+#~ msgstr "Ðе удалоÑÑŒ загрузить файл."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "ДоплеровÑкий режим"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Режим Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Режим Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Режим поворота (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Режим маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Локальные координаты"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Режим привÑзки (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "ИнÑтрумент выбора"
+
+#~ msgid "Tool Move"
+#~ msgstr "ИнÑтрумент перемещениÑ"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "ИнÑтрумент поворот"
+
+#~ msgid "Tool Scale"
+#~ msgstr "ИнÑтрумент маÑштаб"
+
+#, fuzzy
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr "Удалить проект из ÑпиÑка? (Содержимое папки не будет изменено)"
+
+#~ msgid "Project List"
+#~ msgstr "СпиÑок проектов"
+
+#~ msgid "Exit"
+#~ msgstr "Выход"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "Ðевозможно запуÑтить PVRTC инÑтрумент:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr ""
+#~ "Ðе возможно загрузить обратно конвертированное изображение иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ "
+#~ "PVRTC инÑтрумент:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Ошибка инициализации FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "ÐеизвеÑтный формат шрифта."
+
+#~ msgid "Error loading font."
+#~ msgstr "Ошибка загрузки шрифта."
+
+#~ msgid "Invalid font size."
+#~ msgstr "ÐедопуÑтимый размер шрифта."
+
#~ msgid "Previous Folder"
#~ msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°"
@@ -12613,9 +12761,6 @@ msgstr "КонÑтанты не могут быть изменены."
#~ msgid "Erase selection"
#~ msgstr "ОчиÑтить выделенное"
-#~ msgid "Could not find tile:"
-#~ msgstr "Ðевозможно найти тайл:"
-
#~ msgid "Item name or ID:"
#~ msgstr "ID или Ð¸Ð¼Ñ Ñлемента:"
@@ -12879,9 +13024,6 @@ msgstr "КонÑтанты не могут быть изменены."
#~ msgid "Info"
#~ msgstr "ИнформациÑ"
-#~ msgid "Re-Import..."
-#~ msgstr "Переимпортировать..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "Ðет битовой маÑки Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð°!"
@@ -13276,9 +13418,6 @@ msgstr "КонÑтанты не могут быть изменены."
#~ msgid "Stereo"
#~ msgstr "Стерео"
-#~ msgid "Window"
-#~ msgstr "Окно"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "МаÑштабирование до %s%%."
@@ -13516,9 +13655,6 @@ msgstr "КонÑтанты не могут быть изменены."
#~ msgid "Add Image Group"
#~ msgstr "Добавлено изображение группы"
-#~ msgid "Delete Image Group"
-#~ msgstr "Удалено изображение группы"
-
#~ msgid "Project Export Settings"
#~ msgstr "Параметры ÑкÑпорта проекта"
@@ -13603,9 +13739,6 @@ msgstr "КонÑтанты не могут быть изменены."
#~ msgid "Export Project PCK"
#~ msgstr "ЭкÑпортировать PCK проекта"
-#~ msgid "Export..."
-#~ msgstr "ЭкÑпортировать..."
-
#~ msgid "Project Export"
#~ msgstr "ЭкÑпортирование проекта"
@@ -13711,9 +13844,6 @@ msgstr "КонÑтанты не могут быть изменены."
#~ msgid "Deploy File Server Clients"
#~ msgstr "Развернуть файловый Ñервер Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð²"
-#~ msgid "Group Editor"
-#~ msgstr "Редактор групп"
-
#~ msgid "Overwrite Existing Scene"
#~ msgstr "ПерезапиÑать ÑущеÑтвующую Ñцену"
diff --git a/editor/translations/si.po b/editor/translations/si.po
index 68f2b09028..2492f11666 100644
--- a/editor/translations/si.po
+++ b/editor/translations/si.po
@@ -58,7 +58,6 @@ msgid "On call to '%s':"
msgstr "'%s' ඇමතීම:"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "නිදහස්"
@@ -651,15 +650,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -884,8 +883,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -979,7 +977,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -1015,7 +1013,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1104,14 +1102,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1128,7 +1126,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1611,12 +1609,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2006,6 +2003,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2302,6 +2303,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2395,6 +2404,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2479,20 +2492,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2525,24 +2534,32 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2622,12 +2639,12 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
msgstr ""
#: editor/editor_node.cpp
@@ -2663,14 +2680,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2678,12 +2695,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3121,7 +3139,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3138,6 +3156,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3199,12 +3221,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3218,13 +3238,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3309,19 +3333,11 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3354,11 +3370,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3417,6 +3433,10 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3480,6 +3500,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "à·ƒà·à¶¯à¶±à·Šà¶±"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3540,6 +3565,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3547,12 +3580,21 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "යතුරු මක෠දමන්න"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3565,11 +3607,11 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
+msgid "Group Editor"
msgstr ""
#: editor/groups_editor.cpp
@@ -3776,7 +3818,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4524,10 +4566,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4540,14 +4578,42 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4624,8 +4690,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4646,7 +4715,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4658,6 +4727,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4814,6 +4887,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Anim පරිවර්තනය වෙනස් කරන්න"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4843,6 +4921,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4863,14 +4942,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -4894,6 +4976,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4910,11 +4993,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4927,6 +5005,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5135,16 +5218,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5459,14 +5532,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5550,19 +5615,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5889,7 +5958,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -5995,11 +6063,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6023,7 +6087,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6104,6 +6168,10 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6141,11 +6209,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6233,6 +6301,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6300,6 +6372,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6334,92 +6407,96 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
+msgid "Fold/Unfold Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
+msgid "Fold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
+msgid "Unfold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
+msgid "Clone Down"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
+msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
+msgid "Evaluate Selection"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
+msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
+msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6657,7 +6734,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6711,7 +6788,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6722,27 +6799,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6786,22 +6843,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6856,7 +6897,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7153,10 +7194,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7241,11 +7278,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7363,8 +7400,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7649,6 +7686,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7727,6 +7768,11 @@ msgid "Duplicate Nodes"
msgstr "යතුරු පිටපත් කරන්න"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "යතුරු මක෠දමන්න"
@@ -7736,10 +7782,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7752,6 +7794,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8112,7 +8158,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8121,7 +8167,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8283,6 +8329,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8308,7 +8358,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8317,7 +8367,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8326,14 +8376,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8378,6 +8428,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8585,6 +8642,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8731,6 +8792,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8800,8 +8869,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8821,7 +8890,7 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
+msgid "Projects"
msgstr ""
#: editor/project_manager.cpp
@@ -8845,10 +8914,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9182,6 +9247,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9234,14 +9303,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9528,6 +9589,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9645,19 +9710,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9748,6 +9813,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -9936,6 +10005,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10346,10 +10419,28 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "à·à·Šâ€à¶»à·’à¶­:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "à·ƒà·à¶¯à¶±à·Šà¶±"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10534,10 +10625,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11267,22 +11354,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
diff --git a/editor/translations/sk.po b/editor/translations/sk.po
index bed5a879ef..98d594e40d 100644
--- a/editor/translations/sk.po
+++ b/editor/translations/sk.po
@@ -64,7 +64,6 @@ msgid "On call to '%s':"
msgstr "Pri volaní '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Voľné"
@@ -659,16 +658,17 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr ""
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Zhody:"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -899,8 +899,7 @@ msgstr "Obľúbené:"
msgid "Recent:"
msgstr "Nedávne:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1003,7 +1002,7 @@ msgstr ""
"Súbory ktoré budú odstránené vyžadujú ÄalÅ¡ie zdroje, aby mohli pracovaÅ¥.\n"
"Odstrániť aj napriek tomu? (nedá sa vrátiť späť)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Nemôžete odstrániť:"
@@ -1040,7 +1039,7 @@ msgstr "Natrvalo odstrániť %d položky? (Nedá sa vrátiť späť!)"
msgid "Show Dependencies"
msgstr "Závislostí"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1129,14 +1128,15 @@ msgid "License"
msgstr "Licencia"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Thirdparty Licencie"
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1154,7 +1154,8 @@ msgid "Licenses"
msgstr "Licencie"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Chyba pri otváraní súboru balíka, nie je vo formáte zip."
#: editor/editor_asset_installer.cpp
@@ -1647,12 +1648,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2069,6 +2069,10 @@ msgstr ""
msgid "Clear Output"
msgstr "Popis:"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2368,6 +2372,15 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Otvoriť súbor(y)"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2461,6 +2474,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2547,6 +2564,10 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr ""
@@ -2557,14 +2578,6 @@ msgid "Save All Scenes"
msgstr "Uložiť súbor"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr ""
@@ -2594,24 +2607,33 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Upraviť..."
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2691,13 +2713,14 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
-msgstr ""
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
+msgstr "Prechody"
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2732,14 +2755,15 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
-msgstr ""
-
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+msgid "Manage Editor Features..."
msgstr ""
#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
+msgstr "Všetky vybrané"
+
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2747,12 +2771,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3200,7 +3225,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3217,6 +3242,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3278,12 +3307,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3297,13 +3324,18 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Nemôžete odstrániť:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3391,19 +3423,11 @@ msgstr "Všetky vybrané"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3436,11 +3460,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3503,6 +3527,11 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Popis:"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3570,6 +3599,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Vytvoriť adresár"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3633,6 +3667,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3641,12 +3683,22 @@ msgstr ""
msgid "Invalid group name."
msgstr "Nesprávna veľkosť písma."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Všetky vybrané"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Všetky vybrané"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3660,12 +3712,13 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
+#, fuzzy
+msgid "Group Editor"
+msgstr "Otvorit prieÄinok"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3874,7 +3927,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4644,10 +4697,6 @@ msgid "View Files"
msgstr "Súbor:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4660,14 +4709,44 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Nemôžete odstrániť:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "ÄŒas:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4745,8 +4824,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4767,7 +4849,7 @@ msgid "Site:"
msgstr "Stránka:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4779,6 +4861,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4945,6 +5031,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Všetky vybrané"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4974,6 +5065,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4994,14 +5086,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -5025,6 +5120,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5041,11 +5137,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5058,6 +5149,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5270,16 +5366,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5601,14 +5687,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5692,19 +5770,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6044,7 +6126,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6150,12 +6231,9 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr ""
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "Popis:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6179,7 +6257,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "Vytvoriť adresár"
#: editor/plugins/script_editor_plugin.cpp
@@ -6266,6 +6344,11 @@ msgid "Open..."
msgstr "Otvoriť"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Popis:"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6303,11 +6386,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6397,6 +6480,11 @@ msgstr ""
msgid "Search Results"
msgstr "Vložiť"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Popis:"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6467,6 +6555,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6502,25 +6591,6 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "PrejsÅ¥ na Äalší krok"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Prejsť na predchádzajúci krok"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Všetky vybrané"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr ""
@@ -6541,6 +6611,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Zmeniť veľkosť výberu"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6557,31 +6632,35 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Find in Files..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
+msgid "Go to Next Bookmark"
msgstr "PrejsÅ¥ na Äalší krok"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
+msgid "Go to Previous Bookmark"
msgstr "Prejsť na predchádzajúci krok"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr ""
+#, fuzzy
+msgid "Remove All Bookmarks"
+msgstr "Všetky vybrané"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6593,9 +6672,24 @@ msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "PrejsÅ¥ na Äalší krok"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Prejsť na predchádzajúci krok"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -6834,8 +6928,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Filter:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6888,7 +6983,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6899,27 +6994,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6964,23 +7039,6 @@ msgid "Focus Selection"
msgstr "Všetky vybrané"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Tool Select"
-msgstr "Všetky vybrané"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -7035,7 +7093,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7339,10 +7397,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7433,11 +7487,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7560,8 +7614,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7871,6 +7925,10 @@ msgid "TileSet"
msgstr "Súbor:"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Signály:"
@@ -7955,6 +8013,12 @@ msgid "Duplicate Nodes"
msgstr "Duplikovať výber"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "Vložiť"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Všetky vybrané"
@@ -7964,10 +8028,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7981,6 +8041,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Vytvoriť adresár"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Vytvoriť adresár"
@@ -8343,7 +8408,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8352,7 +8417,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8515,6 +8580,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8540,7 +8609,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8549,7 +8618,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8558,14 +8627,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8610,6 +8679,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8819,6 +8895,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8968,6 +9048,15 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Všetky vybrané"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -9037,8 +9126,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9058,8 +9147,9 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "Zakladatelia Projektu"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9084,10 +9174,6 @@ msgid "Templates"
msgstr "Všetky vybrané"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9427,6 +9513,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9480,14 +9570,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9777,6 +9859,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9902,19 +9988,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10008,6 +10094,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10205,6 +10295,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10622,10 +10716,29 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Vytvoriť adresár"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Vytvoriť adresár"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Vytvoriť adresár"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10818,11 +10931,6 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
-msgid "Paste Nodes"
-msgstr "Vložiť"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
msgstr "Súbor:"
@@ -11575,22 +11683,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Nesprávna veľkosť písma."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11627,6 +11719,13 @@ msgid "Constants cannot be modified."
msgstr ""
#, fuzzy
+#~ msgid "Tool Select"
+#~ msgstr "Všetky vybrané"
+
+#~ msgid "Invalid font size."
+#~ msgstr "Nesprávna veľkosť písma."
+
+#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "Vytvoriť adresár"
diff --git a/editor/translations/sl.po b/editor/translations/sl.po
index 3a098b5971..e369352868 100644
--- a/editor/translations/sl.po
+++ b/editor/translations/sl.po
@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-05-16 18:49+0000\n"
+"PO-Revision-Date: 2019-08-29 13:35+0000\n"
"Last-Translator: Andrej Poženel <andrej.pozenel@outlook.com>\n"
"Language-Team: Slovenian <https://hosted.weblate.org/projects/godot-engine/"
"godot/sl/>\n"
@@ -23,7 +23,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
"%100==4 ? 2 : 3;\n"
-"X-Generator: Weblate 3.7-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -46,9 +46,8 @@ msgid "self can't be used because instance is null (not passed)"
msgstr "self ne more biti uporabljen, ker instanca ni null (ni podano)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Neveljaven indeks lastnosti imena '%s' v vozliÅ¡Äu %s."
+msgstr "Neveljaven operand za operator %s, %s ter %s."
#: core/math/expression.cpp
#, fuzzy
@@ -68,7 +67,6 @@ msgid "On call to '%s':"
msgstr "Na klic '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Prosto"
@@ -684,17 +682,18 @@ msgid "Line Number:"
msgstr "Å tevilka Vrste:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "Zamenjana %d ponovitev/e."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+#, fuzzy
+msgid "%d matches."
msgstr "Ni Zadetkov"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Zamenjana %d ponovitev/e."
-
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Ujemanje Velikih ÄŒrk"
@@ -932,8 +931,7 @@ msgstr "Priljubljene:"
msgid "Recent:"
msgstr "Nedavni:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1036,7 +1034,7 @@ msgstr ""
"Izbrisane datoteke so potrebne za delovanje drugih virov.\n"
"Ali jih vseeno odstranim? (brez vrnitve)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Ni mogoÄe odstraniti:"
@@ -1074,7 +1072,7 @@ msgstr "Trajno izbrišem %d predmet(e)? (Brez vrnitve!)"
msgid "Show Dependencies"
msgstr "Odvisnosti"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Raziskovalec Osamljenih Virov"
@@ -1163,14 +1161,16 @@ msgid "License"
msgstr "Licenca"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Licenca Tretjih Oseb"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine se nanaÅ¡a na Å¡tevilne brezplaÄne in odprokodne knjižnice tretih "
@@ -1191,7 +1191,8 @@ msgid "Licenses"
msgstr "Licence"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Napaka pri odpiranju datoteke paketa, ker ni v formatu zip."
#: editor/editor_asset_installer.cpp
@@ -1701,12 +1702,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Uvozi"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Izvozi"
@@ -2139,6 +2139,10 @@ msgstr "PoÄisti"
msgid "Clear Output"
msgstr "PoÄisti Izhod"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Izvoz projekta ni uspelo s kodno napako %d."
@@ -2456,6 +2460,15 @@ msgid "Pick a Main Scene"
msgstr "Izberi Glavno Sceno"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Zapri Prizor"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Zapri Prizor"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Ni mogoÄe omogoÄiti dodatnega vtiÄnika na: '%s'. RazÄlenjevanje "
@@ -2573,6 +2586,11 @@ msgstr "Zaženi Prizor"
msgid "Close Tab"
msgstr "Zapri"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Zapri"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2659,6 +2677,10 @@ msgstr "Nov Podedovan Prizor..."
msgid "Open Scene..."
msgstr "Odpri Prizor..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Odpri Nedavne"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Shrani Prizor"
@@ -2669,14 +2691,6 @@ msgid "Save All Scenes"
msgstr "Shrani vse Prizore"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Zapri Prizor"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Odpri Nedavne"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Pretvori V..."
@@ -2706,26 +2720,37 @@ msgstr "Povrni Prizor"
msgid "Miscellaneous project or scene-wide tools."
msgstr "RazliÄna projektna ali prizorska orodja."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Projekt"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Nastavitve Projekta"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Orodja"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Izvozi"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "Odprem Upravljalnik Projekta?"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Orodja"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Raziskovalec Osamljenih Virov"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2821,12 +2846,13 @@ msgstr ""
"ÄŒe se uporablja napravo na daljavo, je to bolj uÄinkovito pri omrežnem "
"datoteÄnem sistemu."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Urejevalnik"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Nastavitve Urejevalnika"
#: editor/editor_node.cpp
@@ -2868,14 +2894,15 @@ msgstr "Nastavitve Urejevalnika"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "Upravljaj Izvozne Predloge"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Upravljaj Izvozne Predloge"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "PomoÄ"
@@ -2883,12 +2910,13 @@ msgstr "PomoÄ"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Iskanje"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Spletna Dokumentacija"
@@ -3342,7 +3370,8 @@ msgid "Import From Node:"
msgstr "Uvozi iz Gradnika:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Ponovno Prenesi"
#: editor/export_template_manager.cpp
@@ -3359,6 +3388,10 @@ msgid "Download"
msgstr "Prenesi"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(ManjkajoÄe)"
@@ -3423,12 +3456,10 @@ msgid "No response."
msgstr "Ni odgovora."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Zahteva Ni Uspela."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Preusmeritev Zanke."
@@ -3442,13 +3473,19 @@ msgid "Download Complete."
msgstr "Prenos je DokonÄan."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Ni mogoÄe odstraniti:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Napaka pri zahtevi URL-ja: "
#: editor/export_template_manager.cpp
@@ -3536,24 +3573,12 @@ msgstr "Prenesi Predloge"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Izberi vire s seznama: "
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Za pisanje ni mogoÄe odpreti file_type_cache.cch, ne da bi shranili "
-"predpomnilnik tipa datoteke!"
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "Priljubljene:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"Ne morem se postaviti na mesto '%s', ker ni bilo najdeno v datoteÄnem "
-"sistemu!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Stanje: Uvoz datoteke ni uspel. Popravi datoteko in ponovno roÄno uvozi."
@@ -3588,14 +3613,14 @@ msgid "Provided name contains invalid characters."
msgstr "Vnešeno ime vsebuje neveljavne znake"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Ime vsebuje neveljavne znake."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Datoteka ali mapa s tem imenom že obstaja."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Ime vsebuje neveljavne znake."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Preimenovanje Datoteke:"
@@ -3655,6 +3680,11 @@ msgstr "Podvoji..."
msgid "Move To..."
msgstr "Premakni V..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Nov Prizor"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3729,6 +3759,11 @@ msgstr "Datoteka ali mapa s tem imenom že obstaja."
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Shrani Prizor"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3798,6 +3833,14 @@ msgid "Search complete"
msgstr "IÅ¡Äi Besedilo"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Dodaj v Skupino"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Odstrani iz Skupine"
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "NAPAKA: Animacija s tem imenom že obstaja!"
@@ -3807,13 +3850,23 @@ msgstr "NAPAKA: Animacija s tem imenom že obstaja!"
msgid "Invalid group name."
msgstr "Neveljavno ime."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Skupine"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Izbriši Postavitev"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Skupine"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr "Dodaj v Skupino"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3827,12 +3880,13 @@ msgid "Nodes in Group"
msgstr "Dodaj v Skupino"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Dodaj v Skupino"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Odstrani iz Skupine"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Odpri Urejevalnik Skript"
#: editor/groups_editor.cpp
#, fuzzy
@@ -4043,7 +4097,8 @@ msgid "MultiNode Set"
msgstr "Niz VeÄkratnih Gradnikov"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Za urejanje Signalov in Skupin izberi Gradnik."
#: editor/plugin_config_dialog.cpp
@@ -4846,10 +4901,6 @@ msgid "View Files"
msgstr "Ogled datotek"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Ne morem razrešiti imena gostitelja:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Napaka pri povezavi, poskusi znova."
@@ -4862,14 +4913,47 @@ msgid "No response from host:"
msgstr "Gostitelj se ne odziva:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Ne morem razrešiti imena gostitelja:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Zahteva ni uspela, povratna koda:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Zahteva Ni Uspela."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Ni mogoÄe odstraniti:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Zahteva ni uspela, preveÄ preusmeritev"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Preusmeritev Zanke."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Zahteva ni uspela, povratna koda:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "ÄŒas"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Slab prenos hash kode, predvidevamo, da je bila datoteka spremenjena."
@@ -4952,8 +5036,13 @@ msgid "All"
msgstr "Vse"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Uvozi"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "VtiÄniki"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4975,7 +5064,8 @@ msgid "Site:"
msgstr "Stran:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Podpora..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4987,6 +5077,11 @@ msgid "Testing"
msgstr "Preskušanje"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Naloži"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Dodatki v ZIP Datoteki"
@@ -5165,6 +5260,11 @@ msgstr "Prilepi Pozicijo"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "Zaženi Prizor po Meri"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Zaženi Prizor po Meri"
@@ -5195,6 +5295,7 @@ msgid "Zoom Reset"
msgstr "Oddalji"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Izberi NaÄin"
@@ -5217,14 +5318,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+RMB: Izbira globine"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "NaÄin Premika"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "NaÄin Vrtenja"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "NaÄin Obsega (R)"
@@ -5252,6 +5356,7 @@ msgid "Toggle snapping."
msgstr "Preklopi pripenjanje"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Uporabi Pripenjanje"
@@ -5270,11 +5375,6 @@ msgid "Use Rotation Snap"
msgstr "Uporabi Rotacijsko Pripenjanje"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Nastavi Pripenjanje..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Pripni Relativno"
@@ -5288,6 +5388,11 @@ msgid "Smart Snapping"
msgstr "Pametno pripenjanje"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Nastavi Pripenjanje..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
msgstr "Pripni na Predhodnika"
@@ -5508,16 +5613,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5836,14 +5931,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5927,19 +6014,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6279,7 +6370,6 @@ msgid "Grid Settings"
msgstr "Nastavitve Urejevalnika"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6393,12 +6483,7 @@ msgstr "Napaka pri shranjevanju PloÅ¡ÄnegaNiza!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "Mape ni mogoÄe ustvariti."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "Mape ni mogoÄe ustvariti."
#: editor/plugins/script_editor_plugin.cpp
@@ -6428,7 +6513,7 @@ msgstr "Napaka pri premikanju:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "Nova Mapa..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6514,6 +6599,11 @@ msgid "Open..."
msgstr "Odpri"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Zaženi Skripto"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6553,13 +6643,13 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Zapri Vse"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Zaženi"
@@ -6648,6 +6738,11 @@ msgstr "RazhroÅ¡Äevalnik"
msgid "Search Results"
msgstr "IÅ¡Äi PomoÄ"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "PoÄisti Nedavne Prizore"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6720,6 +6815,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6755,26 +6851,6 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Preklopi Svobodni Pregled"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Pojdi na naslednji korak"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Preklopi na Zaustavitev"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Odstrani Vse Stvari"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Pregibna/Nepregibna ÄŒrta"
@@ -6795,6 +6871,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "PoveÄaj izbiro"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6811,32 +6892,37 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Preklopi na Zaustavitev"
+msgid "Find Previous"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Filtriraj datoteke..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "Pojdi na naslednji korak"
+msgid "Toggle Bookmark"
+msgstr "Preklopi Svobodni Pregled"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "Preklopi na Zaustavitev"
+msgid "Go to Next Bookmark"
+msgstr "Pojdi na naslednji korak"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Preklopi na Zaustavitev"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Filtriraj datoteke..."
+msgid "Remove All Bookmarks"
+msgstr "Odstrani Vse Stvari"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6849,9 +6935,24 @@ msgid "Go to Line..."
msgstr "Pojdi na Vrstico"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Preklopi na Zaustavitev"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Pojdi na naslednji korak"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Preklopi na Zaustavitev"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -7091,8 +7192,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Spremeni Dolžino Animacije"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7147,8 +7249,8 @@ msgid "Snap Nodes To Floor"
msgstr "Pripni na mrežo"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Izberite NaÄin (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7161,30 +7263,11 @@ msgstr ""
"Alt+RMB: Izbira globine"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "NaÄin Premika (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "NaÄin Vrtenja (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "NaÄin Obsega (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Lokalno prostorski naÄin (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "NaÄin Zaskoka (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr ""
@@ -7225,22 +7308,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Izbira Orodja"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Preklopi Svobodni Pregled"
@@ -7296,8 +7363,9 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
-msgstr ""
+#, fuzzy
+msgid "Settings..."
+msgstr "Nastavitve ZaskoÄenja"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7605,10 +7673,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7697,11 +7761,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7825,8 +7889,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8146,6 +8210,10 @@ msgid "TileSet"
msgstr "Izvozi PloÅ¡Äno Zbirko"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Dodaj Vnos"
@@ -8235,6 +8303,11 @@ msgid "Duplicate Nodes"
msgstr "Animacija Podvoji kljuÄe"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Izberi Gradnik"
@@ -8244,10 +8317,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -8261,6 +8330,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Ustvarite Mapo"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Ustvarite Mapo"
@@ -8627,7 +8701,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8636,7 +8710,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8800,6 +8874,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8825,7 +8903,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8834,7 +8912,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8843,14 +8921,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8895,6 +8973,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9110,6 +9195,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Upravljaj Izvozne Predloge"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9259,6 +9348,15 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "Uvoz ObstojeÄega Projekta"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "Ni mogoÄe odpreti '%s'."
@@ -9332,8 +9430,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9353,8 +9451,9 @@ msgid "Project Manager"
msgstr "Upravljalnik Projekta"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Seznam Projektov"
+#, fuzzy
+msgid "Projects"
+msgstr "Projekt"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9378,10 +9477,6 @@ msgid "Templates"
msgstr "Predloge"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Izhod"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9722,6 +9817,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "VtiÄniki"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9774,14 +9873,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10081,6 +10172,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10208,19 +10303,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10318,6 +10413,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10515,6 +10614,10 @@ msgid "Change Shortcut"
msgstr "Spremeni SidriÅ¡Äa"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Nastavitve Urejevalnika"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10941,10 +11044,31 @@ msgid "Set Variable Type"
msgstr "Nastavite Tip Spremenljivke"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr ""
+"Neveljavno ime. Ne sme se prekrivati z obstojeÄim vgrajenim imenom tipa."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Ustvari Nov %s"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Spremenljivke:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Ustvari Nov %s"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Ustvarite Poligon"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Ime ni pravilen identifikator:"
@@ -11133,10 +11257,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "ÄŒlani"
@@ -11909,22 +12029,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Napaka pri inicializaciji FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Neznani format pisave."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Napaka nalaganja pisave."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Neveljavna velikost pisave."
-
#: scene/resources/visual_shader.cpp
#, fuzzy
msgid "Input"
@@ -11960,6 +12064,57 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Za pisanje ni mogoÄe odpreti file_type_cache.cch, ne da bi shranili "
+#~ "predpomnilnik tipa datoteke!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "Ne morem se postaviti na mesto '%s', ker ni bilo najdeno v datoteÄnem "
+#~ "sistemu!"
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "Mape ni mogoÄe ustvariti."
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Izberite NaÄin (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "NaÄin Premika (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "NaÄin Vrtenja (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "NaÄin Obsega (R)"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "NaÄin Zaskoka (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Izbira Orodja"
+
+#~ msgid "Project List"
+#~ msgstr "Seznam Projektov"
+
+#~ msgid "Exit"
+#~ msgstr "Izhod"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Napaka pri inicializaciji FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Neznani format pisave."
+
+#~ msgid "Error loading font."
+#~ msgstr "Napaka nalaganja pisave."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Neveljavna velikost pisave."
+
#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "Prejšnji zavihek"
diff --git a/editor/translations/sq.po b/editor/translations/sq.po
index fa9f6075e3..61e380e91c 100644
--- a/editor/translations/sq.po
+++ b/editor/translations/sq.po
@@ -60,7 +60,6 @@ msgid "On call to '%s':"
msgstr "Në thërritje të '%s':"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Liro"
@@ -637,16 +636,17 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr ""
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Përputhjet:"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -877,8 +877,7 @@ msgstr "Të Preferuarat:"
msgid "Recent:"
msgstr "Të fundit:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -982,7 +981,7 @@ msgstr ""
"ato të funksionojnë.\n"
"Hiqi gjithsesi? (pa kthim pas)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Nuk mund të heqësh:"
@@ -1019,7 +1018,7 @@ msgstr "Përfundimisht fshi %d artikuj? (pa kthim pas)"
msgid "Show Dependencies"
msgstr "Varësitë"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Eksploruesi I Resurseve Pa Zotërues"
@@ -1108,14 +1107,16 @@ msgid "License"
msgstr "Liçensa"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Liçensa të palëve të treta"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine mbështetet në nje numër librarish falas dhe 'open source' "
@@ -1136,7 +1137,8 @@ msgid "Licenses"
msgstr "Liçensat"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Gabim në hapjen e skedarit paketë, nuk është në formatin zip."
#: editor/editor_asset_installer.cpp
@@ -1650,12 +1652,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importo"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Eksporto"
@@ -2062,6 +2063,10 @@ msgstr "Pastro"
msgid "Clear Output"
msgstr "Pastro Përfundimin"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Eksportimi i projektit dështoi me kodin e gabimit %d."
@@ -2389,6 +2394,15 @@ msgid "Pick a Main Scene"
msgstr "Zgjidh një Skenë Kryesore"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Mbyll Skenën"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Mbyll Skenën"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"I paaftë të aktivizoj shtojcën në: '%s' analiza gramatikore e 'config' "
@@ -2504,6 +2518,11 @@ msgstr "Luaj Këtë Skenë"
msgid "Close Tab"
msgstr "Mbyll Tabin"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Mbyll Tabin"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2590,6 +2609,10 @@ msgstr "Skenë e Re e Trashëguar..."
msgid "Open Scene..."
msgstr "Hap Skenën..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Hap të Fundit"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Ruaj Skenën"
@@ -2599,14 +2622,6 @@ msgid "Save All Scenes"
msgstr "Ruaj të Gjitha Skenat"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Mbyll Skenën"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Hap të Fundit"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Konverto në..."
@@ -2636,25 +2651,36 @@ msgstr "Rikthe Skenën"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Vegla të ndryshme për projektin ose skenën."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Projekti"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Opsionet e Projektit"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Veglat"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Eksporto"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Hap Folderin e të Dhënave të Projektit"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Veglat"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Eksploruesi I Resurseve Pa Zotërues"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2751,12 +2777,13 @@ msgstr ""
"Kur përdoret në një paisje në largësi është më efikas me rrjetin "
"'filesyetem'."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Editor"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Opsionet e Editorit"
#: editor/editor_node.cpp
@@ -2795,14 +2822,15 @@ msgstr "Hap Folderin e Opsioneve të Editorit"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "Menaxho Shabllonet e Eksportit"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Menaxho Shabllonet e Eksportit"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Ndihmë"
@@ -2810,12 +2838,13 @@ msgstr "Ndihmë"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Kërko"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Dokumentimi Online"
@@ -3269,7 +3298,8 @@ msgid "Import From Node:"
msgstr "Importo nga Nyja:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Ri-Shkarko"
#: editor/export_template_manager.cpp
@@ -3286,6 +3316,10 @@ msgid "Download"
msgstr "Shkarko"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Mungon)"
@@ -3349,12 +3383,10 @@ msgid "No response."
msgstr "Nuk u përgjigj."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Kërkimi Dështoi."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Ridrejto Ciklin."
@@ -3368,15 +3400,22 @@ msgid "Download Complete."
msgstr "Shkarkimi u Plotësua."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Nuk mund të heqësh:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Instalimi i shablloneve dështoi. Arkivat problematike të shablloneve mund të "
"gjenden në '%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Gabim duke kërkuar url: "
#: editor/export_template_manager.cpp
@@ -3463,22 +3502,11 @@ msgstr "Shkarko Shabllonet"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Zgjidh pasqyrën nga lista: (Shift+Kliko: Për ta hapur në shfletues)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Nuk mund të hapi file_type_catche.cch për të shkruajtur, skedari nuk do të "
-"ruhet!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Të Preferuarat"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"Nuk mund të navigoj te '%s' sepse nuk është gjetur në sistemin e skedarëve!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Statusi: Importimi i skedarit dështoi. Please rregullo skedarin dhe ri-"
@@ -3514,14 +3542,14 @@ msgid "Provided name contains invalid characters."
msgstr "Emri i dhënë përmban karaktere të pasakta"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Emri permban karaktere të pasakta."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Një skedar ose folder me këtë emër ekziston që më parë."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Emri permban karaktere të pasakta."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Duke riemërtuar skedarin:"
@@ -3581,6 +3609,11 @@ msgstr "Dyfisho..."
msgid "Move To..."
msgstr "Lëviz në..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Skenë e Re"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Shkrim i Ri..."
@@ -3651,6 +3684,11 @@ msgstr ""
msgid "Overwrite"
msgstr "Mbishkruaj"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Ruaj Skenën"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Krijo një Shkrim"
@@ -3711,6 +3749,14 @@ msgid "Search complete"
msgstr "Kërkimi u kompletua"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Shto te Grupi"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Hiq nga Grupi"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Emri i grupit ekziston që më parë."
@@ -3718,12 +3764,23 @@ msgstr "Emri i grupit ekziston që më parë."
msgid "Invalid group name."
msgstr "Emri i grupit i pasakt."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Menaxho Grupet"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Fshi Faqosjen"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupet"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Nyjet që nuk janë në Grup"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3736,12 +3793,13 @@ msgid "Nodes in Group"
msgstr "Nyjet në Grup"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Shto te Grupi"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Hiq nga Grupi"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Hap Editorin e Shkrimit"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3952,7 +4010,8 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Zgjidh një nyje për të modifikuar Sinjalet dhe Grupet."
#: editor/plugin_config_dialog.cpp
@@ -4695,10 +4754,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4711,14 +4766,47 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Kërkimi Dështoi."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Nuk mund të heqësh:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Ridrejto Ciklin."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Kërkimi Dështoi."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Koha"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4796,8 +4884,12 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Importo"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4819,8 +4911,9 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
-msgstr ""
+#, fuzzy
+msgid "Support"
+msgstr "Importo"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Official"
@@ -4831,6 +4924,11 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Ngarko…"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4991,6 +5089,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Pastro"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -5020,6 +5123,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -5040,14 +5144,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -5071,6 +5178,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5087,11 +5195,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5104,6 +5207,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5314,16 +5422,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5639,14 +5737,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5730,19 +5820,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't contain geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6070,7 +6164,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6176,12 +6269,9 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr ""
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "Nuk mund të krijoj folderin."
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6204,8 +6294,9 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
-msgstr ""
+#, fuzzy
+msgid "New Text File..."
+msgstr "Folder i Ri..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Open File"
@@ -6287,6 +6378,11 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Hap Editorin e Shkrimit"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6324,11 +6420,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6416,6 +6512,11 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Pastro Skenat e Fundit"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6485,6 +6586,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6520,26 +6622,6 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Ndrysho Mënyrën"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Shko tek Hapi Tjetër"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Shko tek Hapi i Mëparshëm"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Hiq Autoload-in"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr ""
@@ -6560,6 +6642,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Fshi të Selektuarat"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6576,40 +6663,60 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+#, fuzzy
+msgid "Toggle Bookmark"
+msgstr "Ndrysho Mënyrën"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Bookmark"
+msgstr "Shko tek Hapi Tjetër"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Shko tek Hapi i Mëparshëm"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Remove All Bookmarks"
+msgstr "Hiq Autoload-in"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6847,8 +6954,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Vetitë:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6901,7 +7009,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6912,27 +7020,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6976,22 +7064,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -7046,8 +7118,9 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
-msgstr ""
+#, fuzzy
+msgid "Settings..."
+msgstr "Duke u lidhur..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7346,10 +7419,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7435,11 +7504,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7558,8 +7627,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7841,6 +7910,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7924,6 +7997,11 @@ msgid "Duplicate Nodes"
msgstr "Dyfisho Nyjet"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Fshi Nyjen"
@@ -7933,10 +8011,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7950,6 +8024,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Krijo një Folder"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Krijo një Folder"
@@ -8309,7 +8388,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8318,7 +8397,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8478,6 +8557,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8503,7 +8586,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8512,7 +8595,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8521,14 +8604,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8573,6 +8656,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8780,6 +8870,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Menaxho Shabllonet e Eksportit"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8926,6 +9020,15 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Projekti"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8999,8 +9102,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9020,8 +9123,9 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "Projekti"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9045,10 +9149,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9383,6 +9483,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9435,14 +9539,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9729,6 +9825,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9852,19 +9952,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9961,6 +10061,11 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Mbishkruaj"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10151,6 +10256,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Opsionet e Editorit"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10563,10 +10672,30 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Emër i palejuar. Nuk duhet të përplaset me emrin e një tipi 'buit-in'."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Krijo një Shtojcë"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Krijo një Folder"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Krijo %s të ri"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10751,10 +10880,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11484,22 +11609,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11532,6 +11641,17 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Nuk mund të hapi file_type_catche.cch për të shkruajtur, skedari nuk do "
+#~ "të ruhet!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "Nuk mund të navigoj te '%s' sepse nuk është gjetur në sistemin e "
+#~ "skedarëve!"
+
#~ msgid "Previous Folder"
#~ msgstr "Folderi i Mëparshëm"
diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po
index 4b22ba2ff2..e6d1538c83 100644
--- a/editor/translations/sr_Cyrl.po
+++ b/editor/translations/sr_Cyrl.po
@@ -59,7 +59,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Слободно"
@@ -683,17 +682,18 @@ msgid "Line Number:"
msgstr "Број линије:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "Замени %d појаве/а."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+#, fuzzy
+msgid "%d matches."
msgstr "Ðема подудара"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Замени %d појаве/а."
-
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Подударање великих и малих Ñлова"
@@ -935,8 +935,7 @@ msgstr "Омиљене:"
msgid "Recent:"
msgstr "ЧеÑте:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1039,7 +1038,7 @@ msgstr ""
"Жељене датотеке за бриÑање Ñу потребне за рад других реÑурÑа.\n"
"Ипак их обриши? (ÐЕМРОПОЗИВÐЊÐ)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
#, fuzzy
msgid "Cannot remove:"
msgstr "Ðе може Ñе обриÑати:\n"
@@ -1078,7 +1077,7 @@ msgstr "Трајно обриши %d Ñтавка(и)? (ÐЕМРОПОЗИВÐÐ
msgid "Show Dependencies"
msgstr "ЗавиÑноÑти"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Преглед повезаних реÑурÑа"
@@ -1168,14 +1167,16 @@ msgid "License"
msgstr "ЛиценÑа"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "ЛиценÑа трећег лица"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine Ñе оÑлања на бројне Ñлободне и отворене библиотеке трећег лица "
@@ -1196,7 +1197,8 @@ msgid "Licenses"
msgstr "ЛиценÑе"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Грешка при отварању датотеку пакета. Датотека није zip формата."
#: editor/editor_asset_installer.cpp
@@ -1708,12 +1710,11 @@ msgid "New"
msgstr "Ðова"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Увоз"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Извоз"
@@ -2149,6 +2150,10 @@ msgstr "Обриши"
msgid "Clear Output"
msgstr "Излаз"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2467,6 +2472,15 @@ msgid "Pick a Main Scene"
msgstr "Одабери главну Ñцену"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Затвори Ñцену"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Затвори Ñцену"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr "ÐеуÑпех при прикључивању додатка због конфигурационе датотеке: '%s'."
@@ -2584,6 +2598,11 @@ msgstr "Покрени Ñцену"
msgid "Close Tab"
msgstr "Затвори оÑтале зупчанике"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Затвори оÑтале зупчанике"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Затвори оÑтале зупчанике"
@@ -2670,6 +2689,10 @@ msgstr "Ðова наÑлеђена Ñцена..."
msgid "Open Scene..."
msgstr "Отвори Ñцену..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Отвори недавно коришћено"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Сачувај Ñцену"
@@ -2680,14 +2703,6 @@ msgid "Save All Scenes"
msgstr "Сачувај Ñве Ñцене"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Затвори Ñцену"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Отвори недавно коришћено"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Конвертуј у..."
@@ -2717,26 +2732,37 @@ msgstr "Поврати Ñцену"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Разни алати за пројекат или Ñцену."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Пројекат"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "ПоÑтавке пројекта"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Ðлати"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Извоз"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "Отвори менаџер пројекта?"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Ðлати"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Преглед повезаних реÑурÑа"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2834,12 +2860,13 @@ msgstr ""
"Када је ово коришћено на удаљеном уређају, ово је много ефикаÑније Ñа "
"мрежним датотечним ÑиÑтемом."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Уредник"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "ПоÑтавке уредника"
#: editor/editor_node.cpp
@@ -2881,14 +2908,15 @@ msgstr "ПоÑтавке уредника"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "Управљај извозним шаблонима"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Управљај извозним шаблонима"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Помоћ"
@@ -2896,12 +2924,13 @@ msgstr "Помоћ"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Тражи"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Онлајн документација"
@@ -3358,7 +3387,8 @@ msgid "Import From Node:"
msgstr "Увоз преко чвора:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Поновно преузимање"
#: editor/export_template_manager.cpp
@@ -3375,6 +3405,10 @@ msgid "Download"
msgstr "Преучми"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(ÐедоÑтаје)"
@@ -3440,13 +3474,11 @@ msgid "No response."
msgstr "Ðема одговора."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Request Failed."
msgstr "Захтев није уÑпешан."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Петља преуÑмерења."
@@ -3460,13 +3492,19 @@ msgid "Download Complete."
msgstr "Преузимање уÑпешно."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "ÐеуÑпех при чувању теме:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Грешка при захтеву url: "
#: editor/export_template_manager.cpp
@@ -3555,22 +3593,12 @@ msgstr "Преузми шаблоне"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Одабери одредиште Ñа лиÑте: "
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Ðе могу отворити „file_type_cache.cch“ за пиÑање! Ðе чувам датотеке "
-"кеш(cache) типа!"
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "Омиљене:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "ÐеуÑпех навигације у „%s“ пошто није пронађен у датотечном ÑиÑтему!"
-
-#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3612,14 +3640,14 @@ msgid "Provided name contains invalid characters."
msgstr "Дато име Ñадржи неважећа Ñлова"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Дато име Ñадржи неважећа Ñлова."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Датотека или директоријум Ñа овим именом већ поÑтоји."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Дато име Ñадржи неважећа Ñлова."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Преименовање датотеке:"
@@ -3682,6 +3710,11 @@ msgstr "Дуплирај"
msgid "Move To..."
msgstr "Помери у..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Ðова Ñцена"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3756,6 +3789,11 @@ msgstr "Датотека или директоријум Ñа овим именÐ
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Ðаправи од Ñцене"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Ðаправи Ñкриптицу"
@@ -3825,6 +3863,14 @@ msgid "Search complete"
msgstr "Потражи текÑÑ‚"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Додај у групу"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Обриши из групе"
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "Грешка: име анимације већ поÑтоји!"
@@ -3834,13 +3880,23 @@ msgstr "Грешка: име анимације већ поÑтоји!"
msgid "Invalid group name."
msgstr "Ðеважеће име."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Групе"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Обирши раÑпоред"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Групе"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr "Додај у групу"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3854,12 +3910,13 @@ msgid "Nodes in Group"
msgstr "Додај у групу"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Додај у групу"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Обриши из групе"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Отвори уредник Ñкриптица"
#: editor/groups_editor.cpp
#, fuzzy
@@ -4072,7 +4129,8 @@ msgid "MultiNode Set"
msgstr "ПоÑтави MultiNode"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Одабери чвор за мењање Ñигнала и група."
#: editor/plugin_config_dialog.cpp
@@ -4873,10 +4931,6 @@ msgid "View Files"
msgstr "Погледај датотеке"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Ðе могу решити име хоÑта:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Повезивање неуÑпешно, молимо Ð²Ð°Ñ Ð´Ð° покушате поново."
@@ -4889,14 +4943,47 @@ msgid "No response from host:"
msgstr "Ðема одговора од хоÑта:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Ðе могу решити име хоÑта:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Захтев неуÑпешан, повратни код:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Захтев није уÑпешан."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "ÐеуÑпех при чувању теме:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Захтев неуÑпео, превише преуÑмерења"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Петља преуÑмерења."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Захтев неуÑпешан, повратни код:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Време:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Лоша хеш Ñума, претпоÑтавља Ñе да је датотека измењена."
@@ -4978,8 +5065,13 @@ msgid "All"
msgstr "Ñви"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Увоз"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Прикључци"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -5001,7 +5093,8 @@ msgid "Site:"
msgstr "Веб Ñтраница:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Подршка..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -5013,6 +5106,11 @@ msgid "Testing"
msgstr "ТеÑтирање"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Учитај"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "РеÑурÑи ЗИП датотека"
@@ -5185,6 +5283,11 @@ msgstr "Ðалепи позу"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "Обриши позу"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Ðаправи тачке емиÑије од мреже"
@@ -5215,6 +5318,7 @@ msgid "Zoom Reset"
msgstr "Умањи"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Одабери режим"
@@ -5236,14 +5340,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+ДеÑни таÑтер миша: Ñелекција лиÑте дубине"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Режим померања"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Режим ротације"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "Режим Ñкалирања (R)"
@@ -5271,6 +5378,7 @@ msgid "Toggle snapping."
msgstr "Укљ./ИÑкљ. лепљења"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "КориÑти лепљење"
@@ -5289,11 +5397,6 @@ msgid "Use Rotation Snap"
msgstr "КориÑти лепљење ротације"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "ПоÑтавке лепљења..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Залепи релативно"
@@ -5307,6 +5410,11 @@ msgid "Smart Snapping"
msgstr "Паметно лепљење"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "ПоÑтавке лепљења..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
msgstr "Лепи за родитеља"
@@ -5531,16 +5639,6 @@ msgstr "ПоÑтави дршку"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Грешка при учитавању Ñлике:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "У Ñлици нема пикÑела Ñа транÑпарентношћу већом од 128..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Учитај маÑку емиÑије"
@@ -5865,14 +5963,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Извор површине није важећи (нема Ñтрана)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "Родитељ нема Ñтрана за попуњавање."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "ÐеуÑпех при мапирању облаÑти."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Одабери изворну мрежу:"
@@ -5958,20 +6048,27 @@ msgid "Generation Time (sec):"
msgstr "Време генериÑања (Ñек.):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Стране не Ñадрже облаÑÑ‚!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Чвор не Ñадржи геометрију (Ñтране)."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Ðема Ñтрана!"
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Чвор не Ñадржи геометрију."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Чвор не Ñадржи геометрију (Ñтране)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Чвор не Ñадржи геометрију."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6313,7 +6410,6 @@ msgid "Grid Settings"
msgstr "ПоÑтавке"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Залепи"
@@ -6432,12 +6528,7 @@ msgstr "Грешка при чувању TileSet!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "ÐеуÑпех при тражењу плочице:"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "ÐеуÑпех при тражењу плочице:"
#: editor/plugins/script_editor_plugin.cpp
@@ -6467,7 +6558,7 @@ msgstr "Грешка при увозу"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "Ðови директоријум..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6554,6 +6645,11 @@ msgid "Open..."
msgstr "Отвори"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Покрени Ñкриптицу"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Сачувај Ñве"
@@ -6595,13 +6691,13 @@ msgid "Save Theme"
msgstr "Сачувај тему"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Затвори документацију"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Затвори Ñве"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Затвори документацију"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Покрени"
@@ -6692,6 +6788,11 @@ msgstr "Дебагер"
msgid "Search Results"
msgstr "Потражи помоћ"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "ОчиÑти недавне Ñцене"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6767,6 +6868,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6803,26 +6905,6 @@ msgstr "Коментариши"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Укљ./ИÑкљ. режим Ñлободног гледања"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Иди на Ñледећу прекудну тачку"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Иди на претходну прекидну тачку"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Обриши Ñве Ñтавке"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Fold/Unfold Line"
msgstr "Откриј линију"
@@ -6843,6 +6925,11 @@ msgid "Complete Symbol"
msgstr "Потпун Ñимбол"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Увећај одабрано"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Обриши празнине Ñа крајева"
@@ -6861,32 +6948,37 @@ msgid "Auto Indent"
msgstr "ÐутоматÑко увлачење"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "ПоÑтави прекидну тачку"
+msgid "Find Previous"
+msgstr "Ðађи претходни"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Обриши Ñве прекидне тачке"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Филтрирај датотеке..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "КонтекÑтуална помоћ"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "Иди на Ñледећу прекудну тачку"
+msgid "Toggle Bookmark"
+msgstr "Укљ./ИÑкљ. режим Ñлободног гледања"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "Иди на претходну прекидну тачку"
+msgid "Go to Next Bookmark"
+msgstr "Иди на Ñледећу прекудну тачку"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Ðађи претходни"
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Иди на претходну прекидну тачку"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Филтрирај датотеке..."
+msgid "Remove All Bookmarks"
+msgstr "Обриши Ñве Ñтавке"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6899,8 +6991,23 @@ msgid "Go to Line..."
msgstr "Иди на линију..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "КонтекÑтуална помоћ"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "ПоÑтави прекидну тачку"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Обриши Ñве прекидне тачке"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Иди на Ñледећу прекудну тачку"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Иди на претходну прекидну тачку"
#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
@@ -7149,8 +7256,9 @@ msgid "Audio Listener"
msgstr "Звучни Ñлушалац"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "„Doppler“ режим"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Измени дужину анимације"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7206,9 +7314,8 @@ msgid "Snap Nodes To Floor"
msgstr "Залепи за мрежу"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Select Mode (Q)"
-msgstr "Режим Ñелекције (Q)\n"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7221,32 +7328,11 @@ msgstr ""
"Alt+деÑни таÑтер миша: Ñелекција лиÑте дубине"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Режим помераја (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Режим ротације (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Режим Ñкалирања (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Локалне координате"
-
-#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Local Space Mode (%s)"
+msgid "Use Local Space"
msgstr "Режим Ñкалирања (R)"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap Mode (%s)"
-msgstr "Режим лепљења:"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Поглед одоздо"
@@ -7288,22 +7374,6 @@ msgid "Focus Selection"
msgstr "Ð¤Ð¾ÐºÑƒÑ Ð½Ð° Ñелекцију"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Избор алатки"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Ðлат помераја"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Ðлат ротације"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Ðлат Ñкалирања"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Укљ./ИÑкљ. режим Ñлободног гледања"
@@ -7360,7 +7430,8 @@ msgstr "Прикажи мрежу"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "ПоÑтавке"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7680,10 +7751,6 @@ msgid "TextureRegion"
msgstr "Регион текÑтуре"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "ÐеуÑпех при чувању теме:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Додај Ñве Ñтавке"
@@ -7775,12 +7842,12 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "Ставка"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "Ставка"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7909,8 +7976,8 @@ msgstr "Цртај полчице"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8234,6 +8301,10 @@ msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Додај улаз"
@@ -8326,6 +8397,11 @@ msgid "Duplicate Nodes"
msgstr "Дуплирај чвор/ове графа"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Ðаправи чвор"
@@ -8335,10 +8411,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Vertex"
msgstr "Тачке"
@@ -8354,6 +8426,11 @@ msgstr "деÑно"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Ðаправи чвор"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Ðаправи чвор"
@@ -8722,7 +8799,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8731,7 +8808,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8900,6 +8977,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8925,7 +9006,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8934,7 +9015,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8943,14 +9024,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8997,6 +9078,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9221,6 +9309,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Извозни шаблони за ову платформу ниÑу пронађени:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Управљај извозним шаблонима"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9373,6 +9465,15 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "Пројекат"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "Ðе могу отворити '%s'."
@@ -9446,8 +9547,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9467,8 +9568,9 @@ msgid "Project Manager"
msgstr "Менаџер пројекта"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "Пројекат"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9492,10 +9594,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9835,6 +9933,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Прикључци"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9887,14 +9989,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10197,6 +10291,11 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Промени улазно име"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10325,19 +10424,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10435,6 +10534,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10633,6 +10736,10 @@ msgid "Change Shortcut"
msgstr "Промени Ñидра"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "ПоÑтавке уредника"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -11054,10 +11161,30 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Ðеважеће име. Име је резервиÑано за поÑтојећи уграђени тип."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Ðаправи нов"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Ðаправи нов"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Ðаправи нови полигон од почетка."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -11245,10 +11372,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "Чланови"
@@ -11997,22 +12120,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Ðеважећа величина фонта."
-
#: scene/resources/visual_shader.cpp
#, fuzzy
msgid "Input"
@@ -12049,6 +12156,75 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Ðе могу отворити „file_type_cache.cch“ за пиÑање! Ðе чувам датотеке "
+#~ "кеш(cache) типа!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "ÐеуÑпех навигације у „%s“ пошто није пронађен у датотечном ÑиÑтему!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Грешка при учитавању Ñлике:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "У Ñлици нема пикÑела Ñа транÑпарентношћу већом од 128..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Родитељ нема Ñтрана за попуњавање."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "ÐеуÑпех при мапирању облаÑти."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Стране не Ñадрже облаÑÑ‚!"
+
+#~ msgid "No faces!"
+#~ msgstr "Ðема Ñтрана!"
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "ÐеуÑпех при тражењу плочице:"
+
+#~ msgid "Doppler Enable"
+#~ msgstr "„Doppler“ режим"
+
+#, fuzzy
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Режим Ñелекције (Q)\n"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Режим помераја (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Режим ротације (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Режим Ñкалирања (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Локалне координате"
+
+#, fuzzy
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Режим лепљења:"
+
+#~ msgid "Tool Select"
+#~ msgstr "Избор алатки"
+
+#~ msgid "Tool Move"
+#~ msgstr "Ðлат помераја"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Ðлат ротације"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Ðлат Ñкалирања"
+
+#~ msgid "Invalid font size."
+#~ msgstr "Ðеважећа величина фонта."
+
#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "Претодни Ñпрат"
@@ -12095,10 +12271,6 @@ msgstr ""
#~ msgstr "Ðаправи ивице"
#, fuzzy
-#~ msgid "Build Project"
-#~ msgstr "Пројекат"
-
-#, fuzzy
#~ msgid "View log"
#~ msgstr "Погледај датотеке"
diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po
index 21a14c6a83..49789c467a 100644
--- a/editor/translations/sr_Latn.po
+++ b/editor/translations/sr_Latn.po
@@ -62,7 +62,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Slobodno"
@@ -659,15 +658,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -892,8 +891,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -987,7 +985,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -1023,7 +1021,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1112,14 +1110,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1136,7 +1134,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1620,12 +1618,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2019,6 +2016,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2315,6 +2316,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2408,6 +2417,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2493,20 +2506,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2539,24 +2548,32 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2636,13 +2653,14 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
-msgstr ""
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
+msgstr "Tranzicije"
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2677,14 +2695,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2692,12 +2710,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3136,7 +3155,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3153,6 +3172,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3214,12 +3237,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3233,13 +3254,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3324,19 +3349,11 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3369,11 +3386,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3432,6 +3449,10 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3495,6 +3516,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Napravi"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3555,6 +3581,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3562,12 +3596,21 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Animacija ObriÅ¡i KljuÄeve"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3580,11 +3623,11 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
+msgid "Group Editor"
msgstr ""
#: editor/groups_editor.cpp
@@ -3791,7 +3834,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4546,10 +4589,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4562,14 +4601,43 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Vreme:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4646,8 +4714,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4668,7 +4739,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4680,6 +4751,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4839,6 +4914,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Animacija Promjeni Transformaciju"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4868,6 +4948,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4888,14 +4969,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -4919,6 +5003,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4935,11 +5020,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4952,6 +5032,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5162,16 +5247,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5487,14 +5562,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5578,19 +5645,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't contain geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5922,7 +5993,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6028,11 +6098,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6056,7 +6122,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6137,6 +6203,10 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6174,11 +6244,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6266,6 +6336,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6333,6 +6407,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6368,24 +6443,6 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Otiđi Na Sljedeći Korak"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Otiđi Na Prethodni Korak"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr ""
@@ -6406,6 +6463,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Skaliraj Selekciju"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6422,44 +6484,62 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Find in Files..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
+msgid "Go to Next Bookmark"
msgstr "Otiđi Na Sljedeći Korak"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
+msgid "Go to Previous Bookmark"
msgstr "Otiđi Na Prethodni Korak"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Remove All Breakpoints"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Otiđi Na Sljedeći Korak"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Otiđi Na Prethodni Korak"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -6695,7 +6775,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6749,7 +6829,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6760,27 +6840,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6824,22 +6884,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6894,7 +6938,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7197,10 +7241,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7287,11 +7327,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7411,8 +7451,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7710,6 +7750,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7790,6 +7834,11 @@ msgid "Duplicate Nodes"
msgstr "Animacija Uduplaj KljuÄeve"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Animacija ObriÅ¡i KljuÄeve"
@@ -7799,10 +7848,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7815,6 +7860,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8176,7 +8225,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8185,7 +8234,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8348,6 +8397,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8373,7 +8426,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8382,7 +8435,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8391,14 +8444,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8443,6 +8496,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8650,6 +8710,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8796,6 +8860,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8865,8 +8937,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8886,7 +8958,7 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
+msgid "Projects"
msgstr ""
#: editor/project_manager.cpp
@@ -8911,10 +8983,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9250,6 +9318,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9302,14 +9374,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -9597,6 +9661,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9716,19 +9784,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9819,6 +9887,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10008,6 +10080,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10421,10 +10497,29 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Napravi"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Napravi"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Napravi"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10609,10 +10704,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11342,22 +11433,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
diff --git a/editor/translations/sv.po b/editor/translations/sv.po
index 0b2f9133c3..ed6ea9abe6 100644
--- a/editor/translations/sv.po
+++ b/editor/translations/sv.po
@@ -65,7 +65,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Gratis"
@@ -687,18 +686,18 @@ msgid "Line Number:"
msgstr "Radnummer:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "Ersatte %d förekomst(er)."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
#, fuzzy
-msgid "No Matches"
+msgid "%d matches."
msgstr "Inga matchningar"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Ersatte %d förekomst(er)."
-
#: editor/code_editor.cpp editor/find_in_files.cpp
#, fuzzy
msgid "Match Case"
@@ -948,8 +947,7 @@ msgstr "Favoriter:"
msgid "Recent:"
msgstr "Senaste:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1063,7 +1061,7 @@ msgstr ""
"Filerna som tas bort krävs av andra resurser för att de ska fungera.\n"
"Ta bort dem ändå? (går inte ångra)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
#, fuzzy
msgid "Cannot remove:"
msgstr "Kan inte ta bort:\n"
@@ -1108,7 +1106,7 @@ msgstr "Ta bort %d sak(er) permanent? (Går inte ångra!)"
msgid "Show Dependencies"
msgstr "Beroenden"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Föräldralös Resursutforskare"
@@ -1214,14 +1212,15 @@ msgstr "Licens"
#: editor/editor_about.cpp
#, fuzzy
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr "Tredje parts Licens"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine förlitar sig på ett antal av tredje parts gratis och öppen "
@@ -1245,7 +1244,7 @@ msgstr "Licenser"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
#, fuzzy
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr "Fel vid öppning av paketetfil, inte i zip-format."
#: editor/editor_asset_installer.cpp
@@ -1807,12 +1806,11 @@ msgid "New"
msgstr "Ny"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Importera"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Exportera"
@@ -2269,6 +2267,10 @@ msgstr "Rensa"
msgid "Clear Output"
msgstr "Output:"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Projekt exporten misslyckades med följande felmeddelande %d."
@@ -2629,6 +2631,15 @@ msgid "Pick a Main Scene"
msgstr "Välj en Huvudscen"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Stäng Scen"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Stäng Scen"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2758,6 +2769,11 @@ msgstr "Spela Scen"
msgid "Close Tab"
msgstr "Stänga Övriga Flikar"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Stänga Övriga Flikar"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Close Other Tabs"
@@ -2851,6 +2867,11 @@ msgstr "Ny Ärvd Scen..."
msgid "Open Scene..."
msgstr "Öppna Scen..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Open Recent"
+msgstr "Öppna Senaste"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Spara Scen"
@@ -2861,15 +2882,6 @@ msgid "Save All Scenes"
msgstr "Spara alla Scener"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Stäng Scen"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Open Recent"
-msgstr "Öppna Senaste"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Konvertera Till..."
@@ -2903,26 +2915,37 @@ msgstr "Återställ Scen"
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Projekt"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Projektinställningar"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Verktyg"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Exportera"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "Öppna Projekthanteraren?"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Verktyg"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Föräldralös Resursutforskare"
#: editor/editor_node.cpp
#, fuzzy
@@ -3005,13 +3028,14 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
-msgstr ""
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
+msgstr "Övergångar"
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -3048,14 +3072,15 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
-msgstr ""
-
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+msgid "Manage Editor Features..."
msgstr ""
#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
+msgstr "Mallar"
+
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Hjälp"
@@ -3063,12 +3088,13 @@ msgstr "Hjälp"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Sök"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
msgid "Online Docs"
msgstr "Dokumentation Online"
@@ -3535,8 +3561,9 @@ msgid "Import From Node:"
msgstr "Importera Från Node:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
-msgstr ""
+#, fuzzy
+msgid "Redownload"
+msgstr "Ladda ner"
#: editor/export_template_manager.cpp
msgid "Uninstall"
@@ -3553,6 +3580,10 @@ msgid "Download"
msgstr "Ladda ner"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Saknas)"
@@ -3619,12 +3650,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3639,14 +3668,20 @@ msgid "Download Complete."
msgstr "Nedladdning Klar."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Kan inte spara tema till fil:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
-msgstr ""
+#, fuzzy
+msgid "Error requesting URL:"
+msgstr "Fel vid laddning:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
@@ -3743,20 +3778,12 @@ msgstr "Ladda Ner Mallar"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "Favoriter:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3792,15 +3819,15 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
#, fuzzy
msgid "A file or folder with this name already exists."
msgstr "En fil eller mapp med detta namn finns redan."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Renaming file:"
msgstr "Byter namn på filen:"
@@ -3869,6 +3896,11 @@ msgstr "Duplicera"
msgid "Move To..."
msgstr "Flytta Till..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Ny Scen"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3941,6 +3973,11 @@ msgstr "En fil eller mapp med detta namn finns redan."
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Skapa från Scen"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Skapa Skript"
@@ -4013,6 +4050,14 @@ msgid "Search complete"
msgstr "Söktext"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Lägg till i Grupp"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Ta bort från Grupp"
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "ERROR: Animationsnamn finns redan!"
@@ -4022,13 +4067,23 @@ msgstr "ERROR: Animationsnamn finns redan!"
msgid "Invalid group name."
msgstr "Ogiltigt namn."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Grupper"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Ta bort Layout"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupper"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr "Lägg till i Grupp"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -4042,12 +4097,13 @@ msgid "Nodes in Group"
msgstr "Lägg till i Grupp"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Lägg till i Grupp"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Ta bort från Grupp"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Öppna Skript-Redigerare"
#: editor/groups_editor.cpp
#, fuzzy
@@ -4271,7 +4327,7 @@ msgstr "MultiNode Ange"
#: editor/node_dock.cpp
#, fuzzy
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr "Välj en Node för att redigera Signaler och Grupper."
#: editor/plugin_config_dialog.cpp
@@ -5084,10 +5140,6 @@ msgid "View Files"
msgstr "Visa Filer"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -5100,14 +5152,44 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Kan inte spara tema till fil:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Tid:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -5189,8 +5271,12 @@ msgid "All"
msgstr "Alla"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Importera"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -5212,8 +5298,9 @@ msgid "Site:"
msgstr "Webbplats:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
-msgstr ""
+#, fuzzy
+msgid "Support"
+msgstr "Importera"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Official"
@@ -5224,6 +5311,11 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Ladda"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -5389,6 +5481,11 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "Rensa"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Skapa från Scen"
@@ -5419,6 +5516,7 @@ msgid "Zoom Reset"
msgstr "Zooma Ut"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -5439,14 +5537,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "Växla Läge"
@@ -5471,6 +5572,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5488,11 +5590,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5505,6 +5602,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5725,16 +5827,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -6060,14 +6152,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -6157,19 +6241,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6507,7 +6595,6 @@ msgid "Grid Settings"
msgstr "Inställningar"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6621,12 +6708,7 @@ msgstr "Fel vid sparande av TileSet!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "Fel - Kunde inte skapa Skript i filsystemet."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "Fel - Kunde inte skapa Skript i filsystemet."
#: editor/plugins/script_editor_plugin.cpp
@@ -6656,7 +6738,7 @@ msgstr "Fel vid laddning:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "Ny Mapp..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6751,6 +6833,11 @@ msgid "Open..."
msgstr "Öppen"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Öppna Skript"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Spara Alla"
@@ -6794,13 +6881,13 @@ msgid "Save Theme"
msgstr "Spara Tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Stäng Alla"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Kör"
@@ -6891,6 +6978,11 @@ msgstr ""
msgid "Search Results"
msgstr "Sök Hjälp"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Rensa Senaste Scener"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6967,6 +7059,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -7004,26 +7097,6 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Växla Läge"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Gå Till Nästa Steg"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Ge Till Föregående Steg"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Ta bort Alla"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr ""
@@ -7044,6 +7117,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Skala urval"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -7063,32 +7141,37 @@ msgid "Auto Indent"
msgstr "Automatisk Indentering"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Filtrera Filer..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "Gå Till Nästa Steg"
+msgid "Toggle Bookmark"
+msgstr "Växla Läge"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "Ge Till Föregående Steg"
+msgid "Go to Next Bookmark"
+msgstr "Gå Till Nästa Steg"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Ge Till Föregående Steg"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Filtrera Filer..."
+msgid "Remove All Bookmarks"
+msgstr "Ta bort Alla"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -7101,9 +7184,24 @@ msgid "Go to Line..."
msgstr "GÃ¥ till Rad"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Gå Till Nästa Steg"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Ge Till Föregående Steg"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -7369,8 +7467,9 @@ msgid "Audio Listener"
msgstr "Ljud-Lyssnare"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Redigerbara Barn"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -7424,9 +7523,8 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Select Mode (Q)"
-msgstr "Välj Node"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7436,27 +7534,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7506,22 +7584,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -7577,7 +7639,8 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Inställningar"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7892,11 +7955,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
-msgid "Can't save theme to file:"
-msgstr "Kan inte spara tema till fil:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7988,11 +8046,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -8120,8 +8178,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8437,6 +8495,10 @@ msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Lägg till Signal"
@@ -8523,6 +8585,12 @@ msgid "Duplicate Nodes"
msgstr "Duplicera Nod(er)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "Klistra in Noder"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Ta bort Nod(er)"
@@ -8532,10 +8600,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -8550,6 +8614,11 @@ msgstr "Höger"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Skapa Node"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Skapa Node"
@@ -8914,7 +8983,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8923,7 +8992,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -9087,6 +9156,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -9112,7 +9185,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -9121,7 +9194,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -9130,14 +9203,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -9182,6 +9255,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9400,6 +9480,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9563,6 +9647,15 @@ msgstr "Namnlöst Projekt"
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "Importera Befintligt Projekt"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "Kan inte öppna projekt"
@@ -9636,8 +9729,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9659,8 +9752,8 @@ msgstr "Projektledare"
#: editor/project_manager.cpp
#, fuzzy
-msgid "Project List"
-msgstr "Projektlista"
+msgid "Projects"
+msgstr "Projekt"
#: editor/project_manager.cpp
#, fuzzy
@@ -9689,11 +9782,6 @@ msgstr "Mallar"
#: editor/project_manager.cpp
#, fuzzy
-msgid "Exit"
-msgstr "Avsluta"
-
-#: editor/project_manager.cpp
-#, fuzzy
msgid "Restart Now"
msgstr "Starta om nu"
@@ -10046,6 +10134,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
#, fuzzy
msgid "Zero"
@@ -10102,14 +10194,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10426,6 +10510,11 @@ msgid "Remove Node(s)"
msgstr "Ta bort Nod(er)"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Ändra Typ"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10559,19 +10648,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10676,6 +10765,10 @@ msgid "Error loading script from %s"
msgstr "Fel vid laddning av Skript från %s"
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10885,6 +10978,10 @@ msgid "Change Shortcut"
msgstr "Genvägar"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
#, fuzzy
msgid "Shortcuts"
msgstr "Genvägar"
@@ -11315,10 +11412,30 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Ogiltigt namn. FÃ¥r inte vara samma som ett befintligt inbyggt typnamn."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Skapa Ny"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Variabler:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Skapa Ny"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Skapa Prenumeration"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -11522,11 +11639,6 @@ msgstr "Klipp ut Noder"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
-msgid "Paste Nodes"
-msgstr "Klistra in Noder"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
msgstr "Medlemmar"
@@ -12313,26 +12425,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-#, fuzzy
-msgid "Error initializing FreeType."
-msgstr "Fel vid initiering av FreeType."
-
-#: scene/resources/dynamic_font.cpp
-#, fuzzy
-msgid "Unknown font format."
-msgstr "Okänt fontformat."
-
-#: scene/resources/dynamic_font.cpp
-#, fuzzy
-msgid "Error loading font."
-msgstr "Fel vid laddning av font."
-
-#: scene/resources/dynamic_font.cpp
-#, fuzzy
-msgid "Invalid font size."
-msgstr "Ogiltig teckenstorlek."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -12369,6 +12461,38 @@ msgid "Constants cannot be modified."
msgstr ""
#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "Fel - Kunde inte skapa Skript i filsystemet."
+
+#, fuzzy
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Välj Node"
+
+#, fuzzy
+#~ msgid "Project List"
+#~ msgstr "Projektlista"
+
+#, fuzzy
+#~ msgid "Exit"
+#~ msgstr "Avsluta"
+
+#, fuzzy
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Fel vid initiering av FreeType."
+
+#, fuzzy
+#~ msgid "Unknown font format."
+#~ msgstr "Okänt fontformat."
+
+#, fuzzy
+#~ msgid "Error loading font."
+#~ msgstr "Fel vid laddning av font."
+
+#, fuzzy
+#~ msgid "Invalid font size."
+#~ msgstr "Ogiltig teckenstorlek."
+
+#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "Föregående flik"
diff --git a/editor/translations/ta.po b/editor/translations/ta.po
index 4444305cf2..521b42b338 100644
--- a/editor/translations/ta.po
+++ b/editor/translations/ta.po
@@ -60,7 +60,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr ""
@@ -652,15 +651,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -885,8 +884,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -980,7 +978,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -1016,7 +1014,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1105,14 +1103,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1129,7 +1127,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1613,12 +1611,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2009,6 +2006,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2305,6 +2306,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2398,6 +2407,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2483,20 +2496,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2529,24 +2538,32 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2626,13 +2643,14 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
-msgstr ""
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
+msgstr "மாறà¯à®±à®™à¯à®•ளை இதறà¯à®•௠அமை:"
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2667,14 +2685,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2682,12 +2700,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3125,7 +3144,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3142,6 +3161,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3203,12 +3226,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3222,13 +3243,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3313,19 +3338,11 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3358,11 +3375,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3422,6 +3439,10 @@ msgstr "அசைவூடà¯à®Ÿà¯ போலிபசà¯à®šà®¾à®µà®¿à®•ளà¯"
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3485,6 +3506,10 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "Create Scene"
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3545,6 +3570,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3552,12 +3585,21 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•ளà¯"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3570,11 +3612,11 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
+msgid "Group Editor"
msgstr ""
#: editor/groups_editor.cpp
@@ -3781,7 +3823,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4532,10 +4574,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4548,14 +4586,42 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4632,8 +4698,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4654,7 +4723,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4666,6 +4735,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4823,6 +4896,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "உரà¯à®®à®¾à®±à¯à®±à®®à¯ அசைவூடà¯à®Ÿà¯"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4852,6 +4930,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4872,14 +4951,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -4903,6 +4985,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4919,11 +5002,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4936,6 +5014,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5143,16 +5226,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5465,14 +5538,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5556,19 +5621,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5897,7 +5966,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6003,11 +6071,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6031,7 +6095,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6112,6 +6176,10 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6149,11 +6217,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6241,6 +6309,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6307,6 +6379,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6341,92 +6414,97 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
+msgid "Fold/Unfold Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
+msgid "Fold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
+msgid "Unfold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
+msgid "Clone Down"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
+msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•ளà¯"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
+msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6664,7 +6742,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6718,7 +6796,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6729,27 +6807,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6793,22 +6851,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6863,7 +6905,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7158,10 +7200,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7248,11 +7286,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7372,8 +7410,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7655,6 +7693,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7733,6 +7775,11 @@ msgid "Duplicate Nodes"
msgstr "அசைவூடà¯à®Ÿà¯ போலிபசà¯à®šà®¾à®µà®¿à®•ளà¯"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•ளà¯"
@@ -7742,10 +7789,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7758,6 +7801,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8117,7 +8164,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8126,7 +8173,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8286,6 +8333,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8311,7 +8362,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8320,7 +8371,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8329,14 +8380,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8381,6 +8432,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8588,6 +8646,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8734,6 +8796,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8803,8 +8873,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8824,7 +8894,7 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
+msgid "Projects"
msgstr ""
#: editor/project_manager.cpp
@@ -8848,10 +8918,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9186,6 +9252,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9238,14 +9308,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -9533,6 +9595,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9651,19 +9717,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9754,6 +9820,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -9942,6 +10012,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10355,10 +10429,26 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10543,10 +10633,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11276,22 +11362,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
diff --git a/editor/translations/te.po b/editor/translations/te.po
index abc011cfab..24f581a5e6 100644
--- a/editor/translations/te.po
+++ b/editor/translations/te.po
@@ -58,7 +58,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr ""
@@ -631,15 +630,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -863,8 +862,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -958,7 +956,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -994,7 +992,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1083,14 +1081,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1107,7 +1105,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1590,12 +1588,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -1985,6 +1982,10 @@ msgstr ""
msgid "Clear Output"
msgstr ""
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2281,6 +2282,14 @@ msgid "Pick a Main Scene"
msgstr ""
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2374,6 +2383,10 @@ msgstr ""
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2458,20 +2471,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2504,24 +2513,32 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2601,12 +2618,12 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
msgstr ""
#: editor/editor_node.cpp
@@ -2642,14 +2659,14 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr ""
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2657,12 +2674,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3099,7 +3117,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3116,6 +3134,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3177,12 +3199,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3196,13 +3216,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3287,19 +3311,11 @@ msgstr ""
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3332,11 +3348,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3395,6 +3411,10 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -3458,6 +3478,10 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+msgid "Create Scene"
+msgstr ""
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3518,6 +3542,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3525,12 +3557,20 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Delete Group"
+msgstr ""
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3543,11 +3583,11 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
+msgid "Group Editor"
msgstr ""
#: editor/groups_editor.cpp
@@ -3754,7 +3794,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4496,10 +4536,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4512,14 +4548,42 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4596,8 +4660,11 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+msgid "Import..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4618,7 +4685,7 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+msgid "Support"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4630,6 +4697,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
@@ -4784,6 +4855,10 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4812,6 +4887,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4832,14 +4908,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr ""
@@ -4863,6 +4942,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4879,11 +4959,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4896,6 +4971,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5103,16 +5183,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5423,14 +5493,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5514,19 +5576,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5853,7 +5919,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -5959,11 +6024,7 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5987,7 +6048,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6068,6 +6129,10 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6105,11 +6170,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6197,6 +6262,10 @@ msgstr ""
msgid "Search Results"
msgstr ""
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr ""
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6263,6 +6332,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6297,92 +6367,96 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
+msgid "Fold/Unfold Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
+msgid "Fold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
+msgid "Unfold All Lines"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
+msgid "Clone Down"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
+msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
+msgid "Evaluate Selection"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
+msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
+msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
+msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6620,7 +6694,7 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
+msgid "Enable Doppler"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6674,7 +6748,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6685,27 +6759,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6749,22 +6803,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6819,7 +6857,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7112,10 +7150,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7200,11 +7234,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7322,8 +7356,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7602,6 +7636,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7678,15 +7716,16 @@ msgid "Duplicate Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Delete Nodes"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Visual Shader Input Type Changed"
+msgid "Delete Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
+msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7702,6 +7741,10 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr ""
@@ -8060,7 +8103,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8069,7 +8112,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8228,6 +8271,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8253,7 +8300,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8262,7 +8309,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8271,14 +8318,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8323,6 +8370,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8530,6 +8584,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8676,6 +8734,14 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8745,8 +8811,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8766,7 +8832,7 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
+msgid "Projects"
msgstr ""
#: editor/project_manager.cpp
@@ -8790,10 +8856,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9127,6 +9189,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9179,14 +9245,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9472,6 +9530,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9589,19 +9651,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9692,6 +9754,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -9880,6 +9946,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10290,10 +10360,26 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10478,10 +10564,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11211,22 +11293,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
diff --git a/editor/translations/th.po b/editor/translations/th.po
index e23decda82..1b847414c4 100644
--- a/editor/translations/th.po
+++ b/editor/translations/th.po
@@ -64,7 +64,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "ฟรี"
@@ -688,17 +687,18 @@ msgid "Line Number:"
msgstr "บรรทัดที่:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "à¹à¸—นที่à¹à¸¥à¹‰à¸§ %d ครั้ง"
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+#, fuzzy
+msgid "%d matches."
msgstr "ไม่พบ"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "à¹à¸—นที่à¹à¸¥à¹‰à¸§ %d ครั้ง"
-
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "ตรงตามอัà¸à¸©à¸£à¸žà¸´à¸¡à¸žà¹Œà¹€à¸¥à¹‡à¸-ใหà¸à¹ˆ"
@@ -936,8 +936,7 @@ msgstr "ที่ชื่นชอบ:"
msgid "Recent:"
msgstr "ล่าสุด:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1040,7 +1039,7 @@ msgstr ""
"มีรีซอร์สอื่นต้องà¸à¸²à¸£à¹„ฟล์ที่à¸à¸³à¸¥à¸±à¸‡à¸¥à¸š\n"
"ยืนยันจะลบหรือไม่? (ย้อนà¸à¸¥à¸±à¸šà¹„ม่ได้)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "ไม่สามารถลบ:"
@@ -1078,7 +1077,7 @@ msgstr "ลบ %d ไฟล์ถาวร? (ย้อนà¸à¸¥à¸±à¸šà¹„ม่à¹
msgid "Show Dependencies"
msgstr "à¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "ตัวจัดà¸à¸²à¸£à¸£à¸µà¸‹à¸­à¸£à¹Œà¸ªà¸—ี่ไม่มีเจ้าของ"
@@ -1167,14 +1166,16 @@ msgid "License"
msgstr "สัà¸à¸à¸²à¸­à¸™à¸¸à¸à¸²à¸•"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "สัà¸à¸à¸²à¸­à¸™à¸¸à¸à¸²à¸•ไลบรารี"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine อาศัยไลบรารีต่าง ๆ ที่นำมาใช้ได้อย่างเสรีà¹à¸¥à¸°à¹€à¸›à¸´à¸”เผยโค้ดเป็นจำนวนมาภ"
@@ -1194,7 +1195,8 @@ msgid "Licenses"
msgstr "สัà¸à¸à¸²à¸­à¸™à¸¸à¸à¸²à¸•"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "ผิดพลาดขณะเปิดไฟล์à¹à¸žà¸„เà¸à¸ˆ, ไม่ใช่รูปà¹à¸šà¸š zip"
#: editor/editor_asset_installer.cpp
@@ -1708,12 +1710,11 @@ msgid "New"
msgstr "ไฟล์ใหม่"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "นำเข้า"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "ส่งออà¸"
@@ -2142,6 +2143,11 @@ msgstr "ลบ"
msgid "Clear Output"
msgstr "ลบข้อความ"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "หน้าต่าง"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2454,6 +2460,15 @@ msgid "Pick a Main Scene"
msgstr "เลือà¸à¸‰à¸²à¸à¹€à¸£à¸´à¹ˆà¸¡à¸•้น"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "ปิดไฟล์ฉาà¸"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "ปิดไฟล์ฉาà¸"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr "ไม่สามารถเปิดใช้งานปลั๊à¸à¸­à¸´à¸™: '%s'"
@@ -2561,6 +2576,11 @@ msgstr "เล่น"
msgid "Close Tab"
msgstr "ปิดà¹à¸—็บอื่น"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "ปิดà¹à¸—็บอื่น"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "ปิดà¹à¸—็บอื่น"
@@ -2647,6 +2667,10 @@ msgstr "สืบทอดฉาà¸à¹ƒà¸«à¸¡à¹ˆ..."
msgid "Open Scene..."
msgstr "เปิดไฟล์ฉาà¸..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "เปิดไฟล์ล่าสุด"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "บันทึà¸à¸‰à¸²à¸"
@@ -2657,14 +2681,6 @@ msgid "Save All Scenes"
msgstr "บันทึà¸à¸—ุà¸à¸‰à¸²à¸"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "ปิดไฟล์ฉาà¸"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "เปิดไฟล์ล่าสุด"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™..."
@@ -2694,26 +2710,36 @@ msgstr "คืนà¸à¸¥à¸±à¸šà¸‰à¸²à¸"
msgid "Miscellaneous project or scene-wide tools."
msgstr "โปรเจà¸à¸•์à¹à¸¥à¸°à¹€à¸„รื่องมืออื่น ๆ"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "โปรเจà¸à¸•์"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "ตัวเลือà¸à¹‚ปรเจà¸à¸•์"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "เครื่องมือ"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr "ส่งออà¸..."
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "เปิดตัวจัดà¸à¸²à¸£à¹‚ปรเจà¸à¸•์?"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "เครื่องมือ"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "ตัวจัดà¸à¸²à¸£à¸£à¸µà¸‹à¸­à¸£à¹Œà¸ªà¸—ี่ไม่มีเจ้าของ"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2799,12 +2825,13 @@ msgstr ""
"เมื่อเปิดตัวเลือà¸à¸™à¸µà¹‰ สคริปต์ที่บันทึà¸à¸ˆà¸°à¹‚หลดในเà¸à¸¡à¸—ันที\n"
"ถ้าใช้à¸à¸±à¸šà¸­à¸¸à¸›à¸à¸£à¸“์รีโมท จะดีà¸à¸§à¹ˆà¸²à¸–้าเปิดระบบไฟล์เครือข่ายด้วย"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "โปรà¹à¸à¸£à¸¡"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "ตัวเลือà¸à¹‚ปรà¹à¸à¸£à¸¡à¸ªà¸£à¹‰à¸²à¸‡à¹€à¸à¸¡"
#: editor/editor_node.cpp
@@ -2846,14 +2873,15 @@ msgstr "ตัวเลือà¸à¹‚ปรà¹à¸à¸£à¸¡à¸ªà¸£à¹‰à¸²à¸‡à¹€à¸à¸¡"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "จัดà¸à¸²à¸£à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸­à¸­à¸"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "จัดà¸à¸²à¸£à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸­à¸­à¸"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "ช่วยเหลือ"
@@ -2861,12 +2889,13 @@ msgstr "ช่วยเหลือ"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "ค้นหา"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "คู่มือ"
@@ -3323,7 +3352,8 @@ msgid "Import From Node:"
msgstr "นำเข้าจาà¸à¹‚หนด:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "ดาวน์โหลดอีà¸à¸„รั้ง"
#: editor/export_template_manager.cpp
@@ -3340,6 +3370,10 @@ msgid "Download"
msgstr "ดาวน์โหลด"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(ไม่พบ)"
@@ -3402,12 +3436,10 @@ msgid "No response."
msgstr "ไม่มีà¸à¸²à¸£à¸•อบà¸à¸¥à¸±à¸š"
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "ร้องขอผิดพลาด"
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "เปลี่ยนทางมาà¸à¹€à¸à¸´à¸™à¹„ป"
@@ -3421,13 +3453,19 @@ msgid "Download Complete."
msgstr "ดาวน์โหลดเสร็จสิ้น"
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "บันทึà¸à¸˜à¸µà¸¡à¹„ม่ได้:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "ผิดพลาดขณะร้องขอที่อยู่: "
#: editor/export_template_manager.cpp
@@ -3515,20 +3553,12 @@ msgstr "ดาวน์โหลดà¹à¸¡à¹ˆà¹à¸šà¸š"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "เลือà¸à¸¥à¸´à¸‡à¸à¹Œà¸”าวน์โหลด: "
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr "เปิดไฟล์ file_type_cache.cch เพื่อเขียนไม่ได้ จะไม่บันทึà¸à¹à¸„ชของชนิดไฟล์!"
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "ที่ชื่นชอบ:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "ไม่สามารถไปยัง '%s' เนื่องจาà¸à¹„ม่พบในระบบ!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr "สถานะ: นำเข้าไฟล์ล้มเหลว à¸à¸£à¸¸à¸“าà¹à¸à¹‰à¹„ขไฟล์à¹à¸¥à¸°à¸™à¸³à¹€à¸‚้าใหม่"
@@ -3562,14 +3592,14 @@ msgid "Provided name contains invalid characters."
msgstr "ไม่สามารถใช้อัà¸à¸©à¸£à¸šà¸²à¸‡à¸•ัวในชื่อได้"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "อัà¸à¸©à¸£à¸šà¸²à¸‡à¸•ัวใช้ไม่ได้"
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "มีชื่อà¸à¸¥à¸¸à¹ˆà¸¡à¸™à¸µà¹‰à¸­à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§"
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "อัà¸à¸©à¸£à¸šà¸²à¸‡à¸•ัวใช้ไม่ได้"
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "เปลี่ยนชื่อไฟล์:"
@@ -3629,6 +3659,11 @@ msgstr "ทำซ้ำ..."
msgid "Move To..."
msgstr "ย้ายไป..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "ฉาà¸à¹ƒà¸«à¸¡à¹ˆ"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3703,6 +3738,11 @@ msgstr "มีโฟลเดอร์ชื่อเดียวà¸à¸±à¸™à¸­à¸¢
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "สร้างจาà¸à¸‰à¸²à¸"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "สร้างสคริปต์"
@@ -3772,6 +3812,14 @@ msgid "Search complete"
msgstr "ค้นหาคำ"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "เพิ่มไปยังà¸à¸¥à¸¸à¹ˆà¸¡"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "ลบออà¸à¸ˆà¸²à¸à¸à¸¥à¸¸à¹ˆà¸¡"
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "ผิดพลาด: มีชื่อà¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸™à¸µà¹‰à¸­à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§!"
@@ -3781,13 +3829,23 @@ msgstr "ผิดพลาด: มีชื่อà¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸™à
msgid "Invalid group name."
msgstr "ชื่อผิดพลาด"
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "à¸à¸¥à¸¸à¹ˆà¸¡"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "ลบเลย์เอาต์"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "à¸à¸¥à¸¸à¹ˆà¸¡"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr "เพิ่มไปยังà¸à¸¥à¸¸à¹ˆà¸¡"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3801,12 +3859,13 @@ msgid "Nodes in Group"
msgstr "à¹à¸à¹‰à¹„ขà¸à¸¥à¸¸à¹ˆà¸¡"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "เพิ่มไปยังà¸à¸¥à¸¸à¹ˆà¸¡"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "ลบออà¸à¸ˆà¸²à¸à¸à¸¥à¸¸à¹ˆà¸¡"
+#, fuzzy
+msgid "Group Editor"
+msgstr "เปิดตัวà¹à¸à¹‰à¹„ขสคริปต์"
#: editor/groups_editor.cpp
#, fuzzy
@@ -4017,7 +4076,8 @@ msgid "MultiNode Set"
msgstr "à¸à¸³à¸«à¸™à¸” MultiNode"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "เลือà¸à¹‚หนดเพื่อà¹à¸à¹‰à¹„ขสัà¸à¸à¸²à¸“à¹à¸¥à¸°à¸à¸¥à¸¸à¹ˆà¸¡"
#: editor/plugin_config_dialog.cpp
@@ -4824,10 +4884,6 @@ msgid "View Files"
msgstr "ดูไฟล์"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "ไม่พบตำà¹à¸«à¸™à¹ˆà¸‡à¸™à¸µà¹‰:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "เชื่อมต่อไม่ได้ à¸à¸£à¸¸à¸“าลองใหม่"
@@ -4840,14 +4896,47 @@ msgid "No response from host:"
msgstr "ไม่มีà¸à¸²à¸£à¸•อบà¸à¸¥à¸±à¸šà¸ˆà¸²à¸à¹‚ฮสต์:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "ไม่พบตำà¹à¸«à¸™à¹ˆà¸‡à¸™à¸µà¹‰:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "à¸à¸²à¸£à¸£à¹‰à¸­à¸‡à¸‚อผิดพลาด รหัส:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "ร้องขอผิดพลาด"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "บันทึà¸à¸˜à¸µà¸¡à¹„ม่ได้:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "à¸à¸²à¸£à¸£à¹‰à¸­à¸‡à¸‚อผิดพลาด เปลี่ยนทางมาà¸à¹€à¸à¸´à¸™à¹„ป"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "เปลี่ยนทางมาà¸à¹€à¸à¸´à¸™à¹„ป"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "à¸à¸²à¸£à¸£à¹‰à¸­à¸‡à¸‚อผิดพลาด รหัส:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "เวลา"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "à¹à¸®à¸Šà¸œà¸´à¸”พลาด ไฟล์ดาวน์โหลดอาจเสียหาย"
@@ -4929,8 +5018,13 @@ msgid "All"
msgstr "ทั้งหมด"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "นำเข้าอีà¸à¸„รั้ง..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "ปลั๊à¸à¸­à¸´à¸™"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4952,7 +5046,8 @@ msgid "Site:"
msgstr "ไซต์:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "à¸à¸²à¸£à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4964,6 +5059,11 @@ msgid "Testing"
msgstr "ทดสอบ"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "โหลด"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "ไฟล์ ZIP"
@@ -5139,6 +5239,11 @@ msgstr "วางท่าทาง"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "ลบท่าทาง"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "สร้างจุดปะทุจาภMesh"
@@ -5169,6 +5274,7 @@ msgid "Zoom Reset"
msgstr "รีเซ็ตà¸à¸²à¸£à¸‹à¸¹à¸¡"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "โหมดเลือà¸"
@@ -5189,14 +5295,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+คลิà¸à¸‚วา: เลือà¸à¸—ี่ซ้อนà¸à¸±à¸™"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "โหมดเคลื่อนย้าย"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "โหมดหมุน"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "โหมดปรับขนาด (R)"
@@ -5224,6 +5333,7 @@ msgid "Toggle snapping."
msgstr "เปิด/ปิด à¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸”"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "จำà¸à¸±à¸”à¸à¸²à¸£à¹€à¸„ลื่อนย้าย"
@@ -5242,11 +5352,6 @@ msgid "Use Rotation Snap"
msgstr "จำà¸à¸±à¸”à¸à¸²à¸£à¸«à¸¡à¸¸à¸™"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "ตั้งค่าà¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸”..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "จำà¸à¸±à¸”โดยใช้ตำà¹à¸«à¸™à¹ˆà¸‡à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™"
@@ -5260,6 +5365,11 @@ msgid "Smart Snapping"
msgstr "จำà¸à¸±à¸”อัตโนมัติ"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "ตั้งค่าà¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸”..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
msgstr "จำà¸à¸±à¸”ด้วยโหนดà¹à¸¡à¹ˆ"
@@ -5485,16 +5595,6 @@ msgstr "ปรับขนาดรูปร่าง"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "ผิดพลาดขณะโหลดรูป:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "รูปไม่มีพิà¸à¹€à¸‹à¸¥à¹ƒà¸”ที่ความโปร่งà¹à¸ªà¸‡ > 128 ..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "โหลด Mask à¸à¸²à¸£à¸›à¸°à¸—ุ"
@@ -5817,14 +5917,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "พื้นผิวต้นฉบับไม่ถูà¸à¸•้อง (ไม่มีหน้า)"
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "โหนดà¹à¸¡à¹ˆà¹„ม่มีพื้นผิวเพื่อสร้าง"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "ไม่สามารถวางพื้นที่"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "เลือภMesh ต้นฉบับ:"
@@ -5910,20 +6002,27 @@ msgid "Generation Time (sec):"
msgstr "เวลาในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡ (วินาที):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "หน้าไม่มีพื้นที่!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "ไม่มีหน้า!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "โหนดไม่มี geometry (หน้า)"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "โหนดไม่มี geometry"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "โหนดไม่มี geometry (หน้า)"
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "โหนดไม่มี geometry"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6265,7 +6364,6 @@ msgid "Grid Settings"
msgstr "à¸à¸²à¸£à¸•ั้งค่า GridMap"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "จำà¸à¸±à¸”à¸à¸²à¸£à¹€à¸„ลื่อนย้าย"
@@ -6380,13 +6478,8 @@ msgstr "ผิดพลาดขณะย้ายไฟล์:\n"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "โหลดภาพไม่ได้"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
-msgstr "โหลดภาพไม่ได้"
+msgid "Could not load file at:"
+msgstr "ไม่พบ tile:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6415,7 +6508,7 @@ msgstr "ผิดพลาดขณะนำเข้า"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "สร้างโฟลเดอร์..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6502,6 +6595,11 @@ msgid "Open..."
msgstr "เปิด"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "เปิดสคริปต์"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "บันทึà¸à¸—ั้งหมด"
@@ -6541,13 +6639,13 @@ msgid "Save Theme"
msgstr "บันทึà¸à¸˜à¸µà¸¡"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "ปิดคู่มือ"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "ปิดทั้งหมด"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "ปิดคู่มือ"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "รัน"
@@ -6638,6 +6736,11 @@ msgstr "ตัวà¹à¸à¹‰à¹„ขจุดบà¸à¸žà¸£à¹ˆà¸­à¸‡"
msgid "Search Results"
msgstr "ค้นหาในคู่มือ"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "ล้างรายà¸à¸²à¸£à¸‰à¸²à¸à¸¥à¹ˆà¸²à¸ªà¸¸à¸”"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6712,6 +6815,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6747,26 +6851,6 @@ msgid "Toggle Comment"
msgstr "เปิด/ปิด ความคิดเห็น"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "เปิด/ปิดมุมมองอิสระ"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "ไปจุดพัà¸à¸–ัดไป"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "ไปจุดพัà¸à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "ลบทั้งหมด"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "ซ่อน/à¹à¸ªà¸”งบรรทัด"
@@ -6787,6 +6871,11 @@ msgid "Complete Symbol"
msgstr "เสนอà¹à¸™à¸°à¸„ำเต็ม"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "ปรับอัตราส่วนเวลาคีย์ที่เลือà¸"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "ลบตัวอัà¸à¸©à¸£à¸—ี่มองไม่เห็น"
@@ -6805,32 +6894,37 @@ msgid "Auto Indent"
msgstr "ย่อหน้าอัตโนมัติ"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "เปิด/ปิด จุดพัà¸à¹‚ปรà¹à¸à¸£à¸¡"
+msgid "Find Previous"
+msgstr "ค้นหาà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "ลบจุดพัà¸à¸—ั้งหมด"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "คัดà¸à¸£à¸­à¸‡à¹„ฟล์..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "ค้นหาคำที่เลือà¸à¹ƒà¸™à¸„ู่มือ"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "ไปจุดพัà¸à¸–ัดไป"
+msgid "Toggle Bookmark"
+msgstr "เปิด/ปิดมุมมองอิสระ"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "ไปจุดพัà¸à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"
+msgid "Go to Next Bookmark"
+msgstr "ไปจุดพัà¸à¸–ัดไป"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "ค้นหาà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "ไปจุดพัà¸à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "คัดà¸à¸£à¸­à¸‡à¹„ฟล์..."
+msgid "Remove All Bookmarks"
+msgstr "ลบทั้งหมด"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6843,8 +6937,23 @@ msgid "Go to Line..."
msgstr "ไปยังบรรทัด..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "ค้นหาคำที่เลือà¸à¹ƒà¸™à¸„ู่มือ"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "เปิด/ปิด จุดพัà¸à¹‚ปรà¹à¸à¸£à¸¡"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "ลบจุดพัà¸à¸—ั้งหมด"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "ไปจุดพัà¸à¸–ัดไป"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "ไปจุดพัà¸à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"
#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
@@ -7093,8 +7202,9 @@ msgid "Audio Listener"
msgstr "ตัวรับเสียง"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "เปิดดอปเพลอร์"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "à¹à¸à¹‰à¹„ขโหนดลูà¸à¹„ด้"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7150,8 +7260,8 @@ msgid "Snap Nodes To Floor"
msgstr "จำà¸à¸±à¸”ด้วยเส้นตาราง"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "โหมดเลือภ(Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7164,30 +7274,11 @@ msgstr ""
"Alt+คลิà¸à¸‚วา: เลือà¸à¸—ี่ซ้อนà¸à¸±à¸™"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "โหมดเคลื่อนย้าย (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "โหมดหมุน (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "โหมดปรับขนาด (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "พิà¸à¸±à¸”ภายใน"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "โหมดพิà¸à¸±à¸”ภายใน (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "โหมดà¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸” (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "มุมล่าง"
@@ -7229,22 +7320,6 @@ msgid "Focus Selection"
msgstr "มองวัตถุที่เลือà¸"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "เครื่องมือเลือà¸"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "เครื่องมือย้าย"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "เครื่องมือหมุน"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "เครื่องมือปรับขนาด"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "เปิด/ปิดมุมมองอิสระ"
@@ -7301,7 +7376,8 @@ msgstr "à¹à¸ªà¸”งเส้นตาราง"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "ตัวเลือà¸"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7620,10 +7696,6 @@ msgid "TextureRegion"
msgstr "ขอบเขต Texture"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "บันทึà¸à¸˜à¸µà¸¡à¹„ม่ได้:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "เพิ่มทุà¸à¹„อเทม"
@@ -7715,12 +7787,12 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "ไอเทม"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "ไอเทม"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7846,8 +7918,8 @@ msgstr "วาด Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8174,6 +8246,10 @@ msgid "TileSet"
msgstr "Tile Set"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "เพิ่มอินพุต"
@@ -8266,6 +8342,11 @@ msgid "Duplicate Nodes"
msgstr "ทำซ้ำโหนด"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "วางโหนด"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "ลบโหนด"
@@ -8275,10 +8356,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Vertex"
msgstr "มุมรูปทรง"
@@ -8295,6 +8372,11 @@ msgstr "ขวา"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "สร้างโหนด"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "สร้างโหนด"
@@ -8663,7 +8745,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8672,7 +8754,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8841,6 +8923,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8866,7 +8952,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8875,7 +8961,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8884,14 +8970,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8938,6 +9024,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9155,6 +9248,10 @@ msgid "Export templates for this platform are missing:"
msgstr "ไม่พบà¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸­à¸­à¸à¸ªà¸³à¸«à¸£à¸±à¸šà¹à¸žà¸¥à¸•ฟอร์มนี้:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "จัดà¸à¸²à¸£à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸­à¸­à¸"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "ส่งออà¸à¸žà¸£à¹‰à¸­à¸¡à¸à¸²à¸£à¹à¸à¹‰à¹„ขจุดบà¸à¸žà¸£à¹ˆà¸­à¸‡"
@@ -9307,6 +9404,15 @@ msgstr "โปรเจà¸à¸•์ไม่มีชื่อ"
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "นำเข้าโปรเจà¸à¸•์ที่มีอยู่เดิม"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "ไม่สามารถเปิดโปรเจà¸à¸•์"
@@ -9385,8 +9491,8 @@ msgstr "ลบโปรเจà¸à¸•์ออà¸à¸ˆà¸²à¸à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸­? (
#: editor/project_manager.cpp
#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr "ลบโปรเจà¸à¸•์ออà¸à¸ˆà¸²à¸à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸­? (โฟลเดอร์จะไม่ถูà¸à¸¥à¸š)"
#: editor/project_manager.cpp
@@ -9410,8 +9516,9 @@ msgid "Project Manager"
msgstr "ตัวจัดà¸à¸²à¸£à¹‚ปรเจà¸à¸•์"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "รายชื่อโปรเจà¸à¸•์"
+#, fuzzy
+msgid "Projects"
+msgstr "โปรเจà¸à¸•์"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9435,10 +9542,6 @@ msgid "Templates"
msgstr "à¹à¸¡à¹ˆà¹à¸šà¸š"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "ออà¸"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "เริ่มใหม่ทันที"
@@ -9785,6 +9888,10 @@ msgstr "ภูมิภาค:"
msgid "AutoLoad"
msgstr "ออโต้โหลด"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "ปลั๊à¸à¸­à¸´à¸™"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "ศูนย์"
@@ -9837,14 +9944,6 @@ msgstr "เลือà¸à¹€à¸¡à¸—็อด"
msgid "Select Method"
msgstr "เลือà¸à¹€à¸¡à¸—็อด"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "ใช้เครื่องมือ PVRTC ไม่ได้:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr "โหลดรูปที่à¹à¸›à¸¥à¸‡à¹à¸¥à¹‰à¸§à¸”้วยเครื่องมือ PVRTC ไม่ได้:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10150,6 +10249,11 @@ msgid "Remove Node(s)"
msgstr "ลบโหนด"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "เปลี่ยนชื่ออินพุต"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10278,23 +10382,25 @@ msgstr "คำเตือนà¸à¸²à¸£à¸•ั้งค่าโหนด:"
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"โหนดมีà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¹‚ยงà¹à¸¥à¸°à¸à¸¥à¸¸à¹ˆà¸¡\n"
"คลิà¸à¹€à¸žà¸·à¹ˆà¸­à¹à¸ªà¸”งà¹à¸œà¸‡à¸ªà¸±à¸à¸à¸²à¸“"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"โหนดมีà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¹‚ยง\n"
"คลิà¸à¹€à¸žà¸·à¹ˆà¸­à¹à¸ªà¸”งà¹à¸œà¸‡à¸ªà¸±à¸à¸à¸²à¸“"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"โหนดอยู่ในà¸à¸¥à¸¸à¹ˆà¸¡\n"
@@ -10401,6 +10507,11 @@ msgid "Error loading script from %s"
msgstr "ผิดพลาดขณะโหลดสคริปต์จาภ%s"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "à¸à¸³à¸«à¸™à¸”เฉพาะ..."
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "ไม่มี"
@@ -10603,6 +10714,10 @@ msgid "Change Shortcut"
msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸•รึง"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "ตัวเลือà¸à¹‚ปรà¹à¸à¸£à¸¡à¸ªà¸£à¹‰à¸²à¸‡à¹€à¸à¸¡"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "ทางลัด"
@@ -11026,10 +11141,30 @@ msgid "Set Variable Type"
msgstr "à¹à¸à¹‰à¹„ขประเภทตัวà¹à¸›à¸£"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "ชื่อผิดพลาด ต้องไม่ใช้ชื่อเดียวà¸à¸±à¸šà¸Šà¸™à¸´à¸”ตัวà¹à¸›à¸£"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "สร้าง %s ใหม่"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "ตัวà¹à¸›à¸£:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "สร้าง %s ใหม่"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "สร้างรูปหลายเหลี่ยมจาà¸à¸„วามว่างเปล่า"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "ไม่สามารถใช้ชื่อนี้ได้:"
@@ -11218,10 +11353,6 @@ msgid "Cut Nodes"
msgstr "ตัดโหนด"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "วางโหนด"
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "ตัวà¹à¸›à¸£"
@@ -12024,22 +12155,6 @@ msgstr ""
"ให้à¹à¸à¹‰à¹„ขโหนดนี้ให้เป็นโหนดลูà¸à¸‚อง Control à¹à¸•่ถ้าไม่ ให้ปรับเป็น render target à¹à¸¥à¸°à¸™à¸³à¹„ปใช้เป็น "
"texture ของโหนดอื่น"
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "ผิดพลาดขณะเริ่มต้น FreeType"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "ไม่ทราบประเภทของฟอนต์"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "ผิดพลาดขณะโหลดฟอนต์"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "ขนาดฟอนต์ผิดพลาด"
-
#: scene/resources/visual_shader.cpp
#, fuzzy
msgid "Input"
@@ -12076,6 +12191,102 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr "เปิดไฟล์ file_type_cache.cch เพื่อเขียนไม่ได้ จะไม่บันทึà¸à¹à¸„ชของชนิดไฟล์!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "ไม่สามารถไปยัง '%s' เนื่องจาà¸à¹„ม่พบในระบบ!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "ผิดพลาดขณะโหลดรูป:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "รูปไม่มีพิà¸à¹€à¸‹à¸¥à¹ƒà¸”ที่ความโปร่งà¹à¸ªà¸‡ > 128 ..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "โหนดà¹à¸¡à¹ˆà¹„ม่มีพื้นผิวเพื่อสร้าง"
+
+#~ msgid "Couldn't map area."
+#~ msgstr "ไม่สามารถวางพื้นที่"
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "หน้าไม่มีพื้นที่!"
+
+#~ msgid "No faces!"
+#~ msgstr "ไม่มีหน้า!"
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "โหลดภาพไม่ได้"
+
+#, fuzzy
+#~ msgid "Error could not load file."
+#~ msgstr "โหลดภาพไม่ได้"
+
+#~ msgid "Doppler Enable"
+#~ msgstr "เปิดดอปเพลอร์"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "โหมดเลือภ(Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "โหมดเคลื่อนย้าย (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "โหมดหมุน (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "โหมดปรับขนาด (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "พิà¸à¸±à¸”ภายใน"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "โหมดà¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸” (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "เครื่องมือเลือà¸"
+
+#~ msgid "Tool Move"
+#~ msgstr "เครื่องมือย้าย"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "เครื่องมือหมุน"
+
+#~ msgid "Tool Scale"
+#~ msgstr "เครื่องมือปรับขนาด"
+
+#, fuzzy
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr "ลบโปรเจà¸à¸•์ออà¸à¸ˆà¸²à¸à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸­? (โฟลเดอร์จะไม่ถูà¸à¸¥à¸š)"
+
+#~ msgid "Project List"
+#~ msgstr "รายชื่อโปรเจà¸à¸•์"
+
+#~ msgid "Exit"
+#~ msgstr "ออà¸"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "ใช้เครื่องมือ PVRTC ไม่ได้:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr "โหลดรูปที่à¹à¸›à¸¥à¸‡à¹à¸¥à¹‰à¸§à¸”้วยเครื่องมือ PVRTC ไม่ได้:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "ผิดพลาดขณะเริ่มต้น FreeType"
+
+#~ msgid "Unknown font format."
+#~ msgstr "ไม่ทราบประเภทของฟอนต์"
+
+#~ msgid "Error loading font."
+#~ msgstr "ผิดพลาดขณะโหลดฟอนต์"
+
+#~ msgid "Invalid font size."
+#~ msgstr "ขนาดฟอนต์ผิดพลาด"
+
#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "ไปชั้นล่าง"
@@ -12675,9 +12886,6 @@ msgstr ""
#~ msgid "Erase selection"
#~ msgstr "ลบที่เลือà¸"
-#~ msgid "Could not find tile:"
-#~ msgstr "ไม่พบ tile:"
-
#~ msgid "Item name or ID:"
#~ msgstr "ชื่อหรือ ID ไอเทม:"
@@ -12928,9 +13136,6 @@ msgstr ""
#~ msgid "Info"
#~ msgstr "ข้อมูล"
-#~ msgid "Re-Import..."
-#~ msgstr "นำเข้าอีà¸à¸„รั้ง..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "ไม่มีบิตà¹à¸¡à¸ªà¸à¹Œà¹ƒà¸«à¹‰à¸™à¸³à¹€à¸‚้า!"
@@ -13306,9 +13511,6 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "สเตอริโอ"
-#~ msgid "Window"
-#~ msgstr "หน้าต่าง"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "ปรับขนาดเป็น %s%%"
@@ -13585,8 +13787,5 @@ msgstr ""
#~ msgid "Export Project PCK"
#~ msgstr "ส่งออภPCK โปรเจà¸à¸•์"
-#~ msgid "Export..."
-#~ msgstr "ส่งออà¸..."
-
#~ msgid "Project Export"
#~ msgstr "ส่งออà¸à¹‚ปรเจà¸à¸•์"
diff --git a/editor/translations/tr.po b/editor/translations/tr.po
index f59cc0a809..afbea77509 100644
--- a/editor/translations/tr.po
+++ b/editor/translations/tr.po
@@ -28,12 +28,13 @@
# Anton Semchenko <semchenkoanton@protonmail.com>, 2019.
# Enes Can Yerlikaya <enescanyerlikaya@gmail.com>, 2019.
# Ömer Akgöz <omerakgoz34@gmail.com>, 2019.
+# Mehmet Dursun <mehmet.dursun@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-02 10:47+0000\n"
-"Last-Translator: Ömer Akgöz <omerakgoz34@gmail.com>\n"
+"PO-Revision-Date: 2019-08-29 13:34+0000\n"
+"Last-Translator: Mehmet Dursun <mehmet.dursun@gmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/"
"godot/tr/>\n"
"Language: tr\n"
@@ -41,12 +42,14 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "convert() için geçersiz argüman tipi, TYPE_* sabitlerini kullanın."
+msgstr ""
+"\"convert ()\" için geçersiz tür bağımsız değişkeni, \"TYPE_ *\" sabitlerini "
+"kullanın."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -56,15 +59,15 @@ msgstr "Byte kodu çözmek için yetersiz byte, ya da geçersiz format."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "İfade de geçersiz girdi %i (geçmedi)."
+msgstr "İfade de geçersiz giriş %i (geçersiz)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr "\"self\" ifadesi kullanılamaz, çünkü nesne \"null\" (tanımlandı)."
+msgstr "\"self\" kullanılamaz çünkü \"null\" değerini almış(geçersiz)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "%s, %s ve %s operatörleri için geçersiz işlem."
+msgstr "\"%s\" düğümünde geçersiz işlem '%s' ve '%s'."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
@@ -83,7 +86,6 @@ msgid "On call to '%s':"
msgstr "'%s' çağrıldığında:"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Ücretsiz"
@@ -152,29 +154,24 @@ msgid "Anim Change Call"
msgstr "Animasyon Değişikliği Çağrısı"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Anim Anahtar-kare Zamanını Değiştir"
+msgstr "Animasyon Anahtar-Çerçeve Zamanını Değiştir"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Animasyon Geçişinin Değişimi"
+msgstr "Animasyon geçişinin çoklu değişimi"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Animasyon Değişikliği Dönüşümü"
+msgstr "Animasyon Çoklu Değişikliği Dönüşümü"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Anim Anahtar-kare DeÄŸerini DeÄŸiÅŸtir"
+msgstr "Animasyon Çoklu Anahtar-Çerçeve Değerini Değiştir"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "Animasyon Değişikliği Çağrısı"
+msgstr "Animasyon Çoklu Değişiklik Çağrısı"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -211,11 +208,11 @@ msgstr "Animasyon Oynatıcı İzi"
#: editor/animation_track_editor.cpp
msgid "Animation length (frames)"
-msgstr "Animasyon uzunluÄŸu (kare)"
+msgstr "Animasyon uzunluğu (çerçeve)"
#: editor/animation_track_editor.cpp
msgid "Animation length (seconds)"
-msgstr "Animasyon uzunluÄŸu (kare)"
+msgstr "Animasyon uzunluÄŸu (saniye)"
#: editor/animation_track_editor.cpp
msgid "Add Track"
@@ -232,19 +229,19 @@ msgstr "İşlevler:"
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
-msgstr "Ses Klipsi:"
+msgstr "Ses Parçası:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr "Animasyon Klipsleri:"
+msgstr "Animasyon Klipleri:"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
-msgstr "İz Yolunu Değiştir"
+msgstr "Parça Yolunu Değiştir"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr "Bu izi Aç/Kapat."
+msgstr "Bu parçayı Aç/Kapat."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
@@ -252,11 +249,11 @@ msgstr "Güncelleme Kipi (Bu özellik nasıl belirlenir)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
-msgstr "AradeÄŸerleme Kipi"
+msgstr "Ara DeÄŸerleme Kipi"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr "Döngü Örtü Kipi (Döngünün başlangıcını sonu ile aradeğerle)"
+msgstr "Döngü Sarma Kipi (Döngünün başlangıcı ile bitiş arası)"
#: editor/animation_track_editor.cpp
msgid "Remove this track."
@@ -264,7 +261,7 @@ msgstr "Bu izi sil."
#: editor/animation_track_editor.cpp
msgid "Time (s): "
-msgstr "Süresi (sn): "
+msgstr "Süre (sn): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
@@ -272,11 +269,11 @@ msgstr "İz Dönüştürücü Etkin"
#: editor/animation_track_editor.cpp
msgid "Continuous"
-msgstr "Kesintisiz"
+msgstr "Sürekli"
#: editor/animation_track_editor.cpp
msgid "Discrete"
-msgstr "Kesikli"
+msgstr "Ayrık"
#: editor/animation_track_editor.cpp
msgid "Trigger"
@@ -310,15 +307,15 @@ msgstr "Döngü Aradeğerlemesin Sar"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "Anahtar Gir"
+msgstr "Yeni Anahtar"
#: editor/animation_track_editor.cpp
msgid "Duplicate Key(s)"
-msgstr "Anahtar(lar)ı Çoğalt"
+msgstr "Yinelenen Anahtar(lar)"
#: editor/animation_track_editor.cpp
msgid "Delete Key(s)"
-msgstr "Tuşları Sil"
+msgstr "Anahtar(lar)ı Sil"
#: editor/animation_track_editor.cpp
msgid "Change Animation Update Mode"
@@ -357,7 +354,7 @@ msgstr "OluÅŸtur"
#: editor/animation_track_editor.cpp
msgid "Anim Insert"
-msgstr "Animasyon Gir"
+msgstr "Animasyon Ekle"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
@@ -366,15 +363,15 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
-msgstr "Animasyon OluÅŸtur & Gir"
+msgstr "Animasyon OluÅŸtur & Ekle"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
-msgstr "Animasyon İz & Anahtar Gir"
+msgstr "Animasyon İz & Anahtar Ekle"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
-msgstr "Animasyon Anahtar Gir"
+msgstr "Animasyon Anahtar Ekle"
#: editor/animation_track_editor.cpp
msgid "Change Animation Step"
@@ -678,17 +675,18 @@ msgid "Line Number:"
msgstr "Satır Numarası:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
+msgstr "DeÄŸiÅŸtirildi %d oluÅŸ(sn)."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+#, fuzzy
+msgid "%d matches."
msgstr "EÅŸleÅŸme Yok"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "DeÄŸiÅŸtirildi %d oluÅŸ(sn)."
-
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Büyük/Küçük Harf Eşleştir"
@@ -917,8 +915,7 @@ msgstr "BeÄŸeniler:"
msgid "Recent:"
msgstr "Yakın zamanda:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1021,7 +1018,7 @@ msgstr ""
"Kaldırılmakta olan dosyalar başka kaynakların çalışması için gerekli.\n"
"Yine de kaldırmak istiyor musunuz? (geri alınamaz)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Kaldırılamadı:"
@@ -1058,7 +1055,7 @@ msgstr "%d Öğeleri kalıcı olarak silsin mi? (Geri alınamaz!)"
msgid "Show Dependencies"
msgstr "Bağımlılıklar"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "Orphan Kaynak Araştırıcı"
@@ -1147,14 +1144,16 @@ msgid "License"
msgstr "Lisans"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Üçüncü Parti Lisans"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Oyun Motoru, bazı ücretsiz ve açık kaynaklı üçüncü parti "
@@ -1175,7 +1174,8 @@ msgid "Licenses"
msgstr "Lisanslar"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Paket dosyası açılamıyor, zip formatında değil."
#: editor/editor_asset_installer.cpp
@@ -1690,12 +1690,11 @@ msgid "New"
msgstr "Yeni"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "İçe Aktar"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Dışa Aktar"
@@ -2107,6 +2106,11 @@ msgstr "Temizle"
msgid "Clear Output"
msgstr "Çıktıyı Temizle"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "Pencere"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Proje dışa aktarımı %d hata koduyla başarısız."
@@ -2434,6 +2438,15 @@ msgid "Pick a Main Scene"
msgstr "Bir Ana Sahne Seç"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Sahneyi Kapat"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Sahneyi Kapat"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Şu eklenti etkinleştirilemedi: '%s' yapılandırma ayarlarının ayrıştırılması "
@@ -2546,6 +2559,11 @@ msgstr "Bu Sahneyi Oynat"
msgid "Close Tab"
msgstr "Sekmeyi Kapat"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Sekmeyi Kapat"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "DiÄŸer Sekmeleri Kapat"
@@ -2632,6 +2650,10 @@ msgstr "Yeni Miras Alınmış Sahne ..."
msgid "Open Scene..."
msgstr "Sahne Aç..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "En Sonuncuyu Aç"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Sahne Kaydet"
@@ -2641,14 +2663,6 @@ msgid "Save All Scenes"
msgstr "Tüm Sahneleri Kaydet"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Sahneyi Kapat"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "En Sonuncuyu Aç"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Şuna Dönüştür..."
@@ -2678,25 +2692,35 @@ msgstr "Sahneyi Eski Durumuna Çevir"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Çeşitli proje ya da sahne-çapında araçlar."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Proje"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Proje Ayarları"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Araçlar"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr "Dışa Aktar..."
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Proje Verileri Klasörünü Aç"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Araçlar"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Orphan Kaynak Araştırıcı"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2794,12 +2818,13 @@ msgstr ""
"Bir cihazda uzaktan kullanıldığında, ağ dosya sistemi ile bu işlem daha "
"verimli olur."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Düzenleyici"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Düzenleyici Ayarları"
#: editor/editor_node.cpp
@@ -2839,14 +2864,15 @@ msgstr "Düzenleyici Ayarları Klasörünü Aç"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "Dışa Aktarım Şablonlarını Yönet"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Dışa Aktarım Şablonlarını Yönet"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Yardım"
@@ -2854,12 +2880,13 @@ msgstr "Yardım"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Ara"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Çevrimiçi Belgeler"
@@ -3316,7 +3343,8 @@ msgid "Import From Node:"
msgstr "Düğümden İçe Aktar:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Yeniden Yükle"
#: editor/export_template_manager.cpp
@@ -3333,6 +3361,10 @@ msgid "Download"
msgstr "İndir"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Mevcut DeÄŸil)"
@@ -3396,12 +3428,10 @@ msgid "No response."
msgstr "Cevap yok."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "İstek Başarısız Oldu."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Yönlendirme Döngüsü."
@@ -3415,15 +3445,22 @@ msgid "Download Complete."
msgstr "İndirme Tamamlandı."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Tema dosyaya kaydedilemiyor:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Şablon yüklemesi başarısız oldu. Sorunlu şablon arşivi şurada bulunabilir: "
"'%s'."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Url isteği hatası: "
#: editor/export_template_manager.cpp
@@ -3510,21 +3547,11 @@ msgstr "Şablonları İndir"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Listeden ayna seç: (Shift+Tıkla: Tarayıcıda Aç)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"file_type_cache.cch yazma için açılamıyor! dosya türü önbelleğe "
-"kaydedilmiyor!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Favoriler"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "Gidilemiyor. '%s' bu dosya sisteminde bulunamadı!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"Durum: Dosya içe aktarma başarısız oldu. Lütfen dosyayı onarın ve tekrar içe "
@@ -3560,14 +3587,14 @@ msgid "Provided name contains invalid characters."
msgstr "Sağlanan isim geçersiz karakterler içeriyor"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "İsim geçersiz karkterler içeriyor."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Bu isimde zaten bir dosya ve ya klasör mevcut."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "İsim geçersiz karkterler içeriyor."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Dosya yeniden-adlandırma:"
@@ -3627,6 +3654,11 @@ msgstr "Çoğalt..."
msgid "Move To..."
msgstr "Şuraya Taşı..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Yeni Sahne"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Yeni Betik..."
@@ -3695,6 +3727,11 @@ msgstr "Bu konumda zaten aynı ada sahip bir dosya veya klasör var."
msgid "Overwrite"
msgstr "Üzerine Yaz"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Sahneden OluÅŸtur"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Betik OluÅŸtur"
@@ -3755,6 +3792,14 @@ msgid "Search complete"
msgstr "Arama tamamlandı"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Öbeğe Ekle"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Öbekten Kaldır"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Grup adı zaten var."
@@ -3762,12 +3807,23 @@ msgstr "Grup adı zaten var."
msgid "Invalid group name."
msgstr "Geçersiz grup adı."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Grupları Düzenle"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Bediz Öbeğini Sil"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Gruplar"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Düğümler Grupta Değil"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3780,12 +3836,13 @@ msgid "Nodes in Group"
msgstr "Gruptaki Düğümler"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Öbeğe Ekle"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Öbekten Kaldır"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Betik Düzenleyiciyi Aç"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3997,7 +4054,8 @@ msgid "MultiNode Set"
msgstr "MultiNode Kur"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Sinyalleri ve Grupları düzenlemek için bir Düğüm seçin."
#: editor/plugin_config_dialog.cpp
@@ -4788,10 +4846,6 @@ msgid "View Files"
msgstr "Dosyaları Görüntüle"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Ana makine adı çözümlenemedi:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Bağlantı hatası, lütfen tekrar deneyiniz."
@@ -4804,14 +4858,47 @@ msgid "No response from host:"
msgstr "Ana makineden cevap yok:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Ana makine adı çözümlenemedi:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "İstem başarısız, dönen kod:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "İstek Başarısız Oldu."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Tema dosyaya kaydedilemiyor:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "İstem Başarısız, çok fazla yönlendirme"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Yönlendirme Döngüsü."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "İstem başarısız, dönen kod:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Zaman"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "Kötü indirme sağlaması, dosya üzerinde oynama yapılmış."
@@ -4893,8 +4980,13 @@ msgid "All"
msgstr "Hepsi"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Yeniden İçe Aktar..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Eklentiler"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4916,7 +5008,8 @@ msgid "Site:"
msgstr "Yer:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Destek..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4928,6 +5021,11 @@ msgid "Testing"
msgstr "Deneme"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Yükle..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Varlıkların ZIP Dosyası"
@@ -5107,6 +5205,11 @@ msgstr "Duruşu Yapıştır"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "DuruÅŸu Temizle"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Örüntüden Emisyon Noktaları Oluştur"
@@ -5137,6 +5240,7 @@ msgid "Zoom Reset"
msgstr "Yakınlaşmayı Sıfırla"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Kip Seç"
@@ -5159,14 +5263,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt + RMB: Derin liste seçimi"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Biçimi Taşı"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Döndürme Biçimi"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "Ölçek Biçimi (R)"
@@ -5194,6 +5301,7 @@ msgid "Toggle snapping."
msgstr "Yapılmayı aç/kapat"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Yapışma Kullan"
@@ -5212,11 +5320,6 @@ msgid "Use Rotation Snap"
msgstr "Döndürme Yapışması Kullan"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Yapışmayı Yapılandır..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "Göreceli Yapış"
@@ -5230,6 +5333,11 @@ msgid "Smart Snapping"
msgstr "Akıllı yapışma"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Yapışmayı Yapılandır..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
msgstr "Ebeveyne yapıştır"
@@ -5453,16 +5561,6 @@ msgstr "Tutamacı Ayarla"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Resim yüklenirken hata:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Saydamlığı olan nokta yok > 128 bedizde..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Yayma Maskesini Yükle"
@@ -5785,14 +5883,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Yüzey kaynağı geçersiz (yüzler yok)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "Atanın doldurmak için eksiksiz yüzleri yok."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Alan eÅŸleÅŸtirilemedi."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Bir Kaynak Örüntü Seçin:"
@@ -5878,20 +5968,27 @@ msgid "Generation Time (sec):"
msgstr "Nesil Süresi (sn):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Yüzler alan içermez!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Düğüm uzambilgisi (yüzler) içermiyor."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Yüzler yok!"
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Düğüm uzambilgisi içermiyor."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Düğüm uzambilgisi (yüzler) içermiyor."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Düğüm uzambilgisi içermiyor."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6233,7 +6330,6 @@ msgid "Grid Settings"
msgstr "IzgaraHaritası Ayarları"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "Yapış"
@@ -6348,13 +6444,8 @@ msgstr "Bediz yüklenirken sorun oluştu:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "Bediz yüklenemedi"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
-msgstr "Bediz yüklenemedi"
+msgid "Could not load file at:"
+msgstr "Karo Bulunamadı:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6383,7 +6474,7 @@ msgstr "İçe aktarılırken hata"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "Yeni Klasör..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6470,6 +6561,11 @@ msgid "Open..."
msgstr "Aç"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Betik Aç"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Tümünü kaydet"
@@ -6509,13 +6605,13 @@ msgid "Save Theme"
msgstr "Kalıbı Kaydet"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Belgeleri Kapat"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Tümünü Kapat"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Belgeleri Kapat"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Çalıştır"
@@ -6606,6 +6702,11 @@ msgstr "Hata Ayıklayıcı"
msgid "Search Results"
msgstr "Yardım Ara"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "En Son Sahneleri Temizle"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6679,6 +6780,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6714,26 +6816,6 @@ msgid "Toggle Comment"
msgstr "Yorumu Aç / Kapat"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Serbestbakış Aç / Kapat"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Sonraki Kesme Noktasına Git"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Önceki Kesme Noktasına Git"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Bütün Öğeleri Kaldır"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Satırı Katla/Aç"
@@ -6754,6 +6836,11 @@ msgid "Complete Symbol"
msgstr "Simgeyi Tamamla"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Seçimi Ölçekle"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "İzleyenin Boşluklarını Kırp"
@@ -6772,32 +6859,37 @@ msgid "Auto Indent"
msgstr "Kendinden Girintili"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Kesme Noktası Aç/Kapat"
+msgid "Find Previous"
+msgstr "Öncekini Bul"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Tüm Kesme Noktalarını Kaldır"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Dosyaları Süz..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "Bağlamsal Yardım"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "Sonraki Kesme Noktasına Git"
+msgid "Toggle Bookmark"
+msgstr "Serbestbakış Aç / Kapat"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "Önceki Kesme Noktasına Git"
+msgid "Go to Next Bookmark"
+msgstr "Sonraki Kesme Noktasına Git"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Öncekini Bul"
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "Önceki Kesme Noktasına Git"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Dosyaları Süz..."
+msgid "Remove All Bookmarks"
+msgstr "Bütün Öğeleri Kaldır"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6810,8 +6902,23 @@ msgid "Go to Line..."
msgstr "Dizeye Git..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Bağlamsal Yardım"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Kesme Noktası Aç/Kapat"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Tüm Kesme Noktalarını Kaldır"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Sonraki Kesme Noktasına Git"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Önceki Kesme Noktasına Git"
#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
@@ -7060,8 +7167,9 @@ msgid "Audio Listener"
msgstr "Ses Dinleyici"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Çoğaltıcı Aktif"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Düzenlenebilir Çocuklar"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7117,8 +7225,8 @@ msgid "Snap Nodes To Floor"
msgstr "Izgaraya yapış"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Seçim Kipi (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7131,30 +7239,11 @@ msgstr ""
"Alt+RMB: Derin liste seçimi"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Taşıma Biçimi (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Döndürme Biçimi (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Ölçek Biçimi (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Yerel Kordinatlar"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Yerel Uzay Kipi (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Yapışma Kipi (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "Alttan Görünüm"
@@ -7196,22 +7285,6 @@ msgid "Focus Selection"
msgstr "Seçime Odaklan"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "Seçim Aracı"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "Taşıma Aracı"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "Döndürme Aracı"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "Ölçek Aracı"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Serbestbakış Aç / Kapat"
@@ -7268,7 +7341,8 @@ msgstr "Izgara Görünümü"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Ayarlar"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7587,10 +7661,6 @@ msgid "TextureRegion"
msgstr "Doku Bölgesi"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "Tema dosyaya kaydedilemiyor:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Tüm Öğeleri Ekle"
@@ -7680,12 +7750,12 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "Öğe"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "Öğe"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7810,8 +7880,8 @@ msgstr "Karo Boya"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8140,6 +8210,10 @@ msgid "TileSet"
msgstr "Karo Takımı"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "GiriÅŸ Ekle"
@@ -8232,6 +8306,11 @@ msgid "Duplicate Nodes"
msgstr "Düğüm(leri) Çoğalt"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Düğümleri Yapıştır"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Düğümleri Sil"
@@ -8241,10 +8320,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Vertex"
msgstr "Köşenoktalar"
@@ -8260,6 +8335,11 @@ msgstr "SaÄŸ"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Düğüm Oluştur"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Düğüm Oluştur"
@@ -8628,7 +8708,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8637,7 +8717,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8806,6 +8886,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8831,7 +8915,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8840,7 +8924,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8849,14 +8933,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8903,6 +8987,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9124,6 +9215,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Bu platform için dışa aktarma şablonu eksik:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Dışa Aktarım Şablonlarını Yönet"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "Hata Ayıklama İle Dışa Aktar"
@@ -9275,6 +9370,15 @@ msgstr "Adsız Proje"
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "Var Olan Projeyi İçe Aktar"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "Proje Açılamadı"
@@ -9354,8 +9458,8 @@ msgstr "Proje listeden kaldırılsın mı? (Klasör içerikleri değiştirilmeye
#: editor/project_manager.cpp
#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr "Proje listeden kaldırılsın mı? (Klasör içerikleri değiştirilmeyecek)"
#: editor/project_manager.cpp
@@ -9382,8 +9486,9 @@ msgid "Project Manager"
msgstr "Proje Yöneticisi"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "Proje Listesi"
+#, fuzzy
+msgid "Projects"
+msgstr "Proje"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9407,10 +9512,6 @@ msgid "Templates"
msgstr "Åžablonlar"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Çık"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Åžimdi Yeniden BaÅŸlat"
@@ -9759,6 +9860,10 @@ msgstr "Yereller:"
msgid "AutoLoad"
msgstr "Otomatik Yükle"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Eklentiler"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Sıfır"
@@ -9811,14 +9916,6 @@ msgstr "Sanal Metot Seç"
msgid "Select Method"
msgstr "Metot Seç"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "PVRTC aracı çalıştırılamadı:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr "PVRTC aracını kullanarak dönüştürülen bedizi geri yükleyemiyor:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10125,6 +10222,11 @@ msgid "Remove Node(s)"
msgstr "Düğümleri Kaldır"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Giriş Adını Değiştir"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10256,23 +10358,25 @@ msgstr "Düğüm yapılandırma uyarısı:"
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"Düğüm bağlantı(lar) ve grup(lar)a sahip\n"
"Sinyaller dokunu göstermek için tıkla."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"Düğüm bağlantılara sahip.\n"
"Sinyaller dokunu göstermek için tıkla."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"Düğüm grup(lar)ın içinde.\n"
@@ -10379,6 +10483,11 @@ msgid "Error loading script from %s"
msgstr "Şuradan: %s betik yüklenirken hata"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Üzerine Yaz"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "Uygulanamaz"
@@ -10581,6 +10690,10 @@ msgid "Change Shortcut"
msgstr "Çapaları Değiştir"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Düzenleyici Ayarları"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Kısayollar"
@@ -11010,10 +11123,30 @@ msgid "Set Variable Type"
msgstr "DeÄŸiÅŸken Tipini Ayarla"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Geçersiz ad. Var olan gömülü türdeki ad ile çakışmamalı."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Yeni %s oluÅŸtur"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "DeÄŸiÅŸkenler:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Yeni %s oluÅŸtur"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Sıfırdan yeni bir çokgen oluşturun."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Ad doÄŸru bir belirleyici deÄŸil:"
@@ -11206,10 +11339,6 @@ msgid "Cut Nodes"
msgstr "Düğümleri Kes"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Düğümleri Yapıştır"
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "Üyeler"
@@ -12065,22 +12194,6 @@ msgstr ""
"yapın böylece bir boyut elde edebilir. Aksi takdirde, Görüntüleme için bunu "
"bir RenderTarget yap ve dahili dokusunu herhangi bir düğüme ata."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "FreeType başlatılırken hata."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Bilinmeyen yazıtipi formatı."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Yazıtipi yükleme hatası."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Geçersiz yazıtipi boyutu."
-
#: scene/resources/visual_shader.cpp
#, fuzzy
msgid "Input"
@@ -12115,7 +12228,106 @@ msgstr ""
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
-msgstr ""
+msgstr "Sabit deÄŸerler deÄŸiÅŸtirilemez."
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "file_type_cache.cch yazma için açılamıyor! dosya türü önbelleğe "
+#~ "kaydedilmiyor!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "Gidilemiyor. '%s' bu dosya sisteminde bulunamadı!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Resim yüklenirken hata:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Saydamlığı olan nokta yok > 128 bedizde..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Atanın doldurmak için eksiksiz yüzleri yok."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Alan eÅŸleÅŸtirilemedi."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Yüzler alan içermez!"
+
+#~ msgid "No faces!"
+#~ msgstr "Yüzler yok!"
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "Bediz yüklenemedi"
+
+#, fuzzy
+#~ msgid "Error could not load file."
+#~ msgstr "Bediz yüklenemedi"
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Çoğaltıcı Aktif"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Seçim Kipi (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Taşıma Biçimi (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Döndürme Biçimi (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Ölçek Biçimi (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Yerel Kordinatlar"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Yapışma Kipi (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Seçim Aracı"
+
+#~ msgid "Tool Move"
+#~ msgstr "Taşıma Aracı"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Döndürme Aracı"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Ölçek Aracı"
+
+#, fuzzy
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "Proje listeden kaldırılsın mı? (Klasör içerikleri değiştirilmeyecek)"
+
+#~ msgid "Project List"
+#~ msgstr "Proje Listesi"
+
+#~ msgid "Exit"
+#~ msgstr "Çık"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "PVRTC aracı çalıştırılamadı:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr "PVRTC aracını kullanarak dönüştürülen bedizi geri yükleyemiyor:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "FreeType başlatılırken hata."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Bilinmeyen yazıtipi formatı."
+
+#~ msgid "Error loading font."
+#~ msgstr "Yazıtipi yükleme hatası."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Geçersiz yazıtipi boyutu."
#~ msgid "Previous Folder"
#~ msgstr "Önceki Klasör"
@@ -12722,9 +12934,6 @@ msgstr ""
#~ msgid "Erase selection"
#~ msgstr "Seçimi Sil"
-#~ msgid "Could not find tile:"
-#~ msgstr "Karo Bulunamadı:"
-
#~ msgid "Item name or ID:"
#~ msgstr "Öğe adı yada kimliği:"
@@ -12970,9 +13179,6 @@ msgstr ""
#~ msgid "Info"
#~ msgstr "Bilgi"
-#~ msgid "Re-Import..."
-#~ msgstr "Yeniden İçe Aktar..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "Alınacak hiç bit örteci yok!"
@@ -13367,9 +13573,6 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "Çiftli"
-#~ msgid "Window"
-#~ msgstr "Pencere"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Şuna %s%% Ölçeklendiriliyor."
@@ -13600,9 +13803,6 @@ msgstr ""
#~ msgid "Add Image Group"
#~ msgstr "Bediz Öbeği Ekle"
-#~ msgid "Delete Image Group"
-#~ msgstr "Bediz Öbeğini Sil"
-
#~ msgid "Project Export Settings"
#~ msgstr "Tasarıyı Dışa Aktarma Ayarları"
@@ -13687,9 +13887,6 @@ msgstr ""
#~ msgid "Export Project PCK"
#~ msgstr "Tasarı PCK Dışa Aktar"
-#~ msgid "Export..."
-#~ msgstr "Dışa Aktar..."
-
#~ msgid "Project Export"
#~ msgstr "Tasarı Dışa Aktar"
diff --git a/editor/translations/uk.po b/editor/translations/uk.po
index 19e21461cd..bee04e31b7 100644
--- a/editor/translations/uk.po
+++ b/editor/translations/uk.po
@@ -15,7 +15,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Ukrainian (Godot Engine)\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-21 11:06+0000\n"
+"PO-Revision-Date: 2019-08-04 14:22+0000\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/"
"godot/uk/>\n"
@@ -69,7 +69,6 @@ msgid "On call to '%s':"
msgstr "При виклику «%s»:"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Вивільнити"
@@ -138,27 +137,22 @@ msgid "Anim Change Call"
msgstr "Змінити виклик анімації"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Змінити Ñ‡Ð°Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¾Ð³Ð¾ кадру"
+msgstr "Змінити Ñ‡Ð°Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¾Ð³Ð¾ кадру анімації"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Змінити перехід"
+msgstr "Змінити перехід анімації"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Змінити перетвореннÑ"
+msgstr "Змінити Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Змінити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¾Ð³Ð¾ кадру"
+msgstr "Змінити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¾Ð³Ð¾ кадру анімації"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
msgstr "Змінити виклик анімації"
@@ -666,16 +660,18 @@ msgid "Line Number:"
msgstr "Ðомер Ñ€Ñдка:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "ВиÑвлено %d відповідників."
+msgid "Replaced %d occurrence(s)."
+msgstr "Замінено %d випадок(-ів)."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Ðемає збігів"
+#, fuzzy
+msgid "%d match."
+msgstr "ВиÑвлено %d відповідників."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Замінено %d випадок(-ів)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "ВиÑвлено %d відповідників."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -902,8 +898,7 @@ msgstr "Вибране:"
msgid "Recent:"
msgstr "Ðещодавні:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1005,7 +1000,7 @@ msgstr ""
"працювати.\n"
"Видалити Ñ—Ñ… у будь-Ñкому разі? (ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ðµ)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Ðеможливо вилучити:"
@@ -1041,7 +1036,7 @@ msgstr "ОÑтаточно вилучити %d об'єкт(и)? (ÐеможлиÐ
msgid "Show Dependencies"
msgstr "Показати залежноÑті"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "ОглÑд підключених реÑурÑів"
@@ -1130,14 +1125,16 @@ msgid "License"
msgstr "ЛіцензіÑ"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ Ñ‚Ñ€ÐµÑ‚ÑŒÐ¾Ñ— Ñторони"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Рушій Godot ÑпираєтьÑÑ Ð½Ð° Ñ€Ñд Ñторонніх безкоштовних Ñ– відкритих бібліотек, "
@@ -1158,7 +1155,8 @@ msgid "Licenses"
msgstr "Ліцензії"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Помилка Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñ„Ð°Ð¹Ð»Ð° пакунка, не у форматі zip."
#: editor/editor_asset_installer.cpp
@@ -1652,12 +1650,11 @@ msgid "New"
msgstr "Ðовий"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Імпортувати"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "ЕкÑпортуваннÑ"
@@ -1794,30 +1791,26 @@ msgid "Move Favorite Down"
msgstr "ПереміÑтити вибране вниз"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Перейти до батьківÑької теки."
+msgstr "Перейти до попередньої теки."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Перейти до батьківÑької теки."
+msgstr "Перейти до наÑтупної теки."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "Перейти до батьківÑької теки."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Шукати файли"
+msgstr "ОÑвіжити файли."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "Перемкнути Ñтан вибраноÑті Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— теки."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
msgstr "Увімкнути або вимкнути видиміÑть прихованих файлів."
@@ -2060,6 +2053,10 @@ msgstr "ОчиÑтити"
msgid "Clear Output"
msgstr "ОчиÑтити вивід"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Ðе вдалоÑÑ ÐµÐºÑпортувати проєкт, код помилки — %d."
@@ -2381,6 +2378,15 @@ msgid "Pick a Main Scene"
msgstr "Виберіть головну Ñцену"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Закрити Ñцену"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Закрити Ñцену"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
"Ðе вдаєтьÑÑ Ð²Ð²Ñ–Ð¼ÐºÐ½ÑƒÑ‚Ð¸ плагін addon: '%s' не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ "
@@ -2497,6 +2503,11 @@ msgstr "Відтворити цю Ñцену"
msgid "Close Tab"
msgstr "Закрити вкладку"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Закрити вкладку"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Закрити інші вкладки"
@@ -2581,6 +2592,10 @@ msgstr "Ðова уÑпадкована Ñцена..."
msgid "Open Scene..."
msgstr "Відкрити Ñцену..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Відкрити оÑтанні"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Зберегти Ñцену"
@@ -2590,14 +2605,6 @@ msgid "Save All Scenes"
msgstr "Зберегти вÑÑ– Ñцени"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Закрити Ñцену"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Відкрити оÑтанні"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Перетворити на..."
@@ -2627,25 +2634,37 @@ msgstr "Повернути Ñцену"
msgid "Miscellaneous project or scene-wide tools."
msgstr "Різні проєктні або Ñценографічні інÑтрументи."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Проєкт"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "Параметри проєкту"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "ІнÑтрументи"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "ЕкÑпортуваннÑ"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Ð’Ñтановити шаблон Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Android"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Ð’Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñ‚ÐµÐºÐ¸ даних проєкту"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "ІнÑтрументи"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Ð’Ñтановити шаблон Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Android"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "ОглÑд підключених реÑурÑів"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2743,12 +2762,13 @@ msgstr ""
"При віддаленому викориÑтанні на приÑтрої, це більш ефективно з мережевою "
"файловою ÑиÑтемою."
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Редактор"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Параметри редактора"
#: editor/editor_node.cpp
@@ -2784,14 +2804,16 @@ msgid "Open Editor Settings Folder"
msgstr "Відкрити теку параметрів редактора"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ÑÑ‚Ñми редактора"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°Ð¼Ð¸ екÑпорту"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Довідка"
@@ -2799,12 +2821,13 @@ msgstr "Довідка"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Пошук"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Онлайн документаціÑ"
@@ -3085,9 +3108,8 @@ msgid "Calls"
msgstr "Виклики"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Редагувати тему"
+msgstr "Редагувати текÑÑ‚:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3261,7 +3283,8 @@ msgid "Import From Node:"
msgstr "Імпортувати з вузла:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Перезавантажити"
#: editor/export_template_manager.cpp
@@ -3278,6 +3301,10 @@ msgid "Download"
msgstr "Завантажити"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(ВідÑутній)"
@@ -3341,12 +3368,10 @@ msgid "No response."
msgstr "Ðемає відповіді."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Запит не вдавÑÑ."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Циклічне переÑпрÑмуваннÑ."
@@ -3360,15 +3385,22 @@ msgid "Download Complete."
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð¾."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ тему до файла:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
"Ðе вдалоÑÑ Ð²Ñтановити шаблони. Проблемні архіви із шаблонами можна знайти "
"тут: «%s»."
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Помилка запиту url: "
#: editor/export_template_manager.cpp
@@ -3453,22 +3485,11 @@ msgstr "Завантажити шаблони"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "Виберіть дзеркало зі ÑпиÑку: (Shift+клацаннÑ: відкрити у браузері)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-"Ðе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ file_type_cache.cch Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу, не буде збережений файл "
-"тип кешу!"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "Вибране"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-"Ðеможливо перейти до '%s' , оÑкільки він не був знайдений в файловій ÑиÑтемі!"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
"СтатуÑ: не вдалоÑÑ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸ файл. Будь лаÑка, виправте файл та повторно "
@@ -3503,14 +3524,14 @@ msgid "Provided name contains invalid characters."
msgstr "Ðадане ім'Ñ Ð¼Ñ–Ñтить некоректні Ñимволи."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Ðазва міÑтить некоректні Ñимволи."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Файл або тека з таким іменем вже Ñ–Ñнує."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Ðазва міÑтить некоректні Ñимволи."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "ÐŸÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ:"
@@ -3566,6 +3587,11 @@ msgstr "Дублювати..."
msgid "Move To..."
msgstr "ПереміÑтити до..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Ðова Ñцена"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Створити Ñкрипт…"
@@ -3631,6 +3657,11 @@ msgstr "У вказаному каталозі вже міÑтитьÑÑ Ñ‚ÐµÐºÐ
msgid "Overwrite"
msgstr "ПерезапиÑати"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Створити зі Ñцени"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Створити Ñкрипт"
@@ -3693,6 +3724,14 @@ msgid "Search complete"
msgstr "Пошук завершено"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Додати до групи"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Вилучити з групи"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Група із такою назвою вже Ñ–Ñнує."
@@ -3700,12 +3739,23 @@ msgstr "Група із такою назвою вже Ñ–Ñнує."
msgid "Invalid group name."
msgstr "ÐеприпуÑтима назва групи."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð°Ð¼Ð¸"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Видалити компонуваннÑ"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Групи"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Вузли поза групою"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3718,12 +3768,13 @@ msgid "Nodes in Group"
msgstr "Вузли у групі"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Додати до групи"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Вилучити з групи"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Редактор Ñкриптів"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3931,7 +3982,8 @@ msgid "MultiNode Set"
msgstr "Мультивузловий набір"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "Виберіть вузол Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñигналів та груп."
#: editor/plugin_config_dialog.cpp
@@ -4696,10 +4748,6 @@ msgid "View Files"
msgstr "ПереглÑд файлів"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Ðеможливо розпізнати ім'Ñ Ñ…Ð¾Ñта:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Помилка з'єднаннÑ, будь лаÑка, повторіть Ñпробу."
@@ -4712,14 +4760,47 @@ msgid "No response from host:"
msgstr "Ðемає відповіді від хоÑта:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Ðеможливо розпізнати ім'Ñ Ñ…Ð¾Ñта:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Помилка запиту, код поверненнÑ:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "Запит не вдавÑÑ."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ тему до файла:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Запит не вдавÑÑ, забагато перенаправлень"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Циклічне переÑпрÑмуваннÑ."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Помилка запиту, код поверненнÑ:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "ЧаÑ"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "РозбіжніÑть хеша завантаженнÑ, можливо файл був змінений."
@@ -4796,8 +4877,13 @@ msgid "All"
msgstr "Ð’Ñе"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Імпортувати"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "Плаґіни (додатки)"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4818,7 +4904,8 @@ msgid "Site:"
msgstr "Сайт:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Підтримка..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4830,6 +4917,11 @@ msgid "Testing"
msgstr "ТеÑтуваннÑ"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Завантажити…"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "ZIP файл активів"
@@ -4995,6 +5087,11 @@ msgid "Paste Pose"
msgstr "Ð’Ñтавити позу"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "ОчиÑтити кіÑтки"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Створити нетипові кіÑтки з вузлів"
@@ -5025,6 +5122,7 @@ msgid "Zoom Reset"
msgstr "Відновити початковий маÑштаб"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Режим виділеннÑ"
@@ -5047,14 +5145,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Ðльт+ПКМ: СпиÑок вибору глибини"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Режим переміщеннÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Режим повороту"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Режим маÑштабуваннÑ"
@@ -5080,6 +5181,7 @@ msgid "Toggle snapping."
msgstr "Увімкнути або вимкнути прив'ÑзуваннÑ."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "За допомогою функції прив'Ñзки"
@@ -5096,11 +5198,6 @@ msgid "Use Rotation Snap"
msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð²'Ñзки"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð²'Ñзки..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "ВідноÑна прив'Ñзка"
@@ -5113,6 +5210,11 @@ msgid "Smart Snapping"
msgstr "Інтелектуальне прилипаннÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð²'Ñзки..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr "ÐŸÑ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ð´Ð¾ предка"
@@ -5328,16 +5430,6 @@ msgstr "Ð’Ñтановити обробник"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "Ð’ зображенні немає пікÑелів з прозоріÑтю > 128..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "Завантажити маÑку випромінюваннÑ"
@@ -5648,14 +5740,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "Ðеправильне джерело поверхні (немає граней)."
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "Предок не має Ñуцільних граней Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚Ð¸ ділÑнку."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "Виберіть джерело Ñітки:"
@@ -5740,20 +5824,27 @@ msgid "Generation Time (sec):"
msgstr "Ð§Ð°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ— (Ñек):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "Грані не міÑÑ‚Ñть ділÑнки!"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "Ðемає граней!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Вузол не міÑтить геометрії (граней)."
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "Вузол не міÑтить геометрії."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "Вузол не міÑтить геометрії (граней)."
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "Вузол не міÑтить геометрії."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6086,7 +6177,6 @@ msgid "Grid Settings"
msgstr "Параметри Ñітки"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "ПрилипаннÑ"
@@ -6192,12 +6282,9 @@ msgid "Error writing TextFile:"
msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби запиÑати TextFile:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "Помилка: не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "Помилка: не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл."
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "Ðеможливо знайти плитку:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6220,7 +6307,8 @@ msgid "Error Importing"
msgstr "Помилка імпортуваннÑ"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "Створити текÑтовий файл…"
#: editor/plugins/script_editor_plugin.cpp
@@ -6301,6 +6389,11 @@ msgid "Open..."
msgstr "Відкрити..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Відкрити Ñкрипт"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "Зберегти вÑе"
@@ -6338,13 +6431,13 @@ msgid "Save Theme"
msgstr "Зберегти тему"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Закрити документацію"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Закрити вÑе"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Закрити документацію"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "ЗапуÑтити"
@@ -6432,6 +6525,11 @@ msgstr "Зневаджувач"
msgid "Search Results"
msgstr "Результати пошуку"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "ОчиÑтити недавні Ñцени"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· методом:"
@@ -6500,6 +6598,7 @@ msgid "Syntax Highlighter"
msgstr "ЗаÑіб підÑÐ²Ñ–Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ ÑинтакÑиÑу"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr "Перейти"
@@ -6534,22 +6633,6 @@ msgid "Toggle Comment"
msgstr "Перемкнути коментар"
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr "Увімкнути або вимкнути закладку"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "Перейти до наÑтупної закладки"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr "Перейти до попередньої закладки"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "Вилучити вÑÑ– закладки"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "Згорнути/розгорнути Ñ€Ñдок"
@@ -6570,6 +6653,11 @@ msgid "Complete Symbol"
msgstr "Завершити Ñимвол"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Вибір маÑштабу"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Обрізати кінцевий пробіл"
@@ -6586,29 +6674,32 @@ msgid "Auto Indent"
msgstr "ÐвтовідÑтуп"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Перемкнути точку зупинки"
+msgid "Find Previous"
+msgstr "Знайти попереднє"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Вилучити вÑÑ– точки зупинки"
+msgid "Find in Files..."
+msgstr "Знайти у файлах…"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Перейти до наÑтупної точки зупинки"
+msgid "Contextual Help"
+msgstr "КонтекÑтна довідка"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Перейти до попередньої точки зупинки"
+msgid "Toggle Bookmark"
+msgstr "Увімкнути або вимкнути закладку"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Знайти попереднє"
+msgid "Go to Next Bookmark"
+msgstr "Перейти до наÑтупної закладки"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Знайти у файлах…"
+msgid "Go to Previous Bookmark"
+msgstr "Перейти до попередньої закладки"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Вилучити вÑÑ– закладки"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6619,8 +6710,21 @@ msgid "Go to Line..."
msgstr "Перейти до Ñ€Ñдка..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "КонтекÑтна довідка"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Перемкнути точку зупинки"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Вилучити вÑÑ– точки зупинки"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Перейти до наÑтупної точки зупинки"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Перейти до попередньої точки зупинки"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -6799,14 +6903,12 @@ msgid "Rear"
msgstr "Ззаду"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Transform with View"
-msgstr "ВирівнÑти з переглÑдом"
+msgstr "ВирівнÑти Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð· переглÑдом"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Rotation with View"
-msgstr "ВирівнÑти позначене із переглÑдом"
+msgstr "ВирівнÑти Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ñ–Ð· переглÑдом"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -6861,8 +6963,9 @@ msgid "Audio Listener"
msgstr "ПроÑÐ»ÑƒÑ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð²ÑƒÐºÑƒ"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "Ефект Доплера"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Увімкнути фільтруваннÑ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6918,8 +7021,8 @@ msgid "Snap Nodes To Floor"
msgstr "Приліпити вузли до підлоги"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "Режим Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6932,30 +7035,11 @@ msgstr ""
"Alt+Права кнопка: Вибір у ÑпиÑку за глибиною"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "Режим переÑÑƒÐ²Ð°Ð½Ð½Ñ (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "Режим Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "Режим маÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "Локальні координати"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "Режим локального проÑтору (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "Режим Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "ВиглÑд знизу"
@@ -6996,22 +7080,6 @@ msgid "Focus Selection"
msgstr "ФокуÑувати позначене"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "ІнÑтрумент позначеннÑ"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "ІнÑтрумент переÑуваннÑ"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "ІнÑтрумент обертаннÑ"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "ІнÑтрумент маÑштабуваннÑ"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "ÐŸÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð¾Ð³Ð»Ñду"
@@ -7066,7 +7134,8 @@ msgstr "ПереглÑд ґратки"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "Параметри"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7361,10 +7430,6 @@ msgid "TextureRegion"
msgstr "TextureRegion"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ тему до файла:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "Додати уÑÑ– елементи"
@@ -7449,11 +7514,13 @@ msgid "Submenu"
msgstr "Підменю"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+#, fuzzy
+msgid "Subitem 1"
msgstr "Елемент 1"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+#, fuzzy
+msgid "Subitem 2"
msgstr "Елемент 2"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7570,9 +7637,10 @@ msgid "Paint Tile"
msgstr "Ðамалювати плитку"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Shift+права кнопка: малювати лінію\n"
"Shift+Ctrl+права кнопка: малювати прÑмокутник"
@@ -7873,6 +7941,10 @@ msgid "TileSet"
msgstr "Ðабір плиток"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(лише GLES3)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr "Додати вхід +"
@@ -7949,6 +8021,11 @@ msgid "Duplicate Nodes"
msgstr "Дублювати вузли"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Ð’Ñтавити вузли"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "Вилучити вузли"
@@ -7957,10 +8034,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "Змінено тип Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²Ñ–Ð·ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ шейдера"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr "(лише GLES3)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "Вершина"
@@ -7973,6 +8046,11 @@ msgid "Light"
msgstr "Світло"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Створити вузол шейдера"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
msgstr "Створити вузол шейдера"
@@ -8339,10 +8417,11 @@ msgid "Returns the square root of the parameter."
msgstr "Повертає квадратний корінь з параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8353,10 +8432,11 @@ msgstr ""
"у проміжку від 0.0 до 1.0, Ñку визначено на оÑнові поліномів Ерміта."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"ФункціÑ-Ñходинка ( ÑкалÑÑ€(межа), ÑкалÑÑ€(x) ).\n"
"\n"
@@ -8529,6 +8609,11 @@ msgid "Linear interpolation between two vectors."
msgstr "Лінійна інтерполÑÑ†Ñ–Ñ Ð²Ñ–Ð´ двох векторних значень."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Лінійна інтерполÑÑ†Ñ–Ñ Ð²Ñ–Ð´ двох векторних значень."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr "Повертає нормалізований векторний добуток векторів."
@@ -8553,10 +8638,11 @@ msgid "Returns the vector that points in the direction of refraction."
msgstr "Повертає вектор, Ñкий вказує напрÑмок рефракції."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8567,10 +8653,11 @@ msgstr ""
"у проміжку від 0.0 до 1.0, Ñку визначено на оÑнові поліномів Ерміта."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8581,20 +8668,22 @@ msgstr ""
"у проміжку від 0.0 до 1.0, Ñку визначено на оÑнові поліномів Ерміта."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"ФункціÑ-Ñходинка ( вектор(межа), вектор(x) ).\n"
"\n"
"Повертає 0.0, Ñкщо «x» Ñ” меншим за «межа». Якщо це не так, повертає 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
"ФункціÑ-Ñходинка ( ÑкалÑÑ€(межа), вектор(x) ).\n"
"\n"
@@ -8648,6 +8737,13 @@ msgstr ""
"напрÑмку поглÑду камери (функції Ñлід передати відповіді вхідні дані)."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr "(лише у режимі фрагментів або Ñвітла) Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ ÑкалÑрної похідної."
@@ -8876,6 +8972,10 @@ msgid "Export templates for this platform are missing:"
msgstr "Ðемає шаблонів екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— платформи:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°Ð¼Ð¸ екÑпорту"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "ЕкÑпортувати із діагноÑтикою"
@@ -9034,6 +9134,15 @@ msgid "Unnamed Project"
msgstr "Проєкт без назви"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "Імпортувати наÑвний проєкт"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ проєкт у «%s»."
@@ -9130,11 +9239,13 @@ msgstr ""
"ВміÑÑ‚ теки не буде змінено."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
-"Вилучити уÑÑ– проєкти, Ñкі не знайдено, зі ÑпиÑку? (ВміÑÑ‚ тек не буде змінено)"
+"Вилучити %d проєктів зі ÑпиÑку?\n"
+"ВміÑÑ‚ тек проєктів змінено не буде."
#: editor/project_manager.cpp
msgid ""
@@ -9158,8 +9269,9 @@ msgid "Project Manager"
msgstr "Керівник проекту"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "СпиÑок проєктів"
+#, fuzzy
+msgid "Projects"
+msgstr "Проєкт"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9182,10 +9294,6 @@ msgid "Templates"
msgstr "Шаблони"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Вихід"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Перезавантажити зараз"
@@ -9525,6 +9633,10 @@ msgstr "Мови:"
msgid "AutoLoad"
msgstr "ÐвтозавантаженнÑ"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Плаґіни (додатки)"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "Ðуль"
@@ -9577,15 +9689,6 @@ msgstr "Вибір віртуального методу"
msgid "Select Method"
msgstr "Вибір методу"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "Ðе вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ інÑтрумент PVRTC:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-"Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ перетворене Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° допомогою заÑобу PVRTC:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "Пакетне перейменуваннÑ"
@@ -9883,6 +9986,11 @@ msgid "Remove Node(s)"
msgstr "Вилучити вузли"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "Змінити назву вихідного порту"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9927,9 +10035,8 @@ msgid "Extend Script"
msgstr "Розширити Ñкрипт"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
-msgstr "Змінити батьківÑький вузол"
+msgstr "Змінити батьківÑький вузол на новий"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -10004,24 +10111,27 @@ msgid "Node configuration warning:"
msgstr "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÑƒÐ·Ð»Ð°:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"Вузол міÑтить з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ– групи.\n"
"Клацніть, щоб переглÑнути панель Ñигналів."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"Вузол міÑтить з'єднаннÑ\n"
"Клацніть, щоб переглÑнути панель Ñигналів."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"Вузол належить групам.\n"
@@ -10120,6 +10230,11 @@ msgid "Error loading script from %s"
msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби завантажити Ñкрипт з %s"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "ПерезапиÑати"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "Ð/З"
@@ -10308,6 +10423,10 @@ msgid "Change Shortcut"
msgstr "Змінити ÑкороченнÑ"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Параметри редактора"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "Клавіатурні ÑкороченнÑ"
@@ -10726,10 +10845,30 @@ msgid "Set Variable Type"
msgstr "Ð’Ñтановити тип змінної"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "Ðазва не повинна збігатиÑÑ Ñ–Ð· наÑвною назвою вбудованого типу."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Створити прÑмокутник."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Змінні:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Створити прÑмокутник."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Створити новий полігон."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "Ðазва не Ñ” коректним ідентифікатором:"
@@ -10918,10 +11057,6 @@ msgid "Cut Nodes"
msgstr "Вирізати вузли"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Ð’Ñтавити вузли"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "Редагувати член"
@@ -11814,22 +11949,6 @@ msgstr ""
"Control, щоб у неї був розмір. Крім того, можна зробити її RenderTarget і "
"пов'Ñзати Ñ—Ñ— внутрішню текÑтуру з одним із вузлів Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ."
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Помилка ініціалізації FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Ðевідомий формат шрифту."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ñƒ."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Ðекоректний розмір шрифту."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Вхідні дані"
@@ -11862,6 +11981,109 @@ msgstr "Змінні величини можна пов'Ñзувати лише
msgid "Constants cannot be modified."
msgstr "Сталі не можна змінювати."
+#~ msgid "No Matches"
+#~ msgstr "Ðемає збігів"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "Ðе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ file_type_cache.cch Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу, не буде збережений "
+#~ "файл тип кешу!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr ""
+#~ "Ðеможливо перейти до '%s' , оÑкільки він не був знайдений в файловій "
+#~ "ÑиÑтемі!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Ð’ зображенні немає пікÑелів з прозоріÑтю > 128..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "Предок не має Ñуцільних граней Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚Ð¸ ділÑнку."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "Грані не міÑÑ‚Ñть ділÑнки!"
+
+#~ msgid "No faces!"
+#~ msgstr "Ðемає граней!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Помилка: не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл."
+
+#~ msgid "Error could not load file."
+#~ msgstr "Помилка: не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Ефект Доплера"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Режим Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Режим переÑÑƒÐ²Ð°Ð½Ð½Ñ (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Режим Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Режим маÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Локальні координати"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Режим Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "ІнÑтрумент позначеннÑ"
+
+#~ msgid "Tool Move"
+#~ msgstr "ІнÑтрумент переÑуваннÑ"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "ІнÑтрумент обертаннÑ"
+
+#~ msgid "Tool Scale"
+#~ msgstr "ІнÑтрумент маÑштабуваннÑ"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "Вилучити уÑÑ– проєкти, Ñкі не знайдено, зі ÑпиÑку? (ВміÑÑ‚ тек не буде "
+#~ "змінено)"
+
+#~ msgid "Project List"
+#~ msgstr "СпиÑок проєктів"
+
+#~ msgid "Exit"
+#~ msgstr "Вихід"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "Ðе вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ інÑтрумент PVRTC:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr ""
+#~ "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ перетворене Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° допомогою заÑобу PVRTC:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Помилка ініціалізації FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Ðевідомий формат шрифту."
+
+#~ msgid "Error loading font."
+#~ msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ñƒ."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Ðекоректний розмір шрифту."
+
#~ msgid "Previous Folder"
#~ msgstr "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñ‚ÐµÐºÐ°"
@@ -12622,9 +12844,6 @@ msgstr "Сталі не можна змінювати."
#~ msgid "Erase selection"
#~ msgstr "Витерти позначене"
-#~ msgid "Could not find tile:"
-#~ msgstr "Ðеможливо знайти плитку:"
-
#~ msgid "Item name or ID:"
#~ msgstr "Ðазва або ідентифікатор елемента:"
diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po
index f22e442132..d02d8f8c2c 100644
--- a/editor/translations/ur_PK.po
+++ b/editor/translations/ur_PK.po
@@ -63,7 +63,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr ""
@@ -641,15 +640,15 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
+msgid "Replaced %d occurrence(s)."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
+msgid "%d match."
msgstr ""
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
@@ -881,8 +880,7 @@ msgstr ""
msgid "Recent:"
msgstr ""
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -976,7 +974,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr ""
@@ -1012,7 +1010,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1101,14 +1099,14 @@ msgid "License"
msgstr ""
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr ""
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1125,7 +1123,7 @@ msgid "Licenses"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1619,12 +1617,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr ""
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr ""
@@ -2032,6 +2029,10 @@ msgstr ""
msgid "Clear Output"
msgstr "سب سکریپشن بنائیں"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2329,6 +2330,15 @@ msgid "Pick a Main Scene"
msgstr "ایک مینو منظر چنیں"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2423,6 +2433,10 @@ msgstr "ایک مینو منظر چنیں"
msgid "Close Tab"
msgstr ""
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2508,20 +2522,16 @@ msgstr ""
msgid "Open Scene..."
msgstr ""
-#: editor/editor_node.cpp
-msgid "Save Scene"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save All Scenes"
+msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2554,24 +2564,33 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr ""
#: editor/editor_node.cpp
-msgid "Project Settings"
+msgid "Project Settings..."
msgstr ""
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr ".سپورٹ"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
+msgid "Orphan Resource Explorer..."
msgstr ""
#: editor/editor_node.cpp
@@ -2651,12 +2670,12 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr ""
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
msgstr ""
#: editor/editor_node.cpp
@@ -2692,14 +2711,15 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
-msgstr ""
-
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+msgid "Manage Editor Features..."
msgstr ""
#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
+msgstr ".تمام کا انتخاب"
+
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr ""
@@ -2707,12 +2727,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr ""
@@ -3154,7 +3175,7 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+msgid "Redownload"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3171,6 +3192,10 @@ msgid "Download"
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3232,12 +3257,10 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr ""
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3251,13 +3274,17 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr ""
#: editor/export_template_manager.cpp
@@ -3345,20 +3372,12 @@ msgstr ".تمام کا انتخاب"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "Ù¾Ø³Ù†Ø¯ÛŒØ¯Û Ø§ÙˆÙ¾Ø± منتقل کریں"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3391,11 +3410,11 @@ msgid "Provided name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
+msgid "A file or folder with this name already exists."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
+msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3458,6 +3477,11 @@ msgstr ""
msgid "Move To..."
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "سب سکریپشن بنائیں"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3522,6 +3546,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "سب سکریپشن بنائیں"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3582,6 +3611,14 @@ msgid "Search complete"
msgstr ""
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr ""
@@ -3589,12 +3626,22 @@ msgstr ""
msgid "Invalid group name."
msgstr ""
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr ".تمام کا انتخاب"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr ".اینیمیشن کی کیز کو ڈیلیٹ کرو"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3607,12 +3654,13 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
+#, fuzzy
+msgid "Group Editor"
+msgstr "سب سکریپشن بنائیں"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3818,7 +3866,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4580,10 +4628,6 @@ msgid "View Files"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4596,14 +4640,42 @@ msgid "No response from host:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4680,8 +4752,12 @@ msgid "All"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr ".سپورٹ"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4702,7 +4778,8 @@ msgid "Site:"
msgstr "سائٹ:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr ".سپورٹ"
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4714,6 +4791,10 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Ø§Ø«Ø§Ø«Û Ú©ÛŒ زپ ÙØ§Ø¦Ù„"
@@ -4881,6 +4962,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
@@ -4910,6 +4996,7 @@ msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4930,15 +5017,18 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Move Mode"
msgstr "ایکشن منتقل کریں"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "ایکشن منتقل کریں"
@@ -4963,6 +5053,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -4979,11 +5070,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -4996,6 +5082,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5206,16 +5297,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5531,14 +5612,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5622,19 +5695,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5973,7 +6050,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6079,12 +6155,9 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr ""
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "سب سکریپشن بنائیں"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6107,7 +6180,7 @@ msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -6191,6 +6264,11 @@ msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6228,11 +6306,11 @@ msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
+msgid "Close All"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
+msgid "Close Docs"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
@@ -6321,6 +6399,11 @@ msgstr ""
msgid "Search Results"
msgstr "سب سکریپشن بنائیں"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "سب سکریپشن بنائیں"
+
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
msgstr ""
@@ -6389,6 +6472,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6424,23 +6508,6 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr ".تمام کا انتخاب"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr ""
@@ -6461,6 +6528,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6477,32 +6549,36 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
+msgid "Toggle Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Go to Next Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
+msgid "Go to Previous Bookmark"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
+msgid "Remove All Bookmarks"
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
msgid "Go to Function..."
msgstr ".تمام کا انتخاب"
@@ -6511,7 +6587,20 @@ msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/shader_editor_plugin.cpp
@@ -6752,8 +6841,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr ".Ù†ÙˆÙ¹ÙØ¦Ø± Ú©Û’ اکسٹنٹ Ú©Ùˆ تبدیل کیجیۓ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6806,7 +6896,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6817,27 +6907,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6882,23 +6952,6 @@ msgid "Focus Selection"
msgstr ".تمام کا انتخاب"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Tool Select"
-msgstr ".تمام کا انتخاب"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6953,7 +7006,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+msgid "Settings..."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7256,10 +7309,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7346,11 +7395,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7470,8 +7519,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7775,6 +7824,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input +"
msgstr ""
@@ -7853,6 +7906,11 @@ msgid "Duplicate Nodes"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr ".اینیمیشن کی کیز کو ڈیلیٹ کرو"
@@ -7862,10 +7920,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7879,6 +7933,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "سب سکریپشن بنائیں"
@@ -8239,7 +8298,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8248,7 +8307,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8411,6 +8470,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8436,7 +8499,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8445,7 +8508,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8454,14 +8517,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8506,6 +8569,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8714,6 +8784,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8863,6 +8937,15 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr ".تمام کا انتخاب"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr ""
@@ -8932,8 +9015,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -8953,8 +9036,9 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr ".تمام کا انتخاب"
#: editor/project_manager.cpp
msgid "Scan"
@@ -8979,10 +9063,6 @@ msgid "Templates"
msgstr ".تمام کا انتخاب"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9318,6 +9398,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9370,14 +9454,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
@@ -9667,6 +9743,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9790,19 +9870,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9894,6 +9974,10 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10089,6 +10173,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10508,10 +10596,29 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "سب سکریپشن بنائیں"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "سب سکریپشن بنائیں"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "سب سکریپشن بنائیں"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10700,10 +10807,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11435,22 +11538,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr ""
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11484,6 +11571,10 @@ msgid "Constants cannot be modified."
msgstr ""
#, fuzzy
+#~ msgid "Tool Select"
+#~ msgstr ".تمام کا انتخاب"
+
+#, fuzzy
#~ msgid "Create C# solution"
#~ msgstr "سب سکریپشن بنائیں"
diff --git a/editor/translations/vi.po b/editor/translations/vi.po
index b8707a154c..2cad1f6396 100644
--- a/editor/translations/vi.po
+++ b/editor/translations/vi.po
@@ -65,7 +65,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "Miễn phí"
@@ -653,16 +652,18 @@ msgid "Line Number:"
msgstr "Dòng số:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "Tìm thấy %d khớp."
+msgid "Replaced %d occurrence(s)."
+msgstr "Äã thay thế %d biến cố."
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "Không khớp"
+#, fuzzy
+msgid "%d match."
+msgstr "Tìm thấy %d khớp."
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Äã thay thế %d biến cố."
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "Tìm thấy %d khớp."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -888,8 +889,7 @@ msgstr "Ưa thích:"
msgid "Recent:"
msgstr "Gần đây:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -988,7 +988,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "Không thể gỡ bá»:"
@@ -1025,7 +1025,7 @@ msgstr "Xoá vĩnh viễn các đối tượng %d? (Không thể hoàn lại!)"
msgid "Show Dependencies"
msgstr "Phần phụ thuộc cho:"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1114,14 +1114,16 @@ msgid "License"
msgstr "Cấp phép"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "Cấp phép nhóm thứ ba"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine dựa trên một số thư viện mã nguồn mở và miễn phí của bên thứ "
@@ -1142,7 +1144,8 @@ msgid "Licenses"
msgstr "Các giấy phép"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "Lỗi không thể mở gói, không phải dạng nén."
#: editor/editor_asset_installer.cpp
@@ -1629,12 +1632,11 @@ msgid "New"
msgstr "Má»›i"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "Nhập vào"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "Xuất ra"
@@ -2032,6 +2034,10 @@ msgstr "Xoá"
msgid "Clear Output"
msgstr "Xoá đầu ra"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "Xuất dự án thất bại với mã lỗi %d."
@@ -2349,6 +2355,15 @@ msgid "Pick a Main Scene"
msgstr "Chá»n má»™t Scene chính"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Äóng Cảnh"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "Äóng Cảnh"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2452,6 +2467,11 @@ msgstr "Chạy cảnh này"
msgid "Close Tab"
msgstr "Äóng Tab"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "Äóng Tab"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "Äóng tất cả Tab khác"
@@ -2537,6 +2557,10 @@ msgstr "Tạo Cảnh Kế thừa..."
msgid "Open Scene..."
msgstr "Mở Cảnh ..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Mở gần đây"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "Lưu Cảnh"
@@ -2546,14 +2570,6 @@ msgid "Save All Scenes"
msgstr "Lưu tất cả Cảnh"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Äóng Cảnh"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Mở gần đây"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "Chuyển đổi ..."
@@ -2583,25 +2599,37 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "Dự án"
#: editor/editor_node.cpp
-msgid "Project Settings"
-msgstr ""
+#, fuzzy
+msgid "Project Settings..."
+msgstr "List Project"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Công cụ"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "Xuất ra"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "Cài đặt mẫu xây dựng Android"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "Mở thư mục dữ liệu dự án"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Công cụ"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "Cài đặt mẫu xây dựng Android"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "Lưu tài nguyên thành ..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2682,12 +2710,13 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "Trình biên tập"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "Cài đặt Trình biên tập"
#: editor/editor_node.cpp
@@ -2725,14 +2754,16 @@ msgid "Open Editor Settings Folder"
msgstr ""
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "Quản lý tính năng Trình biên tập"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "Quản lý mẫu Xuất ra"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "Trợ giúp"
@@ -2740,12 +2771,13 @@ msgstr "Trợ giúp"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "Tìm kiếm"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "Tài liệu trực tuyến"
@@ -3186,7 +3218,8 @@ msgid "Import From Node:"
msgstr "Nhập từ Nút:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "Tải lại"
#: editor/export_template_manager.cpp
@@ -3203,6 +3236,10 @@ msgid "Download"
msgstr "Tải"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(Thiếu)"
@@ -3264,12 +3301,10 @@ msgid "No response."
msgstr "Không phản hồi."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "Yêu cầu thất bại."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "Chuyển hướng vòng lặp."
@@ -3283,13 +3318,19 @@ msgid "Download Complete."
msgstr "Tải xuống xong."
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "Không thể gỡ bá»:"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "Lá»—i khi yêu cầu đưá»ng dẫn: "
#: editor/export_template_manager.cpp
@@ -3375,20 +3416,12 @@ msgstr "Tải các Mẫu"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "Ưa thích:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3421,14 +3454,14 @@ msgid "Provided name contains invalid characters."
msgstr "Tên có chứa ký tự không hợp lệ."
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "Tên có chứa kí tự không hợp lệ."
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "Äã có má»™t têp tin hoặc thư mục trùng tên."
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "Tên có chứa kí tự không hợp lệ."
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "Äổi tên tệp tin:"
@@ -3484,6 +3517,11 @@ msgstr "Nhân đôi..."
msgid "Move To..."
msgstr "Di chuyển đến..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "Tạo Cảnh Mới"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "Tạo Mã lệnh ..."
@@ -3549,6 +3587,11 @@ msgstr "Äã có tệp tin hoặc thư mục cùng tên tại vị trí này."
msgid "Overwrite"
msgstr "Ghi đè"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "Tạo từ Scene"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Tạo Mã lệnh"
@@ -3611,6 +3654,14 @@ msgid "Search complete"
msgstr "Tìm kiếm hoàn tất"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Thêm vào Nhóm"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Xóa khá»i Nhóm"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "Tên nhóm đã tồn tại."
@@ -3618,12 +3669,23 @@ msgstr "Tên nhóm đã tồn tại."
msgid "Invalid group name."
msgstr "Tên nhóm không hợp lệ."
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "Quản lý Nhóm"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "Xoá bố cục"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Nhóm"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "Nút không trong Nhóm"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3636,12 +3698,13 @@ msgid "Nodes in Group"
msgstr "Các nút trong Nhóm"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Thêm vào Nhóm"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Xóa khá»i Nhóm"
+#, fuzzy
+msgid "Group Editor"
+msgstr "Trình viết mã lệnh"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3847,7 +3910,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4607,10 +4670,6 @@ msgid "View Files"
msgstr "Xem Files"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "Kết nỗi lỗi, thử lại."
@@ -4623,15 +4682,48 @@ msgid "No response from host:"
msgstr "Không có phản hồi từ host:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "Yêu cầu thất bại, trả lại code:"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
+msgid "Request failed."
+msgstr "Yêu cầu thất bại."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "Không thể gỡ bá»:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Request failed, too many redirects"
msgstr "Yêu cầu thất bại, gá»­i lại quá nhiá»u"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "Chuyển hướng vòng lặp."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "Yêu cầu thất bại, trả lại code:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "Thá»i gian:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4709,8 +4801,12 @@ msgid "All"
msgstr "Tất cả"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "Nhập vào"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4732,7 +4828,8 @@ msgid "Site:"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "Hỗ trợ ..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4744,6 +4841,11 @@ msgid "Testing"
msgstr "Kiểm tra"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "Nạp ..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Tệp tin ZIP Nguyên liệu"
@@ -4906,6 +5008,11 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Guides"
+msgstr "Xoá khung xương"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr "Tạo xương tuỳ chỉnh từ Nút"
@@ -4934,6 +5041,7 @@ msgid "Zoom Reset"
msgstr "Äặt lại Thu phóng"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "Chế độ chá»n"
@@ -4954,14 +5062,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "Chế độ Di chuyển"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "Chế độ Xoay"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "Chế độ Tỉ lệ"
@@ -4987,6 +5098,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "Sử dụng Snap"
@@ -5003,11 +5115,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5020,6 +5127,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5229,16 +5341,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "Lỗi tải nạp hình ảnh:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5554,14 +5656,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5645,19 +5739,24 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "Cảnh không chứa tệp lệnh."
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't contain geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5992,7 +6091,6 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6098,12 +6196,9 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr ""
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "Không viết được file:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6131,8 +6226,9 @@ msgid "Error Importing"
msgstr "Lỗi di chuyển:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
-msgstr ""
+#, fuzzy
+msgid "New Text File..."
+msgstr "Thư mục mới ..."
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6217,6 +6313,11 @@ msgid "Open..."
msgstr "Mở"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "Tạo Script"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6255,13 +6356,13 @@ msgid "Save Theme"
msgstr "Lưu Theme"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Äóng Docs"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "Äóng tất cả"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Äóng Docs"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "Chạy"
@@ -6348,6 +6449,11 @@ msgstr ""
msgid "Search Results"
msgstr "Tìm sự giúp đỡ"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "Dá»n các cảnh gần đây"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6419,6 +6525,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6454,25 +6561,6 @@ msgid "Toggle Comment"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Bật tắt Chức năng"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "Äến Step tiếp theo"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "Äến Step trước đó"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr ""
@@ -6493,6 +6581,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "Chá»n Scale"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6509,35 +6602,39 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Tìm..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
+msgid "Toggle Bookmark"
+msgstr "Bật tắt Chức năng"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Bookmark"
msgstr "Äến Step tiếp theo"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
+msgid "Go to Previous Bookmark"
msgstr "Äến Step trước đó"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
+msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "Tìm..."
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
msgstr "Xoá Function"
@@ -6547,9 +6644,24 @@ msgid "Go to Line..."
msgstr "Äến Dòng"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Äến Step tiếp theo"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Äến Step trước đó"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -6787,8 +6899,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr ""
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "Kích hoạt lá»c"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6841,7 +6954,7 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6852,27 +6965,7 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -6916,22 +7009,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6986,8 +7063,9 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
-msgstr ""
+#, fuzzy
+msgid "Settings..."
+msgstr "Äang kết nối..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7292,10 +7370,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7384,11 +7458,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7510,8 +7584,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -7818,6 +7892,10 @@ msgid "TileSet"
msgstr "Xuất Tile Set"
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "Thêm Input"
@@ -7904,6 +7982,11 @@ msgid "Duplicate Nodes"
msgstr "Nhân đôi Node(s)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "Xóa Node(s)"
@@ -7913,10 +7996,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -7930,6 +8009,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "Tạo Root Node:"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "Tạo Root Node:"
@@ -8295,7 +8379,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8304,7 +8388,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8468,6 +8552,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8493,7 +8581,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8502,7 +8590,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8511,14 +8599,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8563,6 +8651,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8775,6 +8870,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Quản lý mẫu Xuất ra"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -8923,6 +9022,15 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "Dự án"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "Không thể chạy project"
@@ -8992,8 +9100,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9013,8 +9121,9 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "List Project"
+#, fuzzy
+msgid "Projects"
+msgstr "Dự án"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9038,10 +9147,6 @@ msgid "Templates"
msgstr "Khung project"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "Thoát"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "Restart ngay"
@@ -9382,6 +9487,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9434,14 +9543,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -9734,6 +9835,10 @@ msgid "Remove Node(s)"
msgstr "Xóa Node(s)"
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9858,19 +9963,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -9966,6 +10071,11 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "Ghi đè"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10158,6 +10268,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Cài đặt Trình biên tập"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -10574,10 +10688,29 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "Tạo nodes mới."
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "Tạo nodes mới."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "Tạo"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -10764,10 +10897,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr ""
@@ -11509,22 +11638,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "Lỗi khởi tạo FreeType."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "Äịnh dạng font không hợp lệ."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "Lỗi tải font."
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "Kích thước font không hợp lệ."
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "Nhập"
@@ -11559,6 +11672,27 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "No Matches"
+#~ msgstr "Không khớp"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Lỗi tải nạp hình ảnh:"
+
+#~ msgid "Exit"
+#~ msgstr "Thoát"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Lỗi khởi tạo FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Äịnh dạng font không hợp lệ."
+
+#~ msgid "Error loading font."
+#~ msgstr "Lỗi tải font."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Kích thước font không hợp lệ."
+
#~ msgid "Previous Folder"
#~ msgstr "Thư mục trước"
diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po
index affef14b72..b79ebd625f 100644
--- a/editor/translations/zh_CN.po
+++ b/editor/translations/zh_CN.po
@@ -33,7 +33,7 @@
# å°è è粑粑 <2062152083@qq.com>, 2018.
# 刘庆文 <liuqingwen@163.com>, 2018.
# Haowen Liu <liu.haowen.andy@gmail.com>, 2018.
-# tangdou1 <1093505442@qq.com>, 2018.
+# tangdou1 <1093505442@qq.com>, 2018, 2019.
# yzt <834950797@qq.com>, 2018, 2019.
# DKLost <514dklost@gmail.com>, 2018.
# thanksshu <hezihanshangyuan@gmail.com>, 2018.
@@ -52,12 +52,14 @@
# Lyu Shiqing <shiqing-thu18@yandex.com>, 2019.
# ColdThunder11 <lslyj27761@gmail.com>, 2019.
# liu lizhi <kz-xy@163.com>, 2019.
+# çŽ‹å¾ <jackey20000331@gmail.com>, 2019.
+# 巴哈姆特 <ttwings@126.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Chinese (Simplified) (Godot Engine)\n"
"POT-Creation-Date: 2018-01-20 12:15+0200\n"
-"PO-Revision-Date: 2019-07-19 13:42+0000\n"
-"Last-Translator: liu lizhi <kz-xy@163.com>\n"
+"PO-Revision-Date: 2019-08-29 13:35+0000\n"
+"Last-Translator: yzt <834950797@qq.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"godot-engine/godot/zh_Hans/>\n"
"Language: zh_CN\n"
@@ -65,7 +67,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -107,7 +109,6 @@ msgid "On call to '%s':"
msgstr "对'%s'调用 :"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "释放"
@@ -176,29 +177,24 @@ msgid "Anim Change Call"
msgstr "修改回调"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "修改动画关键帧的时长"
+msgstr "修改多个动画关键帧的时长"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "修改动画过渡方å¼"
+msgstr "修改多个动画过渡方å¼"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "ä¿®æ”¹åŠ¨ç”»å˜æ¢"
+msgstr "åŠ¨ç”»å¤šæ¬¡ä¿®æ”¹å˜æ¢é‡"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "修改动画关键帧的值"
+msgstr "修改多个动画关键帧的值"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "修改回调"
+msgstr "修改多个回调"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -694,16 +690,18 @@ msgid "Line Number:"
msgstr "行å·:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr "找到%d个匹é…项。"
+msgid "Replaced %d occurrence(s)."
+msgstr "替æ¢äº†%d项。"
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "无匹é…项"
+#, fuzzy
+msgid "%d match."
+msgstr "找到%d个匹é…项。"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "替æ¢äº†%d项。"
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "找到%d个匹é…项。"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -926,8 +924,7 @@ msgstr "æ”¶è—:"
msgid "Recent:"
msgstr "最近文件:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1023,7 +1020,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr "è¦åˆ é™¤çš„æ–‡ä»¶è¢«å…¶ä»–èµ„æºæ‰€ä¾èµ–,ä»ç„¶è¦åˆ é™¤å—?(无法撤销)"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "无法移除:"
@@ -1059,7 +1056,7 @@ msgstr "永久删除选中的%dæ¡é¡¹ç›®å—?(此æ“作无法撤销ï¼ï¼‰"
msgid "Show Dependencies"
msgstr "显示ä¾èµ–"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "查看孤立资æº"
@@ -1148,14 +1145,16 @@ msgid "License"
msgstr "许å¯è¯"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "第三方许å¯è¯"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot引擎ä¾èµ–第三方开æºä»£ç åº“,全部符åˆMIT 许å¯è¯çš„æ¡æ¬¾ã€‚ä¸‹é¢åˆ—出所有第三方组"
@@ -1174,7 +1173,8 @@ msgid "Licenses"
msgstr "许å¯è¯"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "打开压缩包出错,éžzipæ ¼å¼ã€‚"
#: editor/editor_asset_installer.cpp
@@ -1647,7 +1647,7 @@ msgstr "未设置"
#: editor/editor_feature_profile.cpp
msgid "Current Profile:"
-msgstr "当å‰é…置文件"
+msgstr "当å‰é…置文件:"
#: editor/editor_feature_profile.cpp
msgid "Make Current"
@@ -1659,12 +1659,11 @@ msgid "New"
msgstr "新建"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "导入"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "导出"
@@ -1801,32 +1800,28 @@ msgid "Move Favorite Down"
msgstr "å‘下移动收è—"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "转到父文件夹。"
+msgstr "转到上个文件夹。"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "转到父文件夹。"
+msgstr "转到下个文件夹。"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr "转到父文件夹。"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "æœç´¢æ–‡ä»¶"
+msgstr "刷新文件。"
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
msgstr "ï¼ˆå–æ¶ˆï¼‰æ”¶è—当剿–‡ä»¶å¤¹ã€‚"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "åˆ‡æ¢æ˜¾ç¤ºéšè—文件。"
+msgstr "切æ¢éšè—文件的å¯è§æ€§ã€‚"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
@@ -1859,11 +1854,10 @@ msgid "ScanSources"
msgstr "æ‰«ææºæ–‡ä»¶"
#: editor/editor_file_system.cpp
-#, fuzzy
msgid ""
"There are multiple importers for different types pointing to file %s, import "
"aborted"
-msgstr "%s 文件存在多ç§å¯¼å…¥æ–¹å¼ã€è‡ªåŠ¨å¯¼å…¥å¤±è´¥ã€‚"
+msgstr "ä¸åŒç±»åž‹çš„%s 文件存在多ç§å¯¼å…¥æ–¹å¼ï¼Œè‡ªåŠ¨å¯¼å…¥å¤±è´¥"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
@@ -2065,6 +2059,11 @@ msgstr "清除"
msgid "Clear Output"
msgstr "清空输出"
+#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
+msgid "New Window"
+msgstr "窗å£"
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "é¡¹ç›®å¯¼å‡ºå¤±è´¥ï¼Œé”™è¯¯ä»£ç  %d。"
@@ -2200,12 +2199,11 @@ msgstr ""
"请阅读与导入场景相关的文档, 以便更好地ç†è§£æ­¤å·¥ä½œæµã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
msgstr ""
-"此资æºå±žäºŽå®žä¾‹æˆ–继承的场景。\n"
+"这个资æºå±žäºŽå®žä¾‹æˆ–继承的场景。\n"
"ä¿å­˜å½“å‰åœºæ™¯æ—¶ä¸ä¼šä¿ç•™å¯¹å®ƒçš„æ›´æ”¹ã€‚"
#: editor/editor_node.cpp
@@ -2376,6 +2374,15 @@ msgid "Pick a Main Scene"
msgstr "选择主场景"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "关闭场景"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "关闭场景"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr "无法在: \"%s\" 上å¯ç”¨åŠ è½½é¡¹æ’ä»¶, é…置解æžå¤±è´¥ã€‚"
@@ -2478,6 +2485,11 @@ msgstr "è¿è¡Œæ­¤åœºæ™¯"
msgid "Close Tab"
msgstr "关闭标签页"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "关闭标签页"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "关闭其他标签页"
@@ -2487,9 +2499,8 @@ msgid "Close Tabs to the Right"
msgstr "关闭å³ä¾§"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "关闭全部"
+msgstr "关闭全部标签"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2532,9 +2543,8 @@ msgid "Go to previously opened scene."
msgstr "å‰å¾€ä¸Šä¸€ä¸ªæ‰“开的场景。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "æ‹·è´è·¯å¾„"
+msgstr "å¤åˆ¶æ–‡æœ¬"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2564,6 +2574,10 @@ msgstr "新建继承的场景…"
msgid "Open Scene..."
msgstr "打开场景..."
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "最近打开"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "ä¿å­˜åœºæ™¯"
@@ -2573,14 +2587,6 @@ msgid "Save All Scenes"
msgstr "ä¿å­˜æ‰€æœ‰åœºæ™¯"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "关闭场景"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "最近打开"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "转æ¢ä¸º..."
@@ -2610,25 +2616,36 @@ msgstr "æ¢å¤åœºæ™¯"
msgid "Miscellaneous project or scene-wide tools."
msgstr "其他工程或全场景工具。"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "项目"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "项目设置"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "工具"
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr "导出..."
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Install Android Build Template..."
+msgstr "安装 Android 构建模æ¿"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "æ‰“å¼€é¡¹ç›®æ•°æ®æ–‡ä»¶å¤¹"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "工具"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr "安装 Android 构建模æ¿"
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "查看孤立资æº"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2716,12 +2733,13 @@ msgstr ""
"开坿­¤é¡¹åŽï¼Œæ‰€æœ‰è„šæœ¬åœ¨ä¿å­˜æ—¶éƒ½ä¼šè¢«æ­£åœ¨è¿è¡Œçš„æ¸¸æˆé‡æ–°åŠ è½½ã€‚\n"
"当使用远程设备调试时,使用网络文件系统能有效æé«˜ç¼–辑效率。"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "编辑器"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "编辑器设置"
#: editor/editor_node.cpp
@@ -2757,14 +2775,16 @@ msgid "Open Editor Settings Folder"
msgstr "æ‰“å¼€â€œç¼–è¾‘å™¨è®¾ç½®â€æ–‡ä»¶å¤¹"
#: editor/editor_node.cpp
-msgid "Manage Editor Features"
+#, fuzzy
+msgid "Manage Editor Features..."
msgstr "管ç†ç¼–辑器功能"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "管ç†å¯¼å‡ºæ¨¡æ¿"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "帮助"
@@ -2772,12 +2792,13 @@ msgstr "帮助"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "æœç´¢"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "在线文档"
@@ -2851,14 +2872,12 @@ msgid "Spins when the editor window redraws."
msgstr "编辑器窗å£é‡ç»˜æ—¶æ—‹è½¬ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Continuously"
-msgstr "连续"
+msgstr "æŒç»­æ›´æ–°"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update When Changed"
-msgstr "有更改时更新UI"
+msgstr "当有更改时更新"
#: editor/editor_node.cpp
#, fuzzy
@@ -2894,9 +2913,8 @@ msgid "Android build template is missing, please install relevant templates."
msgstr "缺失 Android 构建模æ¿ï¼Œè¯·å®‰è£…相应的模æ¿ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Templates"
-msgstr "管ç†å¯¼å‡ºæ¨¡æ¿"
+msgstr "ç®¡ç†æ¨¡æ¿"
#: editor/editor_node.cpp
msgid ""
@@ -3058,9 +3076,8 @@ msgid "Calls"
msgstr "调用次数"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "编辑主题..."
+msgstr "编辑文本:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3229,7 +3246,8 @@ msgid "Import From Node:"
msgstr "从节点中导入:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "釿–°ä¸‹è½½"
#: editor/export_template_manager.cpp
@@ -3246,6 +3264,10 @@ msgid "Download"
msgstr "下载"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(丢失)"
@@ -3307,12 +3329,10 @@ msgid "No response."
msgstr "æ— å“应。"
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "请求失败。"
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "循环é‡å®šå‘。"
@@ -3326,13 +3346,20 @@ msgid "Download Complete."
msgstr "下载完æˆã€‚"
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "无法ä¿å­˜ä¸»é¢˜åˆ°æ–‡ä»¶:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr "模æ¿å®‰è£…失败。å¯ä»¥åœ¨ '%s' ä¸­æ‰¾åˆ°è¿™äº›é—®é¢˜æ¨¡æ¿æ–‡æ¡£ã€‚"
#: editor/export_template_manager.cpp
-msgid "Error requesting url: "
+#, fuzzy
+msgid "Error requesting URL:"
msgstr "请求链接错误: "
#: editor/export_template_manager.cpp
@@ -3382,9 +3409,8 @@ msgid "SSL Handshake Error"
msgstr "SSL æ¡æ‰‹é”™è¯¯"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Uncompressing Android Build Sources"
-msgstr "无压缩资æº"
+msgstr "无压缩的Android Build资æº"
#: editor/export_template_manager.cpp
msgid "Current Version:"
@@ -3403,9 +3429,8 @@ msgid "Remove Template"
msgstr "移除模æ¿"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select Template File"
-msgstr "åˆ é™¤é€‰ä¸­æ¨¡æ¿æ–‡ä»¶"
+msgstr "é€‰æ‹©æ¨¡æ¿æ–‡ä»¶"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
@@ -3419,19 +3444,11 @@ msgstr "下载模æ¿"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "从列表中选择镜åƒï¼šï¼ˆShift+å•击:在æµè§ˆå™¨ä¸­æ‰“开)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr "无法以å¯å†™æ–¹å¼æ‰“å¼€file_type_cache.cchï¼"
-
#: editor/filesystem_dock.cpp
msgid "Favorites"
msgstr "æ”¶è—夹"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "因为文件系统没找到文件,ä¸èƒ½å®šä½åˆ°'%s'ï¼"
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr "状æ€: å¯¼å…¥æ–‡ä»¶å¤±è´¥ã€‚è¯·æ‰‹åŠ¨ä¿®å¤æ–‡ä»¶åŽé‡æ–°å¯¼å…¥ã€‚"
@@ -3465,14 +3482,14 @@ msgid "Provided name contains invalid characters."
msgstr "æä¾›çš„åç§°åŒ…å«æ— æ•ˆå­—符"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "åç§°åŒ…å«æ— æ•ˆå­—符。"
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "åŒå的文件夹已ç»å­˜åœ¨ã€‚"
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "åç§°åŒ…å«æ— æ•ˆå­—符。"
+
+#: editor/filesystem_dock.cpp
msgid "Renaming file:"
msgstr "é‡å‘½å文件:"
@@ -3489,9 +3506,8 @@ msgid "Duplicating folder:"
msgstr "å¤åˆ¶æ–‡ä»¶å¤¹:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Inherited Scene"
-msgstr "新建继承的场景…"
+msgstr "新继承的场景"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3532,6 +3548,11 @@ msgstr "æ‹·è´..."
msgid "Move To..."
msgstr "移动..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "新建场景"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr "新建脚本…"
@@ -3600,6 +3621,11 @@ msgstr "当å‰ä½ç½®å·²å­˜åœ¨ç›¸åŒå字的文件或目录。"
msgid "Overwrite"
msgstr "覆盖"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "从场景中创建"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "创建脚本"
@@ -3660,6 +3686,14 @@ msgid "Search complete"
msgstr "æœç´¢å®Œæ¯•"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "添加到分组"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "从分组中移除"
+
+#: editor/groups_editor.cpp
msgid "Group name already exists."
msgstr "分组å称已存在。"
@@ -3667,12 +3701,23 @@ msgstr "分组å称已存在。"
msgid "Invalid group name."
msgstr "ç»„åæ— æ•ˆã€‚"
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "管ç†åˆ†ç»„"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "删除图片分组"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "分组"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "ä¸åœ¨åˆ†ç»„中的节点"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3685,12 +3730,12 @@ msgid "Nodes in Group"
msgstr "分组中的节点"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "添加到分组"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "从分组中移除"
+msgid "Group Editor"
+msgstr "分组编辑"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3896,7 +3941,8 @@ msgid "MultiNode Set"
msgstr "多节点组"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "请选择一个节点æ¥è®¾ç½®ä¿¡å·æˆ–分组。"
#: editor/plugin_config_dialog.cpp
@@ -4649,10 +4695,6 @@ msgid "View Files"
msgstr "查看文件"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "无法解æžä¸»æœºå:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "连接错误,请é‡è¯•。"
@@ -4665,14 +4707,47 @@ msgid "No response from host:"
msgstr "æœåŠ¡å™¨æ— å“应:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "无法解æžä¸»æœºå:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "请求失败,错误代ç :"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "请求失败。"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "无法ä¿å­˜ä¸»é¢˜åˆ°æ–‡ä»¶:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "请求失败,é‡å®šå‘次数过多"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "循环é‡å®šå‘。"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "请求失败,错误代ç :"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "æ—¶é—´"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr "文件hash值错误,该文件å¯èƒ½è¢«ç¯¡æ”¹ã€‚"
@@ -4750,8 +4825,13 @@ msgid "All"
msgstr "全部"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "釿–°å¯¼å…¥..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "æ’ä»¶"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4773,7 +4853,8 @@ msgid "Site:"
msgstr "站点:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "支æŒ..."
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4785,6 +4866,11 @@ msgid "Testing"
msgstr "测试"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "加载..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "ZIP资æºåŒ…"
@@ -4954,6 +5040,11 @@ msgstr "粘贴姿势"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "清除姿势"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "从节点制作自定义骨骼"
@@ -4983,6 +5074,7 @@ msgid "Zoom Reset"
msgstr "é‡ç½®ç¼©æ”¾"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "选择模å¼"
@@ -5003,14 +5095,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+é¼ æ ‡å³é”®:显示鼠标点击ä½ç½®ä¸‹çš„æ‰€æœ‰èŠ‚ç‚¹åˆ—è¡¨"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "移动模å¼"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "旋转模å¼"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
msgstr "缩放模å¼"
@@ -5034,6 +5129,7 @@ msgid "Toggle snapping."
msgstr "开关å¸é™„。"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "使用å¸é™„"
@@ -5051,11 +5147,6 @@ msgid "Use Rotation Snap"
msgstr "使用旋转å¸é™„"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "设置å¸é™„..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr "相对å¸é™„"
@@ -5069,6 +5160,11 @@ msgid "Smart Snapping"
msgstr "智能å¸é™„"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "设置å¸é™„..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
msgstr "å¸é™„到父节点"
@@ -5182,12 +5278,10 @@ msgid "Preview Canvas Scale"
msgstr "ç²¾çµé›†é¢„览"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Translation mask for inserting keys."
msgstr "用于æ’å…¥é”®çš„è½¬æ¢æŽ©ç ã€‚"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotation mask for inserting keys."
msgstr "用于æ’入键的旋转掩ç ã€‚"
@@ -5206,6 +5300,9 @@ msgid ""
"Keys are only added to existing tracks, no new tracks will be created.\n"
"Keys must be inserted manually for the first time."
msgstr ""
+"当对象ä½ç§»å˜åŒ–,按缩放比例旋转(基于蒙版)时自动æ’入关键帧。\n"
+"关键帧键åªä¼šæ·»åŠ åˆ°çŽ°æœ‰è½¨é“,ä¸ä¼šåˆ›å»ºæ–°è½¨é“。\n"
+"第一次必须手动æ’入关键帧。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Auto Insert Key"
@@ -5289,16 +5386,6 @@ msgstr "设置处ç†ç¨‹åº"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "加载图片出错:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "å›¾ç‰‡ä¸­æ²¡æœ‰é€æ˜Žåº¦> 128çš„åƒç´ ..."
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr "加载Emission Mask(å‘å°„å±è”½ï¼‰"
@@ -5620,14 +5707,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "表é¢çš„æºæ— æ•ˆï¼ˆæ— é¢ï¼‰ã€‚"
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "çˆ¶çº§æ²¡æœ‰å®žä½“é¢æ¥å¡«å……。"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "无法绘制区域。"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "选择æºMesh:"
@@ -5711,20 +5790,27 @@ msgid "Generation Time (sec):"
msgstr "ç”Ÿæˆæ—¶é—´ï¼ˆç§’):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "é¢ä¸å«æœ‰åŒºåŸŸï¼"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "节点ä¸åŒ…å«å‡ ä½•(é¢ï¼‰ã€‚"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
-msgstr "没有é¢ï¼"
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "节点ä¸åŒ…å«å‡ ä½•。"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "节点ä¸åŒ…å«å‡ ä½•(é¢ï¼‰ã€‚"
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "节点ä¸åŒ…å«å‡ ä½•。"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6051,7 +6137,6 @@ msgid "Grid Settings"
msgstr "网格设置"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr "å¸é™„"
@@ -6157,12 +6242,9 @@ msgid "Error writing TextFile:"
msgstr "写入文本文件时出错:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error: could not load file."
-msgstr "错误:无法加载文件。"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error could not load file."
-msgstr "错误,无法加载文件。"
+#, fuzzy
+msgid "Could not load file at:"
+msgstr "找ä¸åˆ°ç –å—:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6185,7 +6267,8 @@ msgid "Error Importing"
msgstr "导入出错"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile..."
+#, fuzzy
+msgid "New Text File..."
msgstr "新建文本文档..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6268,6 +6351,11 @@ msgid "Open..."
msgstr "打开…"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "打开脚本"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "全部ä¿å­˜"
@@ -6305,13 +6393,13 @@ msgid "Save Theme"
msgstr "ä¿å­˜ä¸»é¢˜"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "关闭文档"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "关闭全部"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "关闭文档"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "è¿è¡Œ"
@@ -6401,6 +6489,11 @@ msgstr "调试器"
msgid "Search Results"
msgstr "æœç´¢ç»“æžœ"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "清除近期的场景"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6471,6 +6564,7 @@ msgid "Syntax Highlighter"
msgstr "语法高亮显示"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr "跳转到"
@@ -6506,26 +6600,6 @@ msgid "Toggle Comment"
msgstr "åˆ‡æ¢æ³¨é‡Š"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "切æ¢è‡ªç”±è§‚察模å¼"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "å‰å¾€ä¸‹ä¸€ä¸ªæ–­ç‚¹"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "å‰å¾€ä¸Šä¸€ä¸ªæ–­ç‚¹"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "移除类项目"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
msgstr "切æ¢å è¡Œ"
@@ -6546,6 +6620,11 @@ msgid "Complete Symbol"
msgstr "代ç è¡¥å…¨"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "缩放选中项"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "修剪行åŽç©ºç™½"
@@ -6562,29 +6641,36 @@ msgid "Auto Indent"
msgstr "自动缩进"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "设置断点"
+msgid "Find Previous"
+msgstr "查找上一项"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "移除所有断点"
+msgid "Find in Files..."
+msgstr "在文件中查找..."
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "å‰å¾€ä¸‹ä¸€ä¸ªæ–­ç‚¹"
+msgid "Contextual Help"
+msgstr "æœç´¢å…‰æ ‡ä½ç½®"
#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "å‰å¾€ä¸Šä¸€ä¸ªæ–­ç‚¹"
+#, fuzzy
+msgid "Toggle Bookmark"
+msgstr "切æ¢è‡ªç”±è§‚察模å¼"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "查找上一项"
+#, fuzzy
+msgid "Go to Next Bookmark"
+msgstr "å‰å¾€ä¸‹ä¸€ä¸ªæ–­ç‚¹"
#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "在文件中查找..."
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "å‰å¾€ä¸Šä¸€ä¸ªæ–­ç‚¹"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Remove All Bookmarks"
+msgstr "移除类项目"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6595,8 +6681,21 @@ msgid "Go to Line..."
msgstr "转到行..."
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "æœç´¢å…‰æ ‡ä½ç½®"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "设置断点"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "移除所有断点"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "å‰å¾€ä¸‹ä¸€ä¸ªæ–­ç‚¹"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "å‰å¾€ä¸Šä¸€ä¸ªæ–­ç‚¹"
#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
@@ -6838,8 +6937,9 @@ msgid "Audio Listener"
msgstr "音频监å¬å™¨"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "å¯ç”¨å¤šæ™®å‹’效应"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "å…许过滤"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -6894,8 +6994,8 @@ msgid "Snap Nodes To Floor"
msgstr "将节点å¸é™„至地é¢"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode (Q)"
-msgstr "é€‰æ‹©æ¨¡å¼ (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6908,30 +7008,11 @@ msgstr ""
"Alt+é¼ æ ‡å³é”®ï¼šæ˜¾ç¤ºåˆ—表"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "移动模å¼ï¼ˆW)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "旋转模å¼ï¼ˆE)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "缩放模å¼ï¼ˆR)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "æœ¬åœ°åæ ‡"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "æœ¬åœ°ç©ºé—´æ¨¡å¼ (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "å¸é™„æ¨¡å¼ (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "底部视图"
@@ -6973,22 +7054,6 @@ msgid "Focus Selection"
msgstr "选中选中项"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Select"
-msgstr "选择工具"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "移动工具"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "旋转工具"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "缩放工具"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "切æ¢è‡ªç”±è§‚察模å¼"
@@ -7044,7 +7109,8 @@ msgstr "显示网格"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "设置"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7336,17 +7402,13 @@ msgstr "步长(秒):"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr "乿œˆï¼š"
+msgstr "间隔:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "TextureRegion"
msgstr "TextureRegion 纹ç†åŒºåŸŸ"
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "无法ä¿å­˜ä¸»é¢˜åˆ°æ–‡ä»¶:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "添加所有项目"
@@ -7427,8 +7489,9 @@ msgid "Checked Radio Item"
msgstr "已选å•选项目"
#: editor/plugins/theme_editor_plugin.cpp
+#, fuzzy
msgid "Named Sep."
-msgstr ""
+msgstr "称为 Sep。"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Submenu"
@@ -7436,12 +7499,12 @@ msgstr "å­èœå•(Submenu)"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "项目(Item)"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "项目(Item)"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7476,7 +7539,7 @@ msgstr "å…许编辑å­å­™èŠ‚ç‚¹"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Subtree"
-msgstr ""
+msgstr "å­æ ‘"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has,Many,Options"
@@ -7561,9 +7624,10 @@ msgid "Paint Tile"
msgstr "绘制ç£è´´"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
"Shift+é¼ æ ‡å³é”®ï¼šç»˜åˆ¶ç›´çº¿\n"
"Shift+Ctrl+é¼ æ ‡å³é”®ï¼šç»˜åˆ¶çŸ©å½¢"
@@ -7870,7 +7934,11 @@ msgstr "ä¸èƒ½ä¿®æ”¹è¯¥å±žæ€§ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "TileSet"
-msgstr "瓦片集"
+msgstr "ç –å—集"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "åªä½¿ç”¨GLES3"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -7961,6 +8029,11 @@ msgid "Duplicate Nodes"
msgstr "å¤åˆ¶èŠ‚ç‚¹"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "粘贴节点"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
msgstr "删除节点"
@@ -7969,10 +8042,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "å¯è§†ç€è‰²å™¨è¾“入类型已更改"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "顶点"
@@ -7986,6 +8055,11 @@ msgstr "ç¯å…‰"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "新节点"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "新节点"
@@ -8017,12 +8091,14 @@ msgid "Sepia function."
msgstr "é‡å‘½å函数"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Burn operator."
-msgstr ""
+msgstr "Burn æ“作。"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Darken operator."
-msgstr ""
+msgstr "Darken è¿ç®—符。"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8030,373 +8106,388 @@ msgid "Difference operator."
msgstr "ä»…ä¸åŒ"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Dodge operator."
-msgstr ""
+msgstr "Dodge è¿ç®—符。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "HardLight operator"
-msgstr ""
+msgstr "HardLight æ“作"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Lighten operator."
-msgstr ""
+msgstr "Lightenè¿ç®—."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Overlay operator."
-msgstr ""
+msgstr "å åŠ è¿ç®—符。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Screen operator."
-msgstr ""
+msgstr "å±å¹•æ“作符。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "SoftLight operator."
-msgstr ""
+msgstr "SoftLight æ“作符."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color constant."
-msgstr "常é‡"
+msgstr "颜色常é‡."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Color uniform."
-msgstr "æ¸…é™¤å˜æ¢"
+msgstr "颜色å‡åŒ€ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the boolean result of the %s comparison between two parameters."
-msgstr ""
+msgstr "è¿”å›žä¸¤ä¸ªå‚æ•°ä¹‹é—´ï¼…s比较的布尔结果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Equal (==)"
-msgstr ""
+msgstr "等于 (==)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than (>)"
-msgstr ""
+msgstr "大于 (>)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than or Equal (>=)"
-msgstr ""
+msgstr "大于等于 (>=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided scalars are equal, greater or "
"less."
-msgstr ""
+msgstr "如果æä¾›çš„æ ‡é‡ç›¸ç­‰ï¼Œæ›´å¤§æˆ–æ›´å°ï¼Œåˆ™è¿”回关è”çš„å‘é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns the boolean result of the comparison between INF and a scalar "
"parameter."
-msgstr ""
+msgstr "返回 INF 和标é‡å‚数之间比较的布尔结果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns the boolean result of the comparison between NaN and a scalar "
"parameter."
-msgstr ""
+msgstr "返回 NaN 和标é‡å‚数之间比较的布尔结果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
-msgstr ""
+msgstr "å°äºŽ (*)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than or Equal (<=)"
-msgstr ""
+msgstr "å°äºŽæˆ–等于 (+)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Not Equal (!=)"
-msgstr ""
+msgstr "ä¸ç­‰äºŽï¼ˆ!=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided boolean value is true or false."
-msgstr ""
+msgstr "如果æä¾›çš„布尔值为true或false,则返回关è”çš„å‘é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the comparison between two parameters."
-msgstr ""
+msgstr "è¿”å›žä¸¤ä¸ªå‚æ•°ä¹‹é—´æ¯”较的布尔结果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF (or NaN) and a "
"scalar parameter."
-msgstr ""
+msgstr "返回 INF(或 NaN)和标é‡å‚数之间比较的布尔结果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Boolean constant."
-msgstr "修改Vec常é‡ç³»æ•°"
+msgstr "布尔常é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean uniform."
-msgstr ""
+msgstr "布尔统一。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for all shader modes."
-msgstr ""
+msgstr "'%s'为所有ç€è‰²å™¨æ¨¡æ¿çš„è¾“å…¥å‚æ•°ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Input parameter."
-msgstr "å¸é™„到父节点"
+msgstr "è¾“å…¥å‚æ•°ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader modes."
-msgstr ""
+msgstr "'%s'为顶点和片段ç€è‰²å™¨æ¨¡æ¿çš„è¾“å…¥å‚æ•°ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment and light shader modes."
-msgstr ""
+msgstr "'%s'为片段和ç¯å…‰ç€è‰²å™¨æ¨¡æ¿çš„è¾“å…¥å‚æ•°ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "'%s' input parameter for fragment shader mode."
-msgstr ""
+msgstr "'%s' 为片段ç€è‰²å™¨æ¨¡å¼çš„è¾“å…¥å‚æ•°ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "'%s' input parameter for light shader mode."
-msgstr ""
+msgstr "'%s' 为ç¯å…‰ç€è‰²å™¨æ¨¡æ¿çš„è¾“å…¥å‚æ•°ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "'%s' input parameter for vertex shader mode."
-msgstr ""
+msgstr "'%s' 为顶点ç€è‰²å™¨æ¨¡æ¿çš„è¾“å…¥å‚æ•°ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader mode."
-msgstr ""
+msgstr "'%s'为顶点和片段ç€è‰²å™¨æ¨¡æ¿çš„è¾“å…¥å‚æ•°ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar function."
-msgstr "修改Function Scalar"
+msgstr "Scalar 函数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar operator."
-msgstr "更改标é‡è¿ç®—符(Scalar Operator)"
+msgstr "æ ‡é‡è¿ç®—符(Scalar Operator)。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "E constant (2.718282). Represents the base of the natural logarithm."
-msgstr ""
+msgstr "E常数(2.718282)。表示自然对数的基数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Epsilon constant (0.00001). Smallest possible scalar number."
-msgstr ""
+msgstr "Epsilon常数(0.00001)。最å°çš„æ ‡é‡æ•°ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Phi constant (1.618034). Golden ratio."
-msgstr ""
+msgstr "Phi常数(1.618034)。黄金比例。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/4 constant (0.785398) or 45 degrees."
-msgstr ""
+msgstr "Pi / 4常数(0.785398)或45度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/2 constant (1.570796) or 90 degrees."
-msgstr ""
+msgstr "Pi/2常数(1.570796)或90度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi constant (3.141593) or 180 degrees."
-msgstr ""
+msgstr "Pi 常数 (3.141593) 或 180 度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Tau constant (6.283185) or 360 degrees."
-msgstr ""
+msgstr "Tau常数(6.283185)或360度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sqrt2 constant (1.414214). Square root of 2."
-msgstr ""
+msgstr "Sqrt2 常数 (1.414214)。2 的平方根。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the absolute value of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„ç»å¯¹å€¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-cosine of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„å余弦值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„ååŒæ›²ä½™å¼¦å€¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-sine of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„åæ­£å¼¦å€¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic sine of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„ååŒæ›²æ­£å¼¦å€¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„åæ­£åˆ‡å€¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameters."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„åæ­£åˆ‡å€¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic tangent of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„ååŒæ›²æ­£åˆ‡å€¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Finds the nearest integer that is greater than or equal to the parameter."
-msgstr ""
+msgstr "æŸ¥æ‰¾æœ€æŽ¥è¿‘çš„å¤§äºŽæˆ–ç­‰äºŽå‚æ•°çš„æ•´æ•°ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Constrains a value to lie between two further values."
-msgstr ""
+msgstr "将值é™åˆ¶åœ¨ä¸¤ä¸ªå…¶ä»–值之间。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the cosine of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„余弦值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„åŒæ›²ä½™å¼¦å€¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
-msgstr ""
+msgstr "将以弧度为å•ä½çš„é‡è½¬æ¢ä¸ºåº¦ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-e Exponential."
-msgstr ""
+msgstr "以e为底的指数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 Exponential."
-msgstr ""
+msgstr "2为底的指数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer less than or equal to the parameter."
-msgstr ""
+msgstr "查找å°äºŽæˆ–ç­‰äºŽå‚æ•°çš„æœ€è¿‘整数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Computes the fractional part of the argument."
-msgstr ""
+msgstr "è®¡ç®—å‚æ•°çš„å°æ•°éƒ¨åˆ†ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse of the square root of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„平方根的倒数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Natural logarithm."
-msgstr ""
+msgstr "自然对数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 logarithm."
-msgstr ""
+msgstr "2为底的对数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the greater of two values."
-msgstr ""
+msgstr "返回两个值中较大的一个。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the lesser of two values."
-msgstr ""
+msgstr "返回两个值中较å°çš„一个。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two scalars."
-msgstr ""
+msgstr "两个标é‡ä¹‹é—´çš„线性æ’值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the opposite value of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„相å值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - scalar"
-msgstr ""
+msgstr "1.0 - æ ‡é‡"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the value of the first parameter raised to the power of the second."
-msgstr ""
+msgstr "è¿”å›žç¬¬ä¸€ä¸ªå‚æ•°ä¸ºç¬¬äºŒä¸ªå‚数幂的值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in degrees to radians."
-msgstr ""
+msgstr "将度数转æ¢ä¸ºå¼§åº¦ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / scalar"
-msgstr ""
+msgstr "1.0 / æ ‡é‡"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer to the parameter."
-msgstr ""
+msgstr "æŸ¥æ‰¾å‚æ•°æœ€è¿‘的整数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest even integer to the parameter."
-msgstr ""
+msgstr "æŸ¥æ‰¾å‚æ•°æœ€è¿‘çš„å¶æ•°ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
-msgstr ""
+msgstr "将值é™åˆ¶åœ¨ 0.0 å’Œ 1.0 之间。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Extracts the sign of the parameter."
-msgstr ""
+msgstr "æå–傿•°çš„符å·ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the sine of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„æ­£å¼¦å€¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic sine of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„åŒæ›²æ­£å¼¦å€¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the square root of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„平方根。"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
+"\n"
+"如果'x'å°äºŽ'edge0'则返回0.0,如果x大于'edge1'则返回1.0。å¦åˆ™åœ¨0.0å’Œ1.0之间返"
+"回Hermiteå¤šé¡¹å¼æ’值的值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Step function( scalar(edge), scalar(x) ).\n"
+"\n"
+"如果'x'å°äºŽ'edge'则返回0.0,å¦åˆ™è¿”回1.0。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the tangent of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„æ­£åˆ‡å€¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic tangent of the parameter."
-msgstr ""
+msgstr "è¿”å›žå‚æ•°çš„åŒæ›²æ­£åˆ‡å€¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Finds the truncated value of the parameter."
-msgstr ""
+msgstr "æŸ¥æ‰¾å‚æ•°çš„æˆªæ–­å€¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Adds scalar to scalar."
-msgstr ""
+msgstr "呿 ‡é‡æ·»åŠ æ ‡é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides scalar by scalar."
-msgstr ""
+msgstr "用标é‡é™¤æ ‡é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies scalar by scalar."
-msgstr ""
+msgstr "将标é‡ä¹˜ä»¥æ ‡é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the remainder of the two scalars."
-msgstr ""
+msgstr "返回两个标é‡çš„剩余部分。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts scalar from scalar."
-msgstr ""
+msgstr "从标é‡ä¸­å‡åŽ»æ ‡é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8410,11 +8501,11 @@ msgstr "修改Uniform Scalar"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the cubic texture lookup."
-msgstr ""
+msgstr "æ‰§è¡Œç«‹æ–¹ä½“çº¹ç†æŸ¥æ‰¾ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the texture lookup."
-msgstr ""
+msgstr "æ‰§è¡Œç«‹æ–¹ä½“çº¹ç†æŸ¥æ‰¾ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8449,31 +8540,31 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes transform from four vectors."
-msgstr ""
+msgstr "由四个å‘釿ž„æˆå˜æ¢ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes transform to four vectors."
-msgstr ""
+msgstr "å°†å˜æ¢åˆ†è§£ä¸ºå››ä¸ªå‘é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the determinant of a transform."
-msgstr ""
+msgstr "è®¡ç®—å˜æ¢çš„行列å¼ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the inverse of a transform."
-msgstr ""
+msgstr "è®¡ç®—å˜æ¢çš„倒数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the transpose of a transform."
-msgstr ""
+msgstr "è®¡ç®—ä¸€ä¸ªå˜æ¢çš„转置。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies transform by transform."
-msgstr ""
+msgstr "ä¸€ä¸ªå˜æ¢ä¹˜ä»¥ä¸€ä¸ªå˜æ¢ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by transform."
-msgstr ""
+msgstr "ç”¨å˜æ¢ä¹˜ä»¥å‘é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8497,23 +8588,23 @@ msgstr "更改 Vec è¿ç®—符(Vec Operator)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes vector from three scalars."
-msgstr ""
+msgstr "由三个标é‡ç»„æˆå‘é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes vector to three scalars."
-msgstr ""
+msgstr "å°†å‘é‡åˆ†è§£ä¸ºä¸‰ä¸ªæ ‡é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the cross product of two vectors."
-msgstr ""
+msgstr "计算两个å‘é‡çš„å‰ä¹˜ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the distance between two points."
-msgstr ""
+msgstr "返回两点之间的è·ç¦»ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the dot product of two vectors."
-msgstr ""
+msgstr "计算两个å‘é‡çš„点乘。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8522,88 +8613,113 @@ msgid ""
"incident vector, and Nref, the reference vector. If the dot product of I and "
"Nref is smaller than zero the return value is N. Otherwise -N is returned."
msgstr ""
+"返回指å‘与å‚考å‘é‡ç›¸åŒæ–¹å‘çš„å‘é‡ã€‚该函数有三个å‘é‡å‚数:N,方å‘å‘é‡ï¼ŒI,入射"
+"å‘é‡ï¼ŒNref,å‚考å‘é‡ã€‚如果Iå’ŒNref的点乘å°äºŽé›¶ï¼Œè¿”回值为n,å¦åˆ™è¿”回-N。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the length of a vector."
-msgstr ""
+msgstr "计算å‘é‡çš„长度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two vectors."
-msgstr ""
+msgstr "两个å‘é‡ä¹‹é—´çš„线性æ’值。"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "两个å‘é‡ä¹‹é—´çš„线性æ’值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
-msgstr ""
+msgstr "计算å‘é‡çš„æ ‡å‡†åŒ–积。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - vector"
-msgstr ""
+msgstr "1.0 - å‘é‡"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / vector"
-msgstr ""
+msgstr "1.0 / å‘é‡"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the vector that points in the direction of reflection ( a : incident "
"vector, b : normal vector )."
-msgstr ""
+msgstr "返回指å‘åå°„æ–¹å‘çš„å‘é‡ï¼ˆa:入射å‘é‡ï¼Œb:法å‘é‡ï¼‰ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the vector that points in the direction of refraction."
-msgstr ""
+msgstr "è¿”å›žæŒ‡å‘æŠ˜å°„æ–¹å‘的矢é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
+"\n"
+"如果'x'å°äºŽ'edge0'则返回0.0,如果x大于'edge1'则返回1.0。å¦åˆ™åœ¨0.0å’Œ1.0之间返"
+"回Hermiteå¤šé¡¹å¼æ’值的值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
+"\n"
+"如果'x'å°äºŽ'edge0'则返回0.0,如果x大于'edge1'则返回1.0。å¦åˆ™åœ¨0.0å’Œ1.0之间返"
+"回Hermiteå¤šé¡¹å¼æ’值的值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Step function( scalar(edge), scalar(x) ).\n"
+"\n"
+"如果'x'å°äºŽ'edge'则返回0.0,å¦åˆ™è¿”回1.0。"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Step function( scalar(edge), scalar(x) ).\n"
+"\n"
+"如果'x'å°äºŽ'edge'则返回0.0,å¦åˆ™è¿”回1.0。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds vector to vector."
-msgstr ""
+msgstr "把å‘é‡åŠ åˆ°å‘é‡ä¸Šã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides vector by vector."
-msgstr ""
+msgstr "å°†å‘é‡é™¤ä»¥å‘é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by vector."
-msgstr ""
+msgstr "把å‘é‡ä¹˜ä»¥å‘é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two vectors."
-msgstr ""
+msgstr "返回两个å‘é‡çš„余数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts vector from vector."
-msgstr ""
+msgstr "从å‘é‡ä¸­å‡åŽ»å‘é‡ã€‚"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8621,6 +8737,8 @@ msgid ""
"output ports. This is a direct injection of code into the vertex/fragment/"
"light function, do not use it to write the function declarations inside."
msgstr ""
+"自定义Godotç€è‰²å™¨è¯­è¨€è¡¨è¾¾å¼ï¼Œå…·æœ‰è‡ªå®šä¹‰çš„è¾“å…¥å’Œè¾“å‡ºç«¯å£æ•°é‡ã€‚这是一个直接注入"
+"代ç åˆ°é¡¶ç‚¹/片段/光函数,ä¸è¦ä½¿ç”¨å®ƒåœ¨å†…部写入函数声明。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8629,6 +8747,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -8840,6 +8965,10 @@ msgid "Export templates for this platform are missing:"
msgstr "没有下列平å°çš„导出模æ¿:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "管ç†å¯¼å‡ºæ¨¡æ¿"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "导出为调试"
@@ -8995,6 +9124,15 @@ msgid "Unnamed Project"
msgstr "未命å项目"
#: editor/project_manager.cpp
+#, fuzzy
+msgid "Missing Project"
+msgstr "导入现有项目"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
msgstr "无法打开ä½äºŽâ€œ%sâ€çš„相应项目."
@@ -9085,8 +9223,8 @@ msgstr "移除此项目(项目的文件ä¸å—å½±å“)"
#: editor/project_manager.cpp
#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr "移除此项目(项目的文件ä¸å—å½±å“)"
#: editor/project_manager.cpp
@@ -9110,8 +9248,9 @@ msgid "Project Manager"
msgstr "项目管ç†å™¨"
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr "项目列表"
+#, fuzzy
+msgid "Projects"
+msgstr "项目"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9135,10 +9274,6 @@ msgid "Templates"
msgstr "模æ¿"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "退出"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr "ç«‹å³é‡æ–°å¯åЍ"
@@ -9480,6 +9615,10 @@ msgstr "区域:"
msgid "AutoLoad"
msgstr "自动加载(AutoLoad)"
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "æ’ä»¶"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr "置零"
@@ -9532,14 +9671,6 @@ msgstr "选择虚方法"
msgid "Select Method"
msgstr "选择方法"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr "无法执行PVRTC工具:"
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr "无法加载使用PVRTC工具转æ¢çš„图片:"
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "批é‡é‡å‘½å"
@@ -9831,6 +9962,11 @@ msgid "Remove Node(s)"
msgstr "移除节点"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "更改输入åç§°"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -9954,24 +10090,27 @@ msgid "Node configuration warning:"
msgstr "节点é…置警告:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
"节点具有信å·è¿žæŽ¥å’Œåˆ†ç»„。\n"
"å•å‡»ä»¥æ˜¾ç¤ºä¿¡å·æŽ¥å£ã€‚"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
"节点有信å·è¿žæŽ¥ã€‚\n"
"å•å‡»æŸ¥çœ‹ä¿¡å·æ ã€‚"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
"分组中的节点。\n"
@@ -10078,6 +10217,11 @@ msgid "Error loading script from %s"
msgstr "从%s加载脚本出错"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "覆盖"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "N/A"
@@ -10275,6 +10419,10 @@ msgid "Change Shortcut"
msgstr "æ›´æ”¹å¿«æ·æ–¹å¼"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "编辑器设置"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "å¿«æ·é”®"
@@ -10688,10 +10836,30 @@ msgid "Set Variable Type"
msgstr "设置å˜é‡ç±»åž‹"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "与引擎内置类型å称冲çªã€‚"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "新建一个四边形。"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "å˜é‡ï¼š"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "新建一个四边形。"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "创建新多边形。"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr "åç§°ä¸æ˜¯æœ‰æ•ˆçš„æ ‡è¯†ç¬¦ï¼š"
@@ -10877,10 +11045,6 @@ msgid "Cut Nodes"
msgstr "剪切节点"
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "粘贴节点"
-
-#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
msgstr "编辑æˆå‘˜"
@@ -11607,8 +11771,9 @@ msgid "Pick a color from the screen."
msgstr "从å±å¹•中选择一ç§é¢œè‰²ã€‚"
#: scene/gui/color_picker.cpp
+#, fuzzy
msgid "HSV"
-msgstr ""
+msgstr "HSV"
#: scene/gui/color_picker.cpp
#, fuzzy
@@ -11695,30 +11860,13 @@ msgstr ""
"示其内容,使其æˆä¸ºå­æŽ§ä»¶çš„æ‰€ä»¥å®ƒå¯ä»¥æœ‰ä¸€ä¸ªå°ºå¯¸å¤§å°å€¼ã€‚å¦åˆ™è¯·è®¾ç½®ä¸ºRender "
"target,并将其内部纹ç†åˆ†é…给一些节点以显示。"
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "åˆå§‹åŒ–FreeType出错。"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "未知的字体格å¼ã€‚"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "加载字体出错。"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "字体大å°éžæ³•。"
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr "输入"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for preview."
-msgstr "éžæ³•çš„ç€è‰²å™¨æºã€‚"
+msgstr "预览的æºèµ„æºæ— æ•ˆã€‚"
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
@@ -11727,7 +11875,7 @@ msgstr "éžæ³•çš„ç€è‰²å™¨æºã€‚"
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid comparison function for that type."
-msgstr "éžæ³•çš„ç€è‰²å™¨æºã€‚"
+msgstr "该类型的比较函数无效。"
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
@@ -11745,6 +11893,103 @@ msgstr "å˜é‡åªèƒ½åœ¨é¡¶ç‚¹å‡½æ•°ä¸­æŒ‡å®šã€‚"
msgid "Constants cannot be modified."
msgstr "ä¸å…许修改常é‡ã€‚"
+#~ msgid "No Matches"
+#~ msgstr "无匹é…项"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr "无法以å¯å†™æ–¹å¼æ‰“å¼€file_type_cache.cchï¼"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "因为文件系统没找到文件,ä¸èƒ½å®šä½åˆ°'%s'ï¼"
+
+#~ msgid "Error loading image:"
+#~ msgstr "加载图片出错:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "å›¾ç‰‡ä¸­æ²¡æœ‰é€æ˜Žåº¦> 128çš„åƒç´ ..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "çˆ¶çº§æ²¡æœ‰å®žä½“é¢æ¥å¡«å……。"
+
+#~ msgid "Couldn't map area."
+#~ msgstr "无法绘制区域。"
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "é¢ä¸å«æœ‰åŒºåŸŸï¼"
+
+#~ msgid "No faces!"
+#~ msgstr "没有é¢ï¼"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "错误:无法加载文件。"
+
+#~ msgid "Error could not load file."
+#~ msgstr "错误,无法加载文件。"
+
+#~ msgid "Doppler Enable"
+#~ msgstr "å¯ç”¨å¤šæ™®å‹’效应"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "é€‰æ‹©æ¨¡å¼ (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "移动模å¼ï¼ˆW)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "旋转模å¼ï¼ˆE)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "缩放模å¼ï¼ˆR)"
+
+#~ msgid "Local Coords"
+#~ msgstr "æœ¬åœ°åæ ‡"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "å¸é™„æ¨¡å¼ (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "选择工具"
+
+#~ msgid "Tool Move"
+#~ msgstr "移动工具"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "旋转工具"
+
+#~ msgid "Tool Scale"
+#~ msgstr "缩放工具"
+
+#, fuzzy
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr "移除此项目(项目的文件ä¸å—å½±å“)"
+
+#~ msgid "Project List"
+#~ msgstr "项目列表"
+
+#~ msgid "Exit"
+#~ msgstr "退出"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "无法执行PVRTC工具:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr "无法加载使用PVRTC工具转æ¢çš„图片:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "åˆå§‹åŒ–FreeType出错。"
+
+#~ msgid "Unknown font format."
+#~ msgstr "未知的字体格å¼ã€‚"
+
+#~ msgid "Error loading font."
+#~ msgstr "加载字体出错。"
+
+#~ msgid "Invalid font size."
+#~ msgstr "字体大å°éžæ³•。"
+
#~ msgid "Previous Folder"
#~ msgstr "上一个文件夹"
@@ -12344,9 +12589,6 @@ msgstr "ä¸å…许修改常é‡ã€‚"
#~ msgid "Erase selection"
#~ msgstr "擦除选中"
-#~ msgid "Could not find tile:"
-#~ msgstr "找ä¸åˆ°ç –å—:"
-
#~ msgid "Item name or ID:"
#~ msgstr "项目å称或ID:"
@@ -12610,9 +12852,6 @@ msgstr "ä¸å…许修改常é‡ã€‚"
#~ msgid "Info"
#~ msgstr "ä¿¡æ¯"
-#~ msgid "Re-Import..."
-#~ msgstr "釿–°å¯¼å…¥..."
-
#~ msgid "No bit masks to import!"
#~ msgstr "没有è¦å¯¼å…¥çš„bit masksï¼"
@@ -13002,9 +13241,6 @@ msgstr "ä¸å…许修改常é‡ã€‚"
#~ msgid "Stereo"
#~ msgstr "立体声"
-#~ msgid "Window"
-#~ msgstr "窗å£"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "缩放到%s%%。"
@@ -13239,9 +13475,6 @@ msgstr "ä¸å…许修改常é‡ã€‚"
#~ msgid "Add Image Group"
#~ msgstr "添加图片分组"
-#~ msgid "Delete Image Group"
-#~ msgstr "删除图片分组"
-
#~ msgid "Project Export Settings"
#~ msgstr "项目导出设置"
@@ -13326,9 +13559,6 @@ msgstr "ä¸å…许修改常é‡ã€‚"
#~ msgid "Export Project PCK"
#~ msgstr "导出项目PCK文件"
-#~ msgid "Export..."
-#~ msgstr "导出..."
-
#~ msgid "Project Export"
#~ msgstr "项目导出"
@@ -13404,9 +13634,6 @@ msgstr "ä¸å…许修改常é‡ã€‚"
#~ msgid "Deploy File Server Clients"
#~ msgstr "部署文件æœåŠ¡å®¢æˆ·ç«¯"
-#~ msgid "Group Editor"
-#~ msgstr "分组编辑"
-
#~ msgid "Keep Existing, Merge with New"
#~ msgstr "ä¿ç•™å·²æœ‰ï¼Œä¸Žæ–°çš„åˆå¹¶ã€‚"
diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po
index 6946008e81..89e0d28fcf 100644
--- a/editor/translations/zh_HK.po
+++ b/editor/translations/zh_HK.po
@@ -59,7 +59,6 @@ msgid "On call to '%s':"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr ""
@@ -696,17 +695,18 @@ msgid "Line Number:"
msgstr "行數:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr ""
+#, fuzzy
+msgid "Replaced %d occurrence(s)."
+msgstr "å–代了 %d 個。"
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "沒有相åŒ"
+msgid "%d match."
+msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/editor_help.cpp
#, fuzzy
-msgid "Replaced %d occurrence(s)."
-msgstr "å–代了 %d 個。"
+msgid "%d matches."
+msgstr "沒有相åŒ"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -945,8 +945,7 @@ msgstr "最愛:"
msgid "Recent:"
msgstr "最近:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -1041,7 +1040,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
#, fuzzy
msgid "Cannot remove:"
msgstr "無法移除:\n"
@@ -1079,7 +1078,7 @@ msgstr ""
msgid "Show Dependencies"
msgstr ""
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr ""
@@ -1174,14 +1173,14 @@ msgstr "æŽˆæ¬Šæ¢æ¬¾"
#: editor/editor_about.cpp
#, fuzzy
-msgid "Thirdparty License"
+msgid "Third-party Licenses"
msgstr "ç¬¬ä¸‰æ–¹æŽˆæ¬Šæ¢æ¬¾"
#: editor/editor_about.cpp
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
@@ -1201,7 +1200,7 @@ msgid "Licenses"
msgstr "æŽˆæ¬Šæ¢æ¬¾"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1732,12 +1731,11 @@ msgid "New"
msgstr ""
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "å°Žå…¥"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "匯出"
@@ -2173,6 +2171,10 @@ msgstr "清空"
msgid "Clear Output"
msgstr "下一個腳本"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr ""
@@ -2487,6 +2489,15 @@ msgid "Pick a Main Scene"
msgstr "鏿“‡ä¸»å ´æ™¯"
#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "關閉場景"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "關閉場景"
+
+#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
@@ -2593,6 +2604,11 @@ msgstr "é‹è¡Œå ´æ™¯"
msgid "Close Tab"
msgstr "關閉"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "關閉"
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr ""
@@ -2687,6 +2703,10 @@ msgstr ""
msgid "Open Scene..."
msgstr "開啓場景"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "開啓最近的"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "儲存場景"
@@ -2697,14 +2717,6 @@ msgid "Save All Scenes"
msgstr "儲存所有場景"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "關閉場景"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "開啓最近的"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "轉為..."
@@ -2734,26 +2746,37 @@ msgstr ""
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "專案"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "專案設定"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "工具"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "匯出"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
msgid "Open Project Data Folder"
msgstr "開啟 Project Manager?"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "工具"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "把資æºå¦å­˜ç‚º..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2834,12 +2857,13 @@ msgid ""
"filesystem."
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "編輯器"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "編輯器設定"
#: editor/editor_node.cpp
@@ -2881,14 +2905,15 @@ msgstr "編輯器設定"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "管ç†è¼¸å‡ºç¯„本"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "管ç†è¼¸å‡ºç¯„本"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "幫助"
@@ -2896,12 +2921,13 @@ msgstr "幫助"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "æœå°‹"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
#, fuzzy
msgid "Online Docs"
msgstr "關閉場景"
@@ -3361,7 +3387,7 @@ msgstr ""
#: editor/export_template_manager.cpp
#, fuzzy
-msgid "Re-Download"
+msgid "Redownload"
msgstr "釿–°ä¸‹è¼‰"
#: editor/export_template_manager.cpp
@@ -3378,6 +3404,10 @@ msgid "Download"
msgstr "下載"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr ""
@@ -3443,13 +3473,11 @@ msgid "No response."
msgstr "沒有回應。"
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Request Failed."
msgstr "請求失敗。"
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr ""
@@ -3464,14 +3492,19 @@ msgid "Download Complete."
msgstr "下載出ç¾éŒ¯èª¤"
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "無法移除:\n"
+
+#: editor/export_template_manager.cpp
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr ""
#: editor/export_template_manager.cpp
#, fuzzy
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr "請求時出ç¾éŒ¯èª¤"
#: editor/export_template_manager.cpp
@@ -3569,20 +3602,12 @@ msgstr "移除é¸é …"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "最愛:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3618,15 +3643,15 @@ msgid "Provided name contains invalid characters."
msgstr "有效字符:"
#: editor/filesystem_dock.cpp
+msgid "A file or folder with this name already exists."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Name contains invalid characters."
msgstr "有效字符:"
#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Renaming file:"
msgstr "儲存TileSet時出ç¾éŒ¯èª¤ï¼"
@@ -3692,6 +3717,11 @@ msgstr "複製"
msgid "Move To..."
msgstr "æ¬åˆ°..."
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "新增場景"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3762,6 +3792,11 @@ msgstr ""
msgid "Overwrite"
msgstr ""
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "儲存場景"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
@@ -3831,6 +3866,14 @@ msgid "Search complete"
msgstr "在幫助檔æœå°‹"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "錯誤:動畫å稱已存在ï¼"
@@ -3840,12 +3883,22 @@ msgstr "錯誤:動畫å稱已存在ï¼"
msgid "Invalid group name."
msgstr "無效å稱"
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "專案"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "刪除佈局"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+msgid "Nodes Not in Group"
msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3859,12 +3912,13 @@ msgid "Nodes in Group"
msgstr ""
#: editor/groups_editor.cpp
-msgid "Add to Group"
+msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
+#, fuzzy
+msgid "Group Editor"
+msgstr "開啟資料夾"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -4081,7 +4135,7 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
@@ -4882,10 +4936,6 @@ msgid "View Files"
msgstr "檔案"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr ""
@@ -4898,15 +4948,47 @@ msgid "No response from host:"
msgstr "主機沒有回應:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Request failed, return code:"
msgstr "請求失敗,"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "請求失敗。"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "無法移除:\n"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "請求失敗,"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "時間:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4989,8 +5071,13 @@ msgid "All"
msgstr "全部"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "å°Žå…¥"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "æ’ä»¶"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -5012,8 +5099,9 @@ msgid "Site:"
msgstr "地å€:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
-msgstr ""
+#, fuzzy
+msgid "Support"
+msgstr "å°Žå…¥"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Official"
@@ -5024,6 +5112,11 @@ msgid "Testing"
msgstr "測試"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "載入"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Assets ZIP 檔"
@@ -5192,6 +5285,11 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "é‹è¡Œå ´æ™¯"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "é‹è¡Œå ´æ™¯"
@@ -5222,6 +5320,7 @@ msgid "Zoom Reset"
msgstr "縮å°"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "鏿“‡æ¨¡å¼"
@@ -5242,14 +5341,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "移動模å¼"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "鏿“‡æ¨¡å¼"
@@ -5274,6 +5376,7 @@ msgid "Toggle snapping."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
@@ -5291,11 +5394,6 @@ msgid "Use Rotation Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
@@ -5308,6 +5406,11 @@ msgid "Smart Snapping"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
msgstr ""
@@ -5524,16 +5627,6 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5855,14 +5948,6 @@ msgid "Surface source is invalid (no faces)."
msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
@@ -5947,19 +6032,23 @@ msgid "Generation Time (sec):"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
+msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+msgid "The geometry doesn't contain any faces."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
+msgid "\"%s\" doesn't contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -6301,7 +6390,6 @@ msgid "Grid Settings"
msgstr "設定"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6411,12 +6499,7 @@ msgstr "儲存TileSet時出ç¾éŒ¯èª¤ï¼"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "無法新增資料夾"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "無法新增資料夾"
#: editor/plugins/script_editor_plugin.cpp
@@ -6446,7 +6529,7 @@ msgstr "載入錯誤:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "新增資料夾"
#: editor/plugins/script_editor_plugin.cpp
@@ -6533,6 +6616,11 @@ msgid "Open..."
msgstr "開啟"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "下一個腳本"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
@@ -6574,13 +6662,13 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Close Docs"
-msgstr "關閉場景"
+msgid "Close All"
+msgstr "關閉"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Close All"
-msgstr "關閉"
+msgid "Close Docs"
+msgstr "關閉場景"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
@@ -6671,6 +6759,11 @@ msgstr ""
msgid "Search Results"
msgstr "在幫助檔æœå°‹"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "關閉場景"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6744,6 +6837,7 @@ msgid "Syntax Highlighter"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6781,26 +6875,6 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "全螢幕"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "跳到下一步"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "跳到上一步"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "移除é¸é …"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Fold/Unfold Line"
msgstr "跳到行"
@@ -6821,6 +6895,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "縮放selection"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6839,32 +6918,37 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
+msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "ç¯©é¸æª”案..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "跳到下一步"
+msgid "Toggle Bookmark"
+msgstr "全螢幕"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "跳到上一步"
+msgid "Go to Next Bookmark"
+msgstr "跳到下一步"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "跳到上一步"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "ç¯©é¸æª”案..."
+msgid "Remove All Bookmarks"
+msgstr "移除é¸é …"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6877,9 +6961,24 @@ msgid "Go to Line..."
msgstr "跳到行"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
msgstr ""
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "跳到下一步"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "跳到上一步"
+
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
@@ -7125,8 +7224,9 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "啟用多普拉效應"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "更改動畫長度"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -7181,9 +7281,8 @@ msgid "Snap Nodes To Floor"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Select Mode (Q)"
-msgstr "鏿“‡æ¨¡å¼"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7193,31 +7292,10 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
+msgid "Use Local Space"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap Mode (%s)"
-msgstr "鏿“‡æ¨¡å¼"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr ""
@@ -7260,23 +7338,6 @@ msgstr "åªé™é¸ä¸­"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Tool Select"
-msgstr "所有é¸é …"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Freelook"
msgstr "全螢幕"
@@ -7331,7 +7392,8 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "設定"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7642,10 +7704,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
@@ -7736,11 +7794,11 @@ msgid "Submenu"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 1"
+msgid "Subitem 1"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item 2"
+msgid "Subitem 2"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
@@ -7867,8 +7925,8 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8184,6 +8242,10 @@ msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "新增訊號"
@@ -8271,6 +8333,12 @@ msgid "Duplicate Nodes"
msgstr "複製動畫幀"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "貼上"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "ä¸é¸"
@@ -8280,10 +8348,6 @@ msgid "Visual Shader Input Type Changed"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -8297,6 +8361,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "新增資料夾"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "新增資料夾"
@@ -8659,7 +8728,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8668,7 +8737,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8831,6 +8900,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8856,7 +8929,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8865,7 +8938,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8874,14 +8947,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8926,6 +8999,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9148,6 +9228,10 @@ msgid "Export templates for this platform are missing:"
msgstr ""
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "管ç†è¼¸å‡ºç¯„本"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
@@ -9302,6 +9386,15 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "專案"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't open project at '%s'."
msgstr "ä¸èƒ½é€£æŽ¥ã€‚"
@@ -9374,8 +9467,8 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr ""
#: editor/project_manager.cpp
@@ -9395,8 +9488,9 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "專案"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9421,10 +9515,6 @@ msgid "Templates"
msgstr "移除é¸é …"
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr "離開"
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9771,6 +9861,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "æ’ä»¶"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9828,14 +9922,6 @@ msgstr "鏿“‡æ¨¡å¼"
msgid "Select Method"
msgstr "鏿“‡æ¨¡å¼"
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10137,6 +10223,11 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Change type of node(s)"
+msgstr "動畫變化數值"
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10267,19 +10358,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10378,6 +10469,10 @@ msgid "Error loading script from %s"
msgstr "載入字形出ç¾éŒ¯èª¤"
#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "N/A"
@@ -10578,6 +10673,10 @@ msgid "Change Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "編輯器設定"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr ""
@@ -11004,10 +11103,30 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "有效å稱。"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "新增"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "新增"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "縮放selection"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -11206,11 +11325,6 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
-msgid "Paste Nodes"
-msgstr "貼上"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
msgstr "檔案"
@@ -11958,22 +12072,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr ""
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "字形格å¼ä¸æ˜Ž"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "載入字形出ç¾éŒ¯èª¤"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "無效字型"
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -12010,6 +12108,37 @@ msgid "Constants cannot be modified."
msgstr ""
#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "無法新增資料夾"
+
+#~ msgid "Doppler Enable"
+#~ msgstr "啟用多普拉效應"
+
+#, fuzzy
+#~ msgid "Select Mode (Q)"
+#~ msgstr "鏿“‡æ¨¡å¼"
+
+#, fuzzy
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "鏿“‡æ¨¡å¼"
+
+#, fuzzy
+#~ msgid "Tool Select"
+#~ msgstr "所有é¸é …"
+
+#~ msgid "Exit"
+#~ msgstr "離開"
+
+#~ msgid "Unknown font format."
+#~ msgstr "字形格å¼ä¸æ˜Ž"
+
+#~ msgid "Error loading font."
+#~ msgstr "載入字形出ç¾éŒ¯èª¤"
+
+#~ msgid "Invalid font size."
+#~ msgstr "無效字型"
+
+#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "上一個tab"
@@ -12038,10 +12167,6 @@ msgstr ""
#~ msgstr "縮放selection"
#, fuzzy
-#~ msgid "Build Project"
-#~ msgstr "專案"
-
-#, fuzzy
#~ msgid "View log"
#~ msgstr "檔案"
diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po
index 54c1f74b02..cfda19870f 100644
--- a/editor/translations/zh_TW.po
+++ b/editor/translations/zh_TW.po
@@ -14,12 +14,15 @@
# ken l <macauhome@gmail.com>, 2018.
# Eric K <eric900601@gmail.com>, 2019.
# cnieFIT <dtotncq@gmail.com>, 2019.
+# Bluesir Bruce <a5566740293@gmail.com>, 2019.
+# leela <53352@protonmail.com>, 2019.
+# Kenneth Lo <closer.tw@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-04-25 11:54+0000\n"
-"Last-Translator: cnieFIT <dtotncq@gmail.com>\n"
+"PO-Revision-Date: 2019-08-29 13:35+0000\n"
+"Last-Translator: Kenneth Lo <closer.tw@gmail.com>\n"
"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/"
"godot-engine/godot/zh_Hant/>\n"
"Language: zh_TW\n"
@@ -27,7 +30,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.7-dev\n"
+"X-Generator: Weblate 3.9-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -69,7 +72,6 @@ msgid "On call to '%s':"
msgstr "調用“%sâ€æ™‚:"
#: editor/animation_bezier_editor.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
msgstr "释放"
@@ -86,9 +88,8 @@ msgid "Time:"
msgstr "時間:"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Value:"
-msgstr "數值"
+msgstr "數值:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
@@ -320,19 +321,18 @@ msgid "Delete Key(s)"
msgstr "刪除動畫關éµç•«æ ¼"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Update Mode"
-msgstr "改變字典 value"
+msgstr "變更動畫更新模å¼"
#: editor/animation_track_editor.cpp
#, fuzzy
msgid "Change Animation Interpolation Mode"
-msgstr "改變字典 value"
+msgstr "è®Šæ›´å‹•ç•«å…§æ’æ¨¡å¼"
#: editor/animation_track_editor.cpp
#, fuzzy
msgid "Change Animation Loop Mode"
-msgstr "變更動畫迴圈"
+msgstr "變更動畫循環模å¼"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -344,7 +344,7 @@ msgstr "為 %s 新增動畫軌並æ’入畫格?"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
-msgstr "創建 %d 個動畫軌並æ’入畫格?"
+msgstr "新增 %d 個動畫軌並æ’入畫格?"
#: editor/animation_track_editor.cpp editor/create_dialog.cpp
#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
@@ -370,9 +370,8 @@ msgid "Anim Create & Insert"
msgstr "新增/æ’入動畫"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Insert Track & Key"
-msgstr "動畫新增軌跡與按éµ"
+msgstr "動畫新增軌跡與畫格"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
@@ -398,7 +397,11 @@ msgid ""
"-AudioStreamPlayer\n"
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
-msgstr "音訊曲目åªèƒ½æŒ‡å‘以下類型的節點:"
+msgstr ""
+"音訊軌åªèƒ½æŒ‡å‘以下類型的節點:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
@@ -471,6 +474,7 @@ msgid ""
msgstr "這個é¸é …ä¸é©ç”¨æ–¼è²å¡žçˆ¾ç·¨è¼¯ï¼Œå› ç‚ºå®ƒåªæ˜¯ä¸€å€‹å–®è»Œã€‚"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid ""
"This animation belongs to an imported scene, so changes to imported tracks "
"will not be saved.\n"
@@ -482,10 +486,17 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
+"這個動畫存在於匯入的場景中,因此å°åŒ¯å…¥è»Œæ‰€åšçš„è®Šæ›´ä¸æœƒè¢«å„²å­˜ã€‚\n"
+"\n"
+"若是è¦é–‹å•Ÿã€ŒåŠ å…¥å®¢åˆ¶è»Œã€çš„功能,請在場景的匯入設定中將「動畫 -> 存放ã€è¨­å®š"
+"為\n"
+"「檔案ã€ï¼Œé–‹å•Ÿã€Œå‹•ç•« -> ä¿å­˜å®¢åˆ¶è»Œã€ï¼Œç„¶å¾Œé‡æ–°å…¥åŒ¯å…¥ã€‚\n"
+"或者,你å¯ä»¥åœ¨åŒ¯å…¥æ™‚,將動畫資料匯入單ç¨çš„æª”案之中。"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Warning: Editing imported animation"
-msgstr ""
+msgstr "警告:正在編輯匯入的動畫"
#: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
@@ -517,11 +528,12 @@ msgstr "動畫空間。"
#: editor/animation_track_editor.cpp
msgid "Seconds"
-msgstr ""
+msgstr "ç§’"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "FPS"
-msgstr ""
+msgstr "æ¯ç§’張數"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -681,16 +693,18 @@ msgid "Line Number:"
msgstr "行號:"
#: editor/code_editor.cpp
-msgid "Found %d match(es)."
-msgstr ""
+msgid "Replaced %d occurrence(s)."
+msgstr "å–代了 %d 個。"
#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "No Matches"
-msgstr "ç„¡ç¬¦åˆæ¢ä»¶"
+#, fuzzy
+msgid "%d match."
+msgstr "找到 %d 件符åˆçµæžœã€‚"
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "å–代了 %d 個。"
+#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
+msgid "%d matches."
+msgstr "找到 %d 件符åˆçµæžœã€‚"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -769,9 +783,8 @@ msgid "From Signal:"
msgstr "訊號:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Scene does not contain any script."
-msgstr "節點ä¸åŒ…å«å¹¾ä½•圖形。"
+msgstr "場景中沒有任何的腳本。"
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
@@ -801,7 +814,7 @@ msgstr "é¡å¤–呼å«åƒæ•¸:"
#: editor/connections_dialog.cpp
#, fuzzy
msgid "Advanced"
-msgstr "平衡的"
+msgstr "進階設定"
#: editor/connections_dialog.cpp
#, fuzzy
@@ -811,7 +824,7 @@ msgstr "å»¶é²"
#: editor/connections_dialog.cpp
msgid ""
"Defers the signal, storing it in a queue and only firing it at idle time."
-msgstr ""
+msgstr "延後é€å‡ºè¨Šè™Ÿï¼Œå°‡è¨Šè™Ÿæš«å­˜è‡³ä½‡åˆ—中,等到閒置時å†é€å‡ºã€‚"
#: editor/connections_dialog.cpp
msgid "Oneshot"
@@ -819,12 +832,11 @@ msgstr "一次性"
#: editor/connections_dialog.cpp
msgid "Disconnects the signal after its first emission."
-msgstr ""
+msgstr "第一次é€å‡ºè¨Šè™Ÿå¾Œå³ä¸­æ–·é€£æŽ¥ã€‚"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Cannot connect signal"
-msgstr "連çµè¨Šè™Ÿ:"
+msgstr "無法連接訊號"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
@@ -845,22 +857,20 @@ msgid "Connect"
msgstr "連接"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Signal:"
-msgstr "訊號:"
+msgstr "訊號:"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
-msgstr "連接 '%s' 到 '%s'"
+msgstr "將 '%s' 連接到 '%s'"
#: editor/connections_dialog.cpp
msgid "Disconnect '%s' from '%s'"
msgstr "將 '%s' 從 '%s' 中斷連接"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "將 '%s' 從 '%s' 中斷連接"
+msgstr "中斷所有來自 '%s' 的訊號連接"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -872,42 +882,39 @@ msgid "Disconnect"
msgstr "æ–·ç·š"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect a Signal to a Method"
-msgstr "連çµè¨Šè™Ÿ:"
+msgstr "連接訊號至方法"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection:"
-msgstr "連接..."
+msgstr "編輯連接內容:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "確定è¦å¾žâ€œ%sâ€è¨Šè™Ÿä¸­åˆ é™¤æ‰€æœ‰é€£æŽ¥å—Žï¼Ÿ"
+msgstr "確定è¦åˆ é™¤æ‰€æœ‰ä¾†è‡ª \"%s\" 的訊號連接嗎?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
-msgstr "信號"
+msgstr "訊號"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr "確定è¦åˆ é™¤æ­¤è¨Šè™Ÿçš„æ‰€æœ‰é€£æŽ¥å—Žï¼Ÿ"
+msgstr "確定è¦åˆªé™¤æ‰€æœ‰ä¾†è‡ªæ­¤è¨Šè™Ÿçš„連接嗎?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "æ–·ç·š"
+msgstr "中斷所有連接"
#: editor/connections_dialog.cpp
msgid "Edit..."
msgstr "編輯…"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "方法"
+msgstr "å‰å¾€æ–¹æ³•"
#: editor/create_dialog.cpp
+#, fuzzy
msgid "Change %s Type"
msgstr "變更 %s 尺寸"
@@ -928,8 +935,7 @@ msgstr "我的最愛:"
msgid "Recent:"
msgstr "最近存å–:"
-#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
@@ -957,13 +963,12 @@ msgid "Dependencies For:"
msgstr "ç›¸ä¾æ–¼:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will only take effect when reloaded."
msgstr ""
-"場景 '%s' 已被變更.\n"
-"釿–°è¼‰å…¥æ‰èƒ½ä½¿å…¶ç”Ÿæ•ˆ."
+"場景 '%s' 正在編譯中。\n"
+"éœ€é‡æ–°è¼‰å…¥æ‰èƒ½ä½¿è®Šæ›´ç”Ÿæ•ˆã€‚"
#: editor/dependency_editor.cpp
#, fuzzy
@@ -1032,7 +1037,7 @@ msgstr ""
"刪除這些檔案å¯èƒ½é€ æˆå…¶ä»–資æºç„¡æ³•正常é‹ä½œ\n"
"此動作無法復原, 確定è¦åˆªé™¤å—Ž?"
-#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+#: editor/dependency_editor.cpp
msgid "Cannot remove:"
msgstr "無法移除:"
@@ -1070,7 +1075,7 @@ msgstr "ç¢ºå®šè¦æ°¸ä¹…刪除 %d 個物件 ? (無法復原)"
msgid "Show Dependencies"
msgstr "相ä¾"
-#: editor/dependency_editor.cpp editor/editor_node.cpp
+#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
msgstr "孤立資料管ç†å™¨"
@@ -1165,14 +1170,16 @@ msgid "License"
msgstr "授權"
#: editor/editor_about.cpp
-msgid "Thirdparty License"
+#, fuzzy
+msgid "Third-party Licenses"
msgstr "ç¬¬ä¸‰æ–¹æŽˆæ¬Šæ¢æ¬¾"
#: editor/editor_about.cpp
+#, fuzzy
msgid ""
-"Godot Engine relies on a number of thirdparty free and open source "
+"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such thirdparty components with their "
+"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
"Godot Engine ä¾è³´è‘—許多與 MIT æŽˆæ¬Šæ¢æ¬¾ç›¸å®¹ã€è‡ªç”±é–‹æºçš„第三方函å¼åº«ã€‚以下是這"
@@ -1191,7 +1198,8 @@ msgid "Licenses"
msgstr "授權"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in zip format."
+#, fuzzy
+msgid "Error opening package file, not in ZIP format."
msgstr "é–‹å•Ÿå¥—ä»¶æª”æ¡ˆå‡ºéŒ¯ï¼Œéž zip æ ¼å¼ã€‚"
#: editor/editor_asset_installer.cpp
@@ -1342,7 +1350,7 @@ msgstr "開啟 Audio Bus é…ç½®"
#: editor/editor_audio_buses.cpp
msgid "There is no '%s' file."
-msgstr ""
+msgstr "'%s' 這個檔案ä¸å­˜åœ¨ã€‚"
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
@@ -1416,7 +1424,7 @@ msgstr "無效å稱.ä¸èƒ½è·Ÿå·²ç¶“存在的全局常é‡å稱é‡è¤‡."
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
-msgstr ""
+msgstr "無法使用關éµå­—當作自動載入的å稱。"
#: editor/editor_autoload_settings.cpp
#, fuzzy
@@ -1429,8 +1437,9 @@ msgid "Rename Autoload"
msgstr "釿–°å‘½å Autoload"
#: editor/editor_autoload_settings.cpp
+#, fuzzy
msgid "Toggle AutoLoad Globals"
-msgstr ""
+msgstr "åˆ‡æ› AutoLoad 的全域變數"
#: editor/editor_autoload_settings.cpp
msgid "Move Autoload"
@@ -1496,7 +1505,7 @@ msgstr "正在儲存變更..."
#: editor/editor_data.cpp
msgid "Updating scene..."
-msgstr "更新場景中..."
+msgstr "場景更新中…"
#: editor/editor_data.cpp editor/editor_properties.cpp
#, fuzzy
@@ -1544,7 +1553,7 @@ msgstr "儲存檔案:"
#: editor/editor_export.cpp
msgid "No export template found at the expected path:"
-msgstr ""
+msgstr "åœ¨é æœŸçš„路徑中找ä¸åˆ°åŒ¯å…¥æ¨¡æ¿ï¼š"
#: editor/editor_export.cpp
msgid "Packing"
@@ -1555,20 +1564,27 @@ msgid ""
"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
"Etc' in Project Settings."
msgstr ""
+"使用 GLES2 時,目標平å°è¦æ±‚使用 'ETC' æè³ªå£“縮。請在「專案設定ã€ä¸­é–‹å•Ÿã€ŒåŒ¯å…¥ "
+"Etcã€ã€‚"
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC2' texture compression for GLES3. Enable "
"'Import Etc 2' in Project Settings."
msgstr ""
+"使用 GLES3 時,目標平å°è¦æ±‚使用 'ETC2' æè³ªå£“縮。請在「專案設定ã€ä¸­é–‹å•Ÿã€ŒåŒ¯"
+"å…¥ Etc 2ã€ã€‚"
#: editor/editor_export.cpp
+#, fuzzy
msgid ""
"Target platform requires 'ETC' texture compression for the driver fallback "
"to GLES2.\n"
"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
"Enabled'."
msgstr ""
+"使用「回退至 GLES2ã€çš„驅動器時,目標平å°è¦æ±‚使用 'ETC' 貼圖壓縮。\n"
+"請在「專案設定ã€ä¸­é–‹å•Ÿã€ŒåŒ¯å…¥ Etcã€ï¼Œæˆ–是關閉「開啟驅動器回退ã€é¸é …。"
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1588,7 +1604,7 @@ msgstr "找ä¸åˆ°ç¯„本檔案:"
#: editor/editor_export.cpp
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
-msgstr ""
+msgstr "匯出為 32 ä½å…ƒåŸ·è¡Œæª”時,內嵌的 PCK 大å°ä¸å¾—è¶…éŽ 4 GB。"
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1606,9 +1622,8 @@ msgid "Asset Library"
msgstr "開啟素æå€‰åº«"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Scene Tree Editing"
-msgstr "場景樹 (節點):"
+msgstr "正在編譯場景樹"
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1631,8 +1646,9 @@ msgid "Erase profile '%s'? (no undo)"
msgstr "å–代全部"
#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "Profile must be a valid filename and must not contain '.'"
-msgstr ""
+msgstr "Profile 必須為有效的檔å,而且其中ä¸å¾—åŒ…å« '.' 字元。"
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1640,8 +1656,9 @@ msgid "Profile with this name already exists."
msgstr "具有此å稱的檔或資料夾已存在。"
#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "(Editor Disabled, Properties Disabled)"
-msgstr ""
+msgstr "(編譯已關閉,屬性已關閉)"
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1680,13 +1697,14 @@ msgstr "æœå°‹ Class"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
-msgstr ""
+msgstr "檔案 '%s' 的內容格å¼éŒ¯èª¤ï¼Œä¸­æ­¢åŒ¯å…¥ã€‚"
#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid ""
"Profile '%s' already exists. Remove it first before importing, import "
"aborted."
-msgstr ""
+msgstr "Profile '%s' 已經存在。在匯入的å‰è«‹å…ˆç§»é™¤ã€‚中止匯入。"
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1695,7 +1713,7 @@ msgstr "載入場景時發生錯誤"
#: editor/editor_feature_profile.cpp
msgid "Unset"
-msgstr ""
+msgstr "未設定"
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1713,12 +1731,11 @@ msgid "New"
msgstr "新增"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_manager.cpp
msgid "Import"
msgstr "å°Žå…¥"
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_export.cpp
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
msgstr "輸出"
@@ -2122,8 +2139,9 @@ msgid "Set"
msgstr "集åˆ"
#: editor/editor_inspector.cpp
+#, fuzzy
msgid "Set Multiple:"
-msgstr ""
+msgstr "複數設定:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -2149,6 +2167,10 @@ msgstr "清除"
msgid "Clear Output"
msgstr "輸出:"
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
msgstr "專案輸出失敗,錯誤代碼是 %d。"
@@ -2167,10 +2189,11 @@ msgid "Error saving resource!"
msgstr "儲存資æºéŒ¯èª¤!"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
"This resource can't be saved because it does not belong to the edited scene. "
"Make it unique first."
-msgstr "無法ä¿å­˜æ­¤è³‡æºï¼Œå› ç‚ºå®ƒä¸å±¬æ–¼å·²ç·¨è¼¯çš„場景。先讓它唯一。"
+msgstr "無法儲存此資æºï¼Œå› ç‚ºå®ƒä¸å±¬æ–¼å·²ç·¨è¼¯çš„場景。請先讓它æˆç‚ºå”¯ä¸€ã€‚"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
@@ -2232,16 +2255,18 @@ msgid ""
"This scene can't be saved because there is a cyclic instancing inclusion.\n"
"Please resolve it and then attempt to save again."
msgstr ""
+"嵿¸¬åˆ°æ­¤å ´æ™¯ä¸­æœ‰å¾ªç’°å¯¦ä¾‹åŒ–引入ç¾è±¡ï¼Œå› æ­¤ç„¡æ³•儲存。\n"
+"請先解決此å•題後å†è©¦ä¸€æ¬¡ã€‚"
#: editor/editor_node.cpp
msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
-msgstr ""
+msgstr "無法儲存此場景。å¯èƒ½æœ‰ä¸å®Œæ•´çš„ä¾å­˜é—œä¿‚(實例化或是繼承上的)。"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr "無法覆蓋ä»è™•於打開狀態的場景ï¼"
+msgstr "無法覆寫ä»è™•於開啟狀態的場景ï¼"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -2281,31 +2306,35 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
-"此資æºå±¬æ–¼å·²å°Žå…¥çš„場景, å› æ­¤ä¸å¯ç·¨è¼¯ã€‚\n"
-"請閱讀與導入場景相關的文檔, 以便更好地瞭解此工作æµã€‚"
+"此資æºå±¬æ–¼åŒ¯å…¥çš„場景,因此ä¸å¯ç·¨è¼¯ã€‚\n"
+"請閱讀與匯入場景相關的文件,以便更加瞭解工作æµç¨‹ã€‚"
#: editor/editor_node.cpp
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
msgstr ""
+"此資æºå±¬æ–¼è¢«å¯¦ä¾‹åŒ–或被繼承的場景。\n"
+"儲存場景時,此資æºçš„è®Šæ›´ä¸æœƒè¢«ä¿å­˜ã€‚"
#: editor/editor_node.cpp
msgid ""
"This resource was imported, so it's not editable. Change its settings in the "
"import panel and then re-import."
msgstr ""
+"é€™å€‹è³‡æºæ˜¯åŒ¯å…¥é€²ä¾†çš„ï¼Œå› æ­¤ç„¡æ³•ç·¨è­¯ã€‚è«‹ä¿®æ”¹åŒ¯å…¥æŽ§åˆ¶é¢æ¿ä¸Šçš„設定,å†é‡æ–°åŒ¯å…¥ä¸€"
+"次。"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This scene was imported, so changes to it won't be kept.\n"
"Instancing it or inheriting will allow making changes to it.\n"
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
-"此資æºå±¬æ–¼å·²å°Žå…¥çš„場景, å› æ­¤ä¸å¯ç·¨è¼¯ã€‚\n"
-"請閱讀與導入場景相關的文檔, 以便更好地瞭解此工作æµã€‚"
+"æ­¤å ´æ™¯æ˜¯åŒ¯å…¥é€²ä¾†çš„ï¼Œå› æ­¤è®Šæ›´ä¸æœƒè¢«ä¿å­˜ã€‚\n"
+"需經éŽå¯¦ä¾‹åŒ–或是繼承,æ‰èƒ½è®Šæ›´å…¶å…§å®¹ã€‚\n"
+"請閱讀與匯入場景相關的文件,以便更加瞭解工作æµç¨‹ã€‚"
#: editor/editor_node.cpp
#, fuzzy
@@ -2319,11 +2348,11 @@ msgstr ""
#: editor/editor_node.cpp
msgid "There is no defined scene to run."
-msgstr "沒有è¦é‹è¡Œçš„已定義場景。"
+msgstr "沒有已定義的場景å¯é‹è¡Œã€‚"
#: editor/editor_node.cpp
msgid "Current scene was never saved, please save it prior to running."
-msgstr "在é‹è¡Œå ´æ™¯å‰ï¼Œè«‹å…ˆå­˜æª”。"
+msgstr "ç›®å‰çš„場景從未被儲存,在é‹è¡Œå ´æ™¯å‰è«‹å…ˆå­˜æª”。"
#: editor/editor_node.cpp
msgid "Could not start subprocess!"
@@ -2335,7 +2364,7 @@ msgstr "開啟場景"
#: editor/editor_node.cpp
msgid "Open Base Scene"
-msgstr "打開基本場景"
+msgstr "開啟基本場景"
#: editor/editor_node.cpp
#, fuzzy
@@ -2344,7 +2373,7 @@ msgstr "快速開啟場景..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
-msgstr "快速開啟場景..."
+msgstr "快速開啟場景…"
#: editor/editor_node.cpp
msgid "Quick Open Script..."
@@ -2365,11 +2394,11 @@ msgstr "å·²ä¿å­˜%s個已修改的資æºã€‚"
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
-msgstr "ä¿å­˜å ´æ™¯éœ€è¦æ ¹ç¯€é»žã€‚"
+msgstr "å„²å­˜å ´æ™¯éœ€è¦æ ¹ç¯€é»žã€‚"
#: editor/editor_node.cpp
msgid "Save Scene As..."
-msgstr "å¦å­˜å ´æ™¯ç‚º..."
+msgstr "å¦å­˜å ´æ™¯ç‚ºâ€¦"
#: editor/editor_node.cpp
msgid "No"
@@ -2381,11 +2410,11 @@ msgstr "是"
#: editor/editor_node.cpp
msgid "This scene has never been saved. Save before running?"
-msgstr "此場景尚未存檔, 執行å‰è«‹å…ˆå­˜æª”"
+msgstr "此場景從未被儲存。執行å‰å…ˆå­˜æª”?"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "This operation can't be done without a scene."
-msgstr "在設置場景å‰ï¼Œç„¡æ³•完æˆè©²æŒ‡å®šæ“作。"
+msgstr "這項æ“ä½œå¿…é ˆè¦æœ‰å ´æ™¯å­˜åœ¨ã€‚"
#: editor/editor_node.cpp
msgid "Export Mesh Library"
@@ -2405,11 +2434,11 @@ msgstr "在設置著節點(selected node)å‰ï¼Œç„¡æ³•完æˆè©²æŒ‡å®šæ“作。"
#: editor/editor_node.cpp
msgid "Current scene not saved. Open anyway?"
-msgstr "ç›®å‰çš„場景尚未存檔,ä»è¦é–‹å•Ÿå—Žï¼Ÿ"
+msgstr "ç›®å‰çš„場景尚未儲存。還是è¦é–‹å•Ÿå—Žï¼Ÿ"
#: editor/editor_node.cpp
msgid "Can't reload a scene that was never saved."
-msgstr "ç„¡æ³•é‡æ–°è¼‰å…¥æœªå­˜æª”的場景."
+msgstr "ç„¡æ³•é‡æ–°è¼‰å…¥å¾žæœªå­˜æª”的場景。"
#: editor/editor_node.cpp
msgid "Revert"
@@ -2442,11 +2471,11 @@ msgstr "儲存並離開"
#: editor/editor_node.cpp
msgid "Save changes to the following scene(s) before quitting?"
-msgstr "關閉å‰ï¼Œè¦å„²å­˜ä¿®æ”¹çš„場景嗎?"
+msgstr "退出程å¼å‰ï¼Œè¦å„²å­˜ä»¥ä¸‹ä¿®æ”¹éŽçš„場景嗎?"
#: editor/editor_node.cpp
msgid "Save changes the following scene(s) before opening Project Manager?"
-msgstr "開啟專案管ç†å‰ï¼Œè¦å„²å­˜ä¿®æ”¹çš„場景嗎?"
+msgstr "開啟專案管ç†å‰ï¼Œè¦å„²å­˜ä»¥ä¸‹ä¿®æ”¹éŽçš„場景嗎?"
#: editor/editor_node.cpp
msgid ""
@@ -2456,7 +2485,16 @@ msgstr "ä¸æŽ¨è–¦æ­¤é¸é …ã€‚è¢«å¼·åˆ¶é‡æ–°æ•´ç†çš„æƒ…形,å¯èƒ½æ˜¯å› ç¨‹å¼
#: editor/editor_node.cpp
msgid "Pick a Main Scene"
-msgstr "é¸å–一個主è¦å ´æ™¯"
+msgstr "é¸å–主è¦å ´æ™¯"
+
+#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "關閉場景"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Reopen Closed Scene"
+msgstr "關閉場景"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2490,21 +2528,20 @@ msgid ""
"Scene '%s' was automatically imported, so it can't be modified.\n"
"To make changes to it, a new inherited scene can be created."
msgstr ""
-"場景\"%s\"為自動導入,並ä¸èƒ½è¢«ä¿®æ”¹ã€‚\n"
-"è‹¥è¦é€²è¡Œæ›´æ”¹ï¼Œè«‹å»ºç«‹æ–°çš„場景。"
+"場景 '%s' 為自動匯入的,ä¸èƒ½è¢«ä¿®æ”¹ã€‚\n"
+"è‹¥è¦é€²è¡Œæ›´æ”¹ï¼Œè«‹å»ºç«‹æ–°çš„繼承的場景。"
#: editor/editor_node.cpp
msgid ""
"Error loading scene, it must be inside the project path. Use 'Import' to "
"open the scene, then save it inside the project path."
msgstr ""
-"讀å–場景時發生錯誤,場景必須放置於專案資料夾內。請用「導入ã€é–‹å•Ÿè©²å ´æ™¯å¾Œï¼Œå†"
+"讀å–場景時發生錯誤,場景必須放置於專案資料夾中。請用「導入ã€é–‹å•Ÿè©²å ´æ™¯å¾Œï¼Œå†"
"儲存於專案資料夾。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Scene '%s' has broken dependencies:"
-msgstr "場景 '%s' çš„ä¾å­˜é—œä¿‚已被破壞。"
+msgstr "場景 '%s' çš„ä¾å­˜é—œä¿‚已被破壞:"
#: editor/editor_node.cpp
msgid "Clear Recent Scenes"
@@ -2516,6 +2553,8 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
+"尚未定義主場景。è¦é¸æ“‡ä¸€å€‹å ´æ™¯å—Žï¼Ÿ\n"
+"你之後å¯ä»¥åœ¨ã€Œæ‡‰ç”¨ç¨‹å¼ã€åˆ†é¡žä¸­çš„「專案設定ã€è®Šæ›´é€™è¨­å®šã€‚"
#: editor/editor_node.cpp
msgid ""
@@ -2557,6 +2596,11 @@ msgstr "é‹è¡Œæ­¤å ´æ™¯"
msgid "Close Tab"
msgstr "關閉分é "
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Undo Close Tab"
+msgstr "關閉分é "
+
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
msgstr "關閉其他é¸é …å¡"
@@ -2645,6 +2689,10 @@ msgstr "å¾žç¾æœ‰å ´æ™¯ä¸­å»ºç«‹â€¦"
msgid "Open Scene..."
msgstr "開啟場景…"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "最近開啟的場景"
+
#: editor/editor_node.cpp
msgid "Save Scene"
msgstr "儲存場景"
@@ -2655,14 +2703,6 @@ msgid "Save All Scenes"
msgstr "儲存全部場景"
#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "關閉場景"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "最近開啟的場景"
-
-#: editor/editor_node.cpp
msgid "Convert To..."
msgstr "è½‰æ›æˆâ€¦"
@@ -2692,25 +2732,36 @@ msgstr "æ¢å¾©å ´æ™¯"
msgid "Miscellaneous project or scene-wide tools."
msgstr "其他專案或全螢幕工具。"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Project"
msgstr "專案"
#: editor/editor_node.cpp
-msgid "Project Settings"
+#, fuzzy
+msgid "Project Settings..."
msgstr "專案設定"
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "工具"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Export..."
+msgstr "輸出"
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
msgstr "開啟專案資料夾"
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "工具"
+
#: editor/editor_node.cpp
-msgid "Install Android Build Template"
-msgstr ""
+#, fuzzy
+msgid "Orphan Resource Explorer..."
+msgstr "孤立資料管ç†å™¨"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2797,12 +2848,13 @@ msgstr ""
"啟用此é¸é …後,腳本的所有修改,都會立å³å映於é‹è¡Œä¸­çš„éŠæˆ²ã€‚\n"
"在é ç«¯è£ç½®æ¸¬è©¦æ™‚,é…åˆç¶²è·¯æ–‡ä»¶ç³»çµ±(NFS)使用能更æé«˜æ•ˆçŽ‡ã€‚"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "編輯器"
-#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-msgid "Editor Settings"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Editor Settings..."
msgstr "編輯器設定"
#: editor/editor_node.cpp
@@ -2842,14 +2894,15 @@ msgstr "開啟 編輯器設定 資料夾"
#: editor/editor_node.cpp
#, fuzzy
-msgid "Manage Editor Features"
+msgid "Manage Editor Features..."
msgstr "管ç†è¼¸å‡ºæ¨¡æ¿"
-#: editor/editor_node.cpp editor/project_export.cpp
-msgid "Manage Export Templates"
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Manage Export Templates..."
msgstr "管ç†è¼¸å‡ºæ¨¡æ¿"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
msgstr "幫助"
@@ -2857,12 +2910,13 @@ msgstr "幫助"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
msgid "Search"
msgstr "æœå°‹"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
msgstr "線上文件"
@@ -3311,7 +3365,8 @@ msgid "Import From Node:"
msgstr "從節點導入:"
#: editor/export_template_manager.cpp
-msgid "Re-Download"
+#, fuzzy
+msgid "Redownload"
msgstr "釿–°ä¸‹è¼‰"
#: editor/export_template_manager.cpp
@@ -3328,6 +3383,10 @@ msgid "Download"
msgstr "下載"
#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+
+#: editor/export_template_manager.cpp
msgid "(Missing)"
msgstr "(缺少)"
@@ -3391,12 +3450,10 @@ msgid "No response."
msgstr "沒有回應。"
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
msgstr "請求失敗."
#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
msgstr "釿–°å®šå‘循環."
@@ -3410,14 +3467,20 @@ msgid "Download Complete."
msgstr "下載完æˆã€‚"
#: editor/export_template_manager.cpp
+#, fuzzy
+msgid "Cannot remove temporary file:"
+msgstr "無法將主題ä¿å­˜åˆ°æª”案:"
+
+#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
-"Templates installation failed. The problematic templates archives can be "
-"found at '%s'."
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
msgstr "範本安è£å¤±æ•—。有å•題的範本存檔å¯ä»¥åœ¨ \"%s\" 中找到。"
#: editor/export_template_manager.cpp
#, fuzzy
-msgid "Error requesting url: "
+msgid "Error requesting URL:"
msgstr "載入場景時發生錯誤"
#: editor/export_template_manager.cpp
@@ -3512,20 +3575,12 @@ msgstr "載入場景時發生錯誤"
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr "å¾žæ¸…å–®ä¸­é¸æ“‡é¡åƒ: (Shift + 單擊: 在ç€è¦½å™¨ä¸­æ‰“é–‹)"
-#: editor/file_type_cache.cpp
-msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
-msgstr ""
-
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Favorites"
msgstr "我的最愛:"
#: editor/filesystem_dock.cpp
-msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
@@ -3562,14 +3617,14 @@ msgid "Provided name contains invalid characters."
msgstr "æä¾›çš„å稱包å«ç„¡æ•ˆå­—å…ƒ"
#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "å稱包å«ç„¡æ•ˆå­—元。"
-
-#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
msgstr "具有此å稱的檔或資料夾已存在。"
#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "å稱包å«ç„¡æ•ˆå­—元。"
+
+#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Renaming file:"
msgstr "載入時發生錯誤:"
@@ -3632,6 +3687,11 @@ msgstr "複製動畫關éµç•«æ ¼"
msgid "Move To..."
msgstr "移動到..。"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "New Scene..."
+msgstr "新場景"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
@@ -3702,6 +3762,11 @@ msgstr "æ­¤ä½ç½®å·²å­˜åœ¨åŒå的檔案或資料夾。"
msgid "Overwrite"
msgstr "覆蓋"
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Create Scene"
+msgstr "從場景創建"
+
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "創建腳本"
@@ -3771,6 +3836,14 @@ msgid "Search complete"
msgstr "æœå°‹è©žå½™"
#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "添加到組"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "從群組移除"
+
+#: editor/groups_editor.cpp
#, fuzzy
msgid "Group name already exists."
msgstr "Autoload「%sã€å·²ç¶“存在!"
@@ -3780,12 +3853,23 @@ msgstr "Autoload「%sã€å·²ç¶“存在!"
msgid "Invalid group name."
msgstr "ä¸èƒ½ä½¿ç”¨çš„å稱。"
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Rename Group"
+msgstr "管ç†çµ„"
+
+#: editor/groups_editor.cpp
+#, fuzzy
+msgid "Delete Group"
+msgstr "刪除佈局"
+
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "組"
#: editor/groups_editor.cpp
-msgid "Nodes not in Group"
+#, fuzzy
+msgid "Nodes Not in Group"
msgstr "ä¸åœ¨çµ„中的節點"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
@@ -3799,12 +3883,13 @@ msgid "Nodes in Group"
msgstr "組中的節點"
#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "添加到組"
+msgid "Empty groups will be automatically removed."
+msgstr ""
#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "從群組移除"
+#, fuzzy
+msgid "Group Editor"
+msgstr "開啟腳本編輯器"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -4015,7 +4100,8 @@ msgid "MultiNode Set"
msgstr "多節點集"
#: editor/node_dock.cpp
-msgid "Select a Node to edit Signals and Groups."
+#, fuzzy
+msgid "Select a single node to edit its signals and groups."
msgstr "鏿“‡è¦ç·¨è¼¯è¨Šè™Ÿå’Œçµ„的節點。"
#: editor/plugin_config_dialog.cpp
@@ -4804,10 +4890,6 @@ msgid "View Files"
msgstr "查看檔案"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "無法解æžä¸»æ©Ÿå稱:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
msgstr "連接錯誤, è«‹é‡è©¦ã€‚"
@@ -4820,14 +4902,47 @@ msgid "No response from host:"
msgstr "主機沒有響應:"
#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "無法解æžä¸»æ©Ÿå稱:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
msgstr "請求失敗, 返回代碼:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed."
+msgstr "請求失敗."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Cannot save response to:"
+msgstr "無法將主題ä¿å­˜åˆ°æª”案:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "請求失敗, é‡å®šå‘次數太多"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Redirect loop."
+msgstr "釿–°å®šå‘循環."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Request failed, timeout"
+msgstr "請求失敗, 返回代碼:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Timeout."
+msgstr "時間"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
@@ -4907,8 +5022,13 @@ msgid "All"
msgstr "全部"
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
+#, fuzzy
+msgid "Import..."
+msgstr "å°Žå…¥"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Plugins..."
msgstr "挿件"
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
@@ -4930,7 +5050,8 @@ msgid "Site:"
msgstr "地å€:"
#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support..."
+#, fuzzy
+msgid "Support"
msgstr "支æŒâ€¦"
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -4942,6 +5063,11 @@ msgid "Testing"
msgstr "測試"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
+msgid "Loading..."
+msgstr "載入"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "ZIP資æºåŒ…"
@@ -5110,6 +5236,11 @@ msgstr "粘貼姿勢"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Clear Guides"
+msgstr "清除姿勢"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
msgstr "從節點製作自定義骨骼"
@@ -5139,6 +5270,7 @@ msgid "Zoom Reset"
msgstr "é‡ç½®ç¸®æ”¾"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
msgstr "鏿“‡æ¨¡å¼"
@@ -5159,14 +5291,17 @@ msgid "Alt+RMB: Depth list selection"
msgstr "Alt+滑鼠å³éµ:顯示鼠標點擊ä½ç½®ä¸‹æ‰€æœ‰çš„節點清單"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
msgstr "移動模å¼"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
msgstr "旋轉模å¼"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
msgstr "縮放模å¼"
@@ -5191,6 +5326,7 @@ msgid "Toggle snapping."
msgstr "切æ›å¸é™„。"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr "使用å¸é™„"
@@ -5209,12 +5345,6 @@ msgid "Use Rotation Snap"
msgstr "使用旋轉å¸é™„"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Configure Snap..."
-msgstr "é…ç½®å¸é™„…"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap Relative"
msgstr "相å°å¸é™„"
@@ -5230,6 +5360,12 @@ msgid "Smart Snapping"
msgstr "智慧å¸é™„"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Configure Snap..."
+msgstr "é…ç½®å¸é™„…"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
msgstr "å¸é™„到父級節點"
@@ -5449,16 +5585,6 @@ msgstr "設置控制程åº"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Error loading image:"
-msgstr "åŠ è¼‰å½±åƒæ™‚出錯:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "No pixels with transparency > 128 in image..."
-msgstr "å½±åƒä¸­æ²’æœ‰é€æ˜Žåº¦å¤§æ–¼128的點數…"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
@@ -5783,14 +5909,6 @@ msgid "Surface source is invalid (no faces)."
msgstr "è¡¨é¢æºç„¡æ•ˆï¼ˆæ²’有é¢ï¼‰ã€‚"
#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Parent has no solid faces to populate."
-msgstr "父級沒有è¦å¡«å……的實體é¢ã€‚"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Couldn't map area."
-msgstr "無法映射å€åŸŸã€‚"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr "鏿“‡æºç¶²æ ¼ï¼š"
@@ -5875,20 +5993,27 @@ msgid "Generation Time (sec):"
msgstr "ç”Ÿæˆæ™‚é–“ (ç§’):"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Faces contain no area!"
-msgstr "é¢ä¸åŒ…å«ä»»ä½•å€åŸŸï¼"
+msgid "The geometry's faces don't contain any area."
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "No faces!"
+#, fuzzy
+msgid "The geometry doesn't contain any faces."
+msgstr "節點ä¸åŒ…å«å¹¾ä½•圖形 (é¢)。"
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry."
+#, fuzzy
+msgid "\"%s\" doesn't contain geometry."
msgstr "節點ä¸åŒ…å«å¹¾ä½•圖形。"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Node does not contain geometry (faces)."
-msgstr "節點ä¸åŒ…å«å¹¾ä½•圖形 (é¢)。"
+#, fuzzy
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "節點ä¸åŒ…å«å¹¾ä½•圖形。"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6226,7 +6351,6 @@ msgid "Grid Settings"
msgstr "專案設定"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap"
msgstr ""
@@ -6336,12 +6460,7 @@ msgstr "載入場景時發生錯誤"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error: could not load file."
-msgstr "無法新增資料夾"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error could not load file."
+msgid "Could not load file at:"
msgstr "無法新增資料夾"
#: editor/plugins/script_editor_plugin.cpp
@@ -6370,7 +6489,7 @@ msgstr "載入時發生錯誤:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile..."
+msgid "New Text File..."
msgstr "新增資料夾..."
#: editor/plugins/script_editor_plugin.cpp
@@ -6458,6 +6577,11 @@ msgid "Open..."
msgstr "開啟…"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Reopen Closed Script"
+msgstr "開啟最近存å–"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr "全部ä¿å­˜"
@@ -6497,13 +6621,13 @@ msgid "Save Theme"
msgstr "ä¿å­˜ä¸»é¡Œ"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "關閉檔案"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
msgstr "全部關閉"
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "關閉檔案"
+
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "é‹è¡Œ"
@@ -6593,6 +6717,11 @@ msgstr "調試器"
msgid "Search Results"
msgstr "æœå°‹çµæžœ"
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Recent Scripts"
+msgstr "清除最近開啟的場景"
+
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
@@ -6666,6 +6795,7 @@ msgid "Syntax Highlighter"
msgstr "高亮顯示語法"
#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
msgstr ""
@@ -6703,26 +6833,6 @@ msgstr "åˆ‡æ›æ³¨é‡‹"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "切æ›è‡ªç”±è§€å¯Ÿæ¨¡å¼"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Next Bookmark"
-msgstr "轉到下一個中斷點"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Go to Previous Bookmark"
-msgstr "轉到上一個中斷點"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "删除所有項目"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Fold/Unfold Line"
msgstr "å‰å¾€ç¬¬...行"
@@ -6743,6 +6853,11 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Evaluate Selection"
+msgstr "縮放所é¸"
+
+#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
@@ -6761,32 +6876,37 @@ msgid "Auto Indent"
msgstr "自動縮進"
#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "設置中斷點"
+msgid "Find Previous"
+msgstr "查找上一個"
#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "刪除所有中斷點"
+#, fuzzy
+msgid "Find in Files..."
+msgstr "在檔中查找..。"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Next Breakpoint"
-msgstr "轉到下一個中斷點"
+msgid "Toggle Bookmark"
+msgstr "切æ›è‡ªç”±è§€å¯Ÿæ¨¡å¼"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Go to Previous Breakpoint"
-msgstr "轉到上一個中斷點"
+msgid "Go to Next Bookmark"
+msgstr "轉到下一個中斷點"
#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "查找上一個"
+#, fuzzy
+msgid "Go to Previous Bookmark"
+msgstr "轉到上一個中斷點"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in Files..."
-msgstr "在檔中查找..。"
+msgid "Remove All Bookmarks"
+msgstr "删除所有項目"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
@@ -6798,8 +6918,23 @@ msgid "Go to Line..."
msgstr "å‰å¾€ç¬¬...行"
#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr ""
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "設置中斷點"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "刪除所有中斷點"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "轉到下一個中斷點"
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "轉到上一個中斷點"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -7041,8 +7176,9 @@ msgid "Audio Listener"
msgstr "音訊監è½å™¨"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Doppler Enable"
-msgstr "啟用多普拉效應"
+#, fuzzy
+msgid "Enable Doppler"
+msgstr "啟用篩é¸"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
@@ -7095,9 +7231,8 @@ msgid "Snap Nodes To Floor"
msgstr "å°‡ç¯€é»žæ•æ‰åˆ°åœ°é¢"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Select Mode (Q)"
-msgstr "鏿“‡æ¨¡å¼ (Q)"
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7107,30 +7242,11 @@ msgid ""
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode (W)"
-msgstr "ç§»å‹•æ¨¡å¼ (W)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode (E)"
-msgstr "æ—‹è½‰æ¨¡å¼ (E)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode (R)"
-msgstr "ç¸®æ”¾æ¨¡å¼ (R)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Coords"
-msgstr "æœ¬åœ°åæ¨™"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Local Space Mode (%s)"
+#, fuzzy
+msgid "Use Local Space"
msgstr "本地空間模å¼ï¼ˆ%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Mode (%s)"
-msgstr "æ•æ‰æ¨¡å¼ (%s)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
msgstr "底部視圖"
@@ -7172,23 +7288,6 @@ msgid "Focus Selection"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Tool Select"
-msgstr "工具鏿“‡"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Move"
-msgstr "工具移動"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Rotate"
-msgstr "工具旋轉"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Tool Scale"
-msgstr "縮放工具"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "切æ›è‡ªç”±è§€å¯Ÿæ¨¡å¼"
@@ -7244,7 +7343,8 @@ msgstr "顯示網格"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings"
+#, fuzzy
+msgid "Settings..."
msgstr "設定"
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7561,10 +7661,6 @@ msgid "TextureRegion"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-msgid "Can't save theme to file:"
-msgstr "無法將主題ä¿å­˜åˆ°æª”案:"
-
-#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr "添加所有項目"
@@ -7655,12 +7751,12 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 1"
+msgid "Subitem 1"
msgstr "é …ç›®"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
-msgid "Item 2"
+msgid "Subitem 2"
msgstr "é …ç›®"
#: editor/plugins/theme_editor_plugin.cpp
@@ -7783,8 +7879,8 @@ msgstr "繪製ç£è²¼"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
-"Shift+RMB: Line Draw\n"
-"Shift+Ctrl+RMB: Rectangle Paint"
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
@@ -8094,6 +8190,10 @@ msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Add input +"
msgstr "添加輸入"
@@ -8182,6 +8282,11 @@ msgid "Duplicate Nodes"
msgstr "複製節點"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
msgstr "刪除"
@@ -8191,10 +8296,6 @@ msgid "Visual Shader Input Type Changed"
msgstr "視覺著色器輸入類型已更改"
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "頂點"
@@ -8209,6 +8310,11 @@ msgstr "燈光"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
+msgid "Show resulted shader code."
+msgstr "創建節點"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Create Shader Node"
msgstr "創建節點"
@@ -8576,7 +8682,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8585,7 +8691,7 @@ msgstr ""
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8749,6 +8855,10 @@ msgid "Linear interpolation between two vectors."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
msgstr ""
@@ -8774,7 +8884,7 @@ msgstr ""
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8783,7 +8893,7 @@ msgstr ""
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than "
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
@@ -8792,14 +8902,14 @@ msgstr ""
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -8844,6 +8954,13 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which placed on top of the resulted "
+"shader. You can place various function definitions inside and call it later "
+"in the Expressions. You can also declare varyings, uniforms and constants."
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
@@ -9056,6 +9173,10 @@ msgid "Export templates for this platform are missing:"
msgstr "缺少此平臺的導出範本:"
#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "管ç†è¼¸å‡ºæ¨¡æ¿"
+
+#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "導出為調試"
@@ -9206,8 +9327,16 @@ msgstr "未命åé …ç›®"
#: editor/project_manager.cpp
#, fuzzy
+msgid "Missing Project"
+msgstr "å°Žå…¥ç¾æœ‰é …ç›®"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr ""
+
+#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
-msgstr "ç„¡æ³•æ‰“é–‹ä½æ–¼â€œ%sâ€çš„項目。"
+msgstr "ç„¡æ³•æ‰“é–‹ä½æ–¼'%s'的項目。"
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -9293,8 +9422,8 @@ msgstr "是å¦å¾žæ¸…單中删除項目?(資料夾內容將ä¸è¢«ä¿®æ”¹ï¼‰"
#: editor/project_manager.cpp
#, fuzzy
msgid ""
-"Remove all missing projects from the list? (Folders contents will not be "
-"modified)"
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
msgstr "是å¦å¾žæ¸…單中删除項目?(資料夾內容將ä¸è¢«ä¿®æ”¹ï¼‰"
#: editor/project_manager.cpp
@@ -9314,8 +9443,9 @@ msgid "Project Manager"
msgstr ""
#: editor/project_manager.cpp
-msgid "Project List"
-msgstr ""
+#, fuzzy
+msgid "Projects"
+msgstr "專案"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9339,10 +9469,6 @@ msgid "Templates"
msgstr ""
#: editor/project_manager.cpp
-msgid "Exit"
-msgstr ""
-
-#: editor/project_manager.cpp
msgid "Restart Now"
msgstr ""
@@ -9687,6 +9813,10 @@ msgstr ""
msgid "AutoLoad"
msgstr ""
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "挿件"
+
#: editor/property_editor.cpp
msgid "Zero"
msgstr ""
@@ -9739,14 +9869,6 @@ msgstr ""
msgid "Select Method"
msgstr ""
-#: editor/pvrtc_compress.cpp
-msgid "Could not execute PVRTC tool:"
-msgstr ""
-
-#: editor/pvrtc_compress.cpp
-msgid "Can't load back converted image using PVRTC tool:"
-msgstr ""
-
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
@@ -10047,6 +10169,10 @@ msgid "Remove Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
@@ -10176,19 +10302,19 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connection(s) and group(s).\n"
+"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node has connections.\n"
+"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
#: editor/scene_tree_editor.cpp
msgid ""
-"Node is in group(s).\n"
+"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
@@ -10287,6 +10413,11 @@ msgid "Error loading script from %s"
msgstr ""
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Overrides"
+msgstr "覆蓋"
+
+#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
@@ -10491,6 +10622,10 @@ msgid "Change Shortcut"
msgstr "æ·å¾‘"
#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "編輯器設定"
+
+#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
msgstr "æ·å¾‘"
@@ -10930,10 +11065,30 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Override an existing built-in function."
+msgstr "無效å稱.ä¸èƒ½èˆ‡ç¾æœ‰çš„內置類型å稱沖çª."
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new function."
+msgstr "創建新矩形。"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new variable."
+msgstr "創建新矩形。"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Create a new signal."
+msgstr "創建新多邊形。"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
msgstr ""
@@ -11122,10 +11277,6 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Edit Member"
msgstr "éŽæ¿¾æª”案..."
@@ -11891,22 +12042,6 @@ msgid ""
"texture to some node for display."
msgstr ""
-#: scene/resources/dynamic_font.cpp
-msgid "Error initializing FreeType."
-msgstr "åˆå§‹åŒ– FreeType 錯誤。"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Unknown font format."
-msgstr "未知的字體格å¼ã€‚"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Error loading font."
-msgstr "讀å–字體錯誤。"
-
-#: scene/resources/dynamic_font.cpp
-msgid "Invalid font size."
-msgstr "無效的字體大å°ã€‚"
-
#: scene/resources/visual_shader.cpp
msgid "Input"
msgstr ""
@@ -11942,6 +12077,81 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "No Matches"
+#~ msgstr "ç„¡ç¬¦åˆæ¢ä»¶"
+
+#~ msgid "Error loading image:"
+#~ msgstr "åŠ è¼‰å½±åƒæ™‚出錯:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "å½±åƒä¸­æ²’æœ‰é€æ˜Žåº¦å¤§æ–¼128的點數…"
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "父級沒有è¦å¡«å……的實體é¢ã€‚"
+
+#~ msgid "Couldn't map area."
+#~ msgstr "無法映射å€åŸŸã€‚"
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "é¢ä¸åŒ…å«ä»»ä½•å€åŸŸï¼"
+
+#, fuzzy
+#~ msgid "Error: could not load file."
+#~ msgstr "無法新增資料夾"
+
+#~ msgid "Doppler Enable"
+#~ msgstr "啟用多普拉效應"
+
+#, fuzzy
+#~ msgid "Select Mode (Q)"
+#~ msgstr "鏿“‡æ¨¡å¼ (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "ç§»å‹•æ¨¡å¼ (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "æ—‹è½‰æ¨¡å¼ (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "ç¸®æ”¾æ¨¡å¼ (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "æœ¬åœ°åæ¨™"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "æ•æ‰æ¨¡å¼ (%s)"
+
+#, fuzzy
+#~ msgid "Tool Select"
+#~ msgstr "工具鏿“‡"
+
+#~ msgid "Tool Move"
+#~ msgstr "工具移動"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "工具旋轉"
+
+#~ msgid "Tool Scale"
+#~ msgstr "縮放工具"
+
+#, fuzzy
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr "是å¦å¾žæ¸…單中删除項目?(資料夾內容將ä¸è¢«ä¿®æ”¹ï¼‰"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "åˆå§‹åŒ– FreeType 錯誤。"
+
+#~ msgid "Unknown font format."
+#~ msgstr "未知的字體格å¼ã€‚"
+
+#~ msgid "Error loading font."
+#~ msgstr "讀å–字體錯誤。"
+
+#~ msgid "Invalid font size."
+#~ msgstr "無效的字體大å°ã€‚"
+
#, fuzzy
#~ msgid "Previous Folder"
#~ msgstr "上個分é "
diff --git a/main/gamecontrollerdb.txt b/main/gamecontrollerdb.txt
index 440c0a8621..0e30cfe8d0 100644
--- a/main/gamecontrollerdb.txt
+++ b/main/gamecontrollerdb.txt
@@ -9,6 +9,7 @@
03000000c82d00000060000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00000061000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
03000000102800000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
+03000000c82d00003028000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
03000000a00500003232000000000000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,
030000008f0e00001200000000000000,Acme GA-02,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows,
03000000fa190000f0ff000000000000,Acteck AGJ-3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
@@ -26,6 +27,7 @@
03000000bc2000006012000000000000,Betop 2126F,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
03000000bc2000000055000000000000,Betop BFM Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000bc2000006312000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
+03000000bc2000006321000000000000,BETOP CONTROLLER,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
03000000bc2000006412000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
03000000c01100000555000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
03000000c01100000655000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
@@ -38,6 +40,8 @@
03000000e82000006058000000000000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
030000005e0400008e02000000000000,Controller (XBOX 360 For Windows),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
030000005e040000a102000000000000,Controller (Xbox 360 Wireless Receiver for Windows),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
+030000005e040000ff02000000000000,Controller (Xbox One For Windows) - Wired,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
+030000005e040000ea02000000000000,Controller (Xbox One For Windows) - Wireless,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
03000000260900008888000000000000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a4,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Windows,
03000000a306000022f6000000000000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,
03000000451300000830000000000000,Defender Game Racer X7,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
@@ -64,6 +68,7 @@
03000000ac0500003d03000000000000,GameSir,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000ac0500004d04000000000000,GameSir,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000ffff00000000000000000000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
+030000006f0e00000102000000007801,GameStop Xbox 360 Wired Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
030000008305000009a0000000000000,Genius,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
030000008305000031b0000000000000,Genius Maxfire Blaze 3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
03000000451300000010000000000000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
@@ -73,6 +78,7 @@
03000000f025000021c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
03000000f0250000c383000000000000,Gioteck VX2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
03000000f0250000c483000000000000,Gioteck VX2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
+030000007d0400000540000000000000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
03000000341a00000302000000000000,Hama Scorpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
030000000d0f00004900000000000000,Hatsune Miku Sho Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
03000000d81400000862000000000000,HitBox Edition Cthulhu+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows,
@@ -83,6 +89,7 @@
030000000d0f00005400000000000000,Hori Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
030000000d0f00004d00000000000000,Hori Pad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
+030000000d0f00009200000000000000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
030000000d0f0000c100000000000000,Horipad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
030000000d0f00006e00000000000000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
030000000d0f00006600000000000000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
@@ -96,11 +103,14 @@
030000006f0e00002401000000000000,INJUSTICE FightStick PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
03000000ac0500002c02000000000000,IPEGA,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000491900000204000000000000,Ipega PG-9023,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
+03000000491900000304000000000000,Ipega PG-9087 - Bluetooth Gamepad,+righty:+a5,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows,
030000006e0500000a20000000000000,JC-DUX60 ELECOM MMO Gamepad,a:b2,b:b3,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b14,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b15,righttrigger:b13,rightx:a3,righty:a4,start:b20,x:b0,y:b1,platform:Windows,
030000006e0500000520000000000000,JC-P301U,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,
030000006e0500000320000000000000,JC-U3613M (DInput),a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,
030000006e0500000720000000000000,JC-W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,
+030000007e0500000620000000000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Windows,
030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Windows,
+030000007e0500000720000000000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows,
030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows,
03000000bd12000003c0000000000000,JY-P70UR,a:b1,b:b0,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b11,righttrigger:b9,rightx:a3,righty:a2,start:b4,x:b3,y:b2,platform:Windows,
03000000790000000200000000000000,King PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows,
@@ -139,7 +149,7 @@
03000000bd12000015d0000000000000,Nintendo Retrolink USB Super SNES Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows,
030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
030000000d0500000308000000000000,Nostromo N45,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Windows,
-03000000550900001472000000000000,NVIDIA Controller v01.04,a:b11,b:b10,x:b9,y:b8,back:b13,guide:b12,start:b3,leftstick:b5,rightstick:b4,leftshoulder:b7,rightshoulder:b6,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a6,lefttrigger:a4,righttrigger:a5,platform:Windows,
+03000000550900001472000000000000,NVIDIA Controller v01.04,a:b11,b:b10,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b5,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b4,righttrigger:a5,rightx:a3,righty:a6,start:b3,x:b9,y:b8,platform:Windows,
030000004b120000014d000000000000,NYKO AIRFLO,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a3,leftstick:a0,lefttrigger:b6,rightshoulder:b5,rightstick:a2,righttrigger:b7,start:b9,x:b2,y:b3,platform:Windows,
03000000782300000a10000000000000,Onlive Wireless Controller,a:b15,b:b14,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b11,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b13,y:b12,platform:Windows,
03000000d62000006d57000000000000,OPP PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
@@ -147,6 +157,7 @@
03000000362800000100000000000000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,x:b1,y:b2,platform:Windows,
03000000120c0000f60e000000000000,P4 Wired Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows,
030000008f0e00000300000000000000,Piranha xtreme,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,
+030000004c050000da0c000000000000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,
03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
03000000d62000009f31000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
@@ -201,6 +212,7 @@
03000000a30600001af5000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,
03000000a306000023f6000000000000,Saitek Cyborg V.1 Game pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,
03000000300f00001201000000000000,Saitek Dual Analog Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,
+03000000a30600000701000000000000,Saitek P220,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b5,x:b0,y:b1,platform:Windows,
03000000a30600000cff000000000000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,x:b0,y:b1,platform:Windows,
03000000a30600000c04000000000000,Saitek P2900,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows,
03000000300f00001001000000000000,Saitek P480 Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,
@@ -211,6 +223,7 @@
03000000300f00001101000000000000,Saitek Rumble Pad,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,
0300000000050000289b000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows,
030000009b2800000500000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows,
+030000005e0400008e02000000007801,ShanWan PS3/PC Wired GamePad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
03000000341a00000208000000000000,SL-6555-SBK,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:-a4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a3,righty:a2,start:b7,x:b2,y:b3,platform:Windows,
03000000341a00000908000000000000,SL-6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
030000008f0e00000800000000000000,SpeedLink Strike FX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
@@ -244,6 +257,7 @@
03000000ff1100004133000000000000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows,
03000000632500002305000000000000,USB Vibration Joystick (BM),a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
03000000790000001b18000000000000,Venom Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
+030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
03000000450c00002043000000000000,XEOX Gamepad SL-6556-BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
03000000172700004431000000000000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,
@@ -259,18 +273,21 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000102800000900000000000000,8Bitdo SFC30 GamePad Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000a00500003232000008010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
03000000a00500003232000009010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
-03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,x:b2,y:b3,back:b10,start:b9,leftstick:b7,rightstick:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Mac OS X,
+03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
030000008305000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X,
03000000a306000022f6000001030000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X,
03000000790000000600000000000000,G-Shark GP-702,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Mac OS X,
03000000ad1b000001f9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
+030000006f0e00000102000000000000,GameStop Xbox 360 Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
+030000007d0400000540000001010000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00005f00000000010000,Hori Fighting Commander 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00005e00000000010000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00005f00000000000000,HORI Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00005e00000000000000,HORI Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00004d00000000000000,HORI Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
+030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00006e00000000010000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00006600000000010000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00006600000000000000,HORIPAD FPS PLUS 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
@@ -296,9 +313,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X,
03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X,
03000000d8140000cecf000000000000,MC Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
-03000000d62000007162000001000000,Moga Pro 2 HID,a:b0,b:b1,x:b2,y:b3,back:b9,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Mac OS X,
+03000000d62000007162000001000000,Moga Pro 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X,
030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,platform:Mac OS X,
030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
+030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
030000008f0e00000300000000000000,Piranha xtreme,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X,
03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,
@@ -311,8 +329,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000321500000204000000010000,Razer Panthera (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
03000000321500000104000000010000,Razer Panthera (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
03000000321500000010000000010000,Razer RAIJU,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
-03000000321500000009000000020000,Razer Serval,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Mac OS X,
-030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Mac OS X,
+03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,
+030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,
0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
03000000790000001100000000000000,Retrolink Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a3,lefty:a4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X,
03000000790000001100000006010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X,
@@ -321,6 +339,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X,
03000000b40400000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X,
030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,
+0300000000f00000f100000000000000,SNES RetroPort,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,rightshoulder:b7,start:b6,x:b0,y:b1,platform:Mac OS X,
030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
030000004c050000a00b000000000000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
030000005e0400008e02000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
@@ -338,6 +357,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X,
030000005e0400008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
03000000c6240000045d000000000000,Xbox 360 Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
+030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
030000005e040000d102000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
030000005e040000dd02000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
030000005e040000e302000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
@@ -349,6 +369,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000120c0000100e000000010000,ZEROPLUS P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
# Linux
+05000000c82d00001038000000010000,8Bitdo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000022000000090000011010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00002038000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
@@ -360,9 +381,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
05000000a00500003232000008010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,
030000006f0e00001302000000010000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006f0e00003901000020060000,Afterglow Controller for Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
+030000006f0e00003901000013020000,Afterglow Prismatic Wired Controller 048-007-NA,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000100000008200000011010000,Akishop Customs PS360+ v1.66,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
-05000000491900000204000021000000,Amazon Fire Game Controller,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Linux,
+05000000491900000204000021000000,Amazon Fire Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
05000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux,
05000000050b00000045000040000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux,
03000000120c00000500000010010000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux,
@@ -381,6 +403,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000006f0e00001304000000010000,Generic X-Box pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:a0,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:a3,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
+030000007d0400000540000000010000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
03000000280400000140000000010000,Gravis GamePad Pro USB ,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000008f0e00000610000000010000,GreenAsia Electronics 4Axes 12Keys GamePad ,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux,
030000008f0e00001200000010010000,GreenAsia Inc. USB Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
@@ -396,6 +419,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000000d0f00005f00000011010000,Hori Fighting Commander 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00005e00000011010000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
+030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00006e00000011010000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00006600000011010000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f0000ee00000011010000,HORIPAD mini4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
@@ -408,9 +432,12 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
0500000049190000020400001b010000,Ipega PG-9069 - Bluetooth Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b161,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux,
03000000300f00001001000010010000,Jess Tech Dual Analog Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,
+03000000300f00000b01000010010000,Jess Tech GGE909 PC Recoil Pad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux,
+050000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux,
030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux,
+050000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux,
030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
@@ -439,6 +466,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
0300000079000000d218000011010000,MAGIC-NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000120c00000500000000010000,Manta Dualshock 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux,
+03000000790000004318000010010000,Mayflash GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
0300000025090000e803000001010000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,
03000000780000000600000010010000,Microntek USB Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
030000005e0400000e00000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux,
@@ -450,9 +478,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000005e040000d102000003020000,Microsoft X-Box One pad v2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e0400008502000000010000,Microsoft X-Box pad (Japan),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,
030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,
-05000000d6200000e589000001000000,Moga 2 HID,a:b0,b:b1,x:b2,y:b3,back:b9,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Linux,
+05000000d6200000e589000001000000,Moga 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,
05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,
-05000000d62000007162000001000000,Moga Pro 2 HID,a:b0,b:b1,x:b2,y:b3,back:b9,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Linux,
+05000000d62000007162000001000000,Moga Pro 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,
03000000250900006688000000010000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,
030000000d0f00000900000010010000,Natec Genesis P44,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,platform:Linux,
@@ -461,15 +489,17 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
05000000010000000100000003000000,Nintendo Wiimote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
030000000d0500000308000010010000,Nostromo n45 Dual Analog Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Linux,
03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
-05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,x:b2,y:b3,back:b14,guide:b16,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,
-03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,x:b2,y:b3,back:b14,guide:b16,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,
+03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,
+05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,
03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000005e0400000202000000010000,Old Xbox pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,
05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux,
05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux,
03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
+030000006f0e0000a802000023020000,PDP Wired Controller for Xbox One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
+03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
@@ -524,6 +554,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000c01600008704000011010000,Serial/Keyboard/Mouse/Joystick,a:b12,b:b10,back:b4,dpdown:b2,dpleft:b3,dpright:b1,dpup:b0,leftshoulder:b9,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b8,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b5,x:b13,y:b11,platform:Linux,
03000000f025000021c1000010010000,ShanWan Gioteck PS3 Wired Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000632500007505000010010000,SHANWAN PS3/PC Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
+03000000bc2000000055000010010000,ShanWan PS3/PC Wired GamePad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000632500002305000010010000,ShanWan USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000341a00000908000010010000,SL-6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,
diff --git a/main/input_default.cpp b/main/input_default.cpp
index 5ba98c20e2..60675f1115 100644
--- a/main/input_default.cpp
+++ b/main/input_default.cpp
@@ -472,6 +472,10 @@ void InputDefault::stop_joy_vibration(int p_device) {
joy_vibration[p_device] = vibration;
}
+void InputDefault::vibrate_handheld(int p_duration_ms) {
+ OS::get_singleton()->vibrate_handheld(p_duration_ms);
+}
+
void InputDefault::set_gravity(const Vector3 &p_gravity) {
_THREAD_SAFE_METHOD_
diff --git a/main/input_default.h b/main/input_default.h
index 80ee17656c..4fc4ad6506 100644
--- a/main/input_default.h
+++ b/main/input_default.h
@@ -226,6 +226,7 @@ public:
virtual void start_joy_vibration(int p_device, float p_weak_magnitude, float p_strong_magnitude, float p_duration = 0);
virtual void stop_joy_vibration(int p_device);
+ virtual void vibrate_handheld(int p_duration_ms = 500);
void set_main_loop(MainLoop *p_main_loop);
void set_mouse_position(const Point2 &p_posf);
diff --git a/main/main.cpp b/main/main.cpp
index 027273c4f4..f4665c4ad4 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -30,6 +30,7 @@
#include "main.h"
+#include "core/crypto/crypto.h"
#include "core/input_map.h"
#include "core/io/file_access_network.h"
#include "core/io/file_access_pack.h"
@@ -37,8 +38,6 @@
#include "core/io/image_loader.h"
#include "core/io/ip.h"
#include "core/io/resource_loader.h"
-#include "core/io/stream_peer_ssl.h"
-#include "core/io/stream_peer_tcp.h"
#include "core/message_queue.h"
#include "core/os/dir_access.h"
#include "core/os/os.h"
@@ -599,6 +598,14 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
auto_build_solutions = true;
editor = true;
+#ifdef DEBUG_METHODS_ENABLED
+ } else if (I->get() == "--gdnative-generate-json-api") {
+ // Register as an editor instance to use the GLES2 fallback automatically on hardware that doesn't support the GLES3 backend
+ editor = true;
+
+ // We still pass it to the main arguments since the argument handling itself is not done in this function
+ main_args.push_back(I->get());
+#endif
} else if (I->get() == "--export" || I->get() == "--export-debug") { // Export project
editor = true;
@@ -937,7 +944,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
OS::get_singleton()->_allow_hidpi = GLOBAL_DEF("display/window/dpi/allow_hidpi", false);
}
- video_mode.use_vsync = GLOBAL_DEF("display/window/vsync/use_vsync", true);
+ video_mode.use_vsync = GLOBAL_DEF_RST("display/window/vsync/use_vsync", true);
OS::get_singleton()->_use_vsync = video_mode.use_vsync;
OS::get_singleton()->_allow_layered = GLOBAL_DEF("display/window/per_pixel_transparency/allowed", false);
@@ -1741,7 +1748,7 @@ bool Main::start() {
if (!project_manager && !editor) { // game
// Load SSL Certificates from Project Settings (or builtin).
- StreamPeerSSL::load_certs_from_memory(StreamPeerSSL::get_project_cert_array());
+ Crypto::load_default_certificates(GLOBAL_DEF("network/ssl/certificates", ""));
if (game_path != "") {
Node *scene = NULL;
@@ -1793,17 +1800,15 @@ bool Main::start() {
}
if (project_manager || editor) {
- // Load SSL Certificates from Editor Settings (or builtin).
- String certs = EditorSettings::get_singleton()->get_setting("network/ssl/editor_ssl_certificates").operator String();
- if (certs != "")
- StreamPeerSSL::load_certs_from_file(certs);
- else
- StreamPeerSSL::load_certs_from_memory(StreamPeerSSL::get_project_cert_array());
-
// Hide console window if requested (Windows-only).
bool hide_console = EditorSettings::get_singleton()->get_setting("interface/editor/hide_console_window");
OS::get_singleton()->set_console_visible(!hide_console);
}
+
+ if (project_manager || editor) {
+ // Load SSL Certificates from Editor Settings (or builtin)
+ Crypto::load_default_certificates(EditorSettings::get_singleton()->get_setting("network/ssl/editor_ssl_certificates").operator String());
+ }
#endif
}
diff --git a/main/main.h b/main/main.h
index 694305526a..b0b90dc0fe 100644
--- a/main/main.h
+++ b/main/main.h
@@ -31,10 +31,6 @@
#ifndef MAIN_H
#define MAIN_H
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
#include "core/error_list.h"
#include "core/os/thread.h"
#include "core/typedefs.h"
diff --git a/main/tests/test_gui.h b/main/tests/test_gui.h
index 1752818981..075bc40aa7 100644
--- a/main/tests/test_gui.h
+++ b/main/tests/test_gui.h
@@ -33,9 +33,6 @@
#include "core/os/main_loop.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
namespace TestGUI {
MainLoop *test();
diff --git a/main/tests/test_oa_hash_map.cpp b/main/tests/test_oa_hash_map.cpp
index 070420e432..bf5b4588ea 100644
--- a/main/tests/test_oa_hash_map.cpp
+++ b/main/tests/test_oa_hash_map.cpp
@@ -121,6 +121,25 @@ MainLoop *test() {
delete[] keys;
}
+ // regression test / test for issue related to #31402
+ {
+
+ OS::get_singleton()->print("test for issue #31402 started...\n");
+
+ const int num_test_values = 12;
+ int test_values[num_test_values] = { 0, 24, 48, 72, 96, 120, 144, 168, 192, 216, 240, 264 };
+
+ int dummy = 0;
+ OAHashMap<int, int> map;
+ map.clear();
+
+ for (int i = 0; i < num_test_values; ++i) {
+ map.set(test_values[i], dummy);
+ }
+
+ OS::get_singleton()->print("test for issue #31402 passed.\n");
+ }
+
return NULL;
}
} // namespace TestOAHashMap
diff --git a/main/tests/test_physics.h b/main/tests/test_physics.h
index 699e31f492..a281f669e0 100644
--- a/main/tests/test_physics.h
+++ b/main/tests/test_physics.h
@@ -31,10 +31,6 @@
#ifndef TEST_PHYSICS_H
#define TEST_PHYSICS_H
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
#include "core/os/main_loop.h"
namespace TestPhysics {
diff --git a/main/tests/test_render.h b/main/tests/test_render.h
index 3810760b56..6dda57db5b 100644
--- a/main/tests/test_render.h
+++ b/main/tests/test_render.h
@@ -31,10 +31,6 @@
#ifndef TEST_RENDER_H
#define TEST_RENDER_H
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
#include "core/os/main_loop.h"
namespace TestRender {
diff --git a/misc/hooks/pre-commit-clang-format b/misc/hooks/pre-commit-clang-format
index db241ad172..3a0ac9f389 100755
--- a/misc/hooks/pre-commit-clang-format
+++ b/misc/hooks/pre-commit-clang-format
@@ -86,6 +86,9 @@ do
if grep -q "thirdparty" <<< $file; then
continue;
fi
+ if grep -q "platform/android/java/src/com" <<< $file; then
+ continue;
+ fi
# ignore file if we do check for file extensions and the file
# does not match any of the extensions specified in $FILE_EXTS
diff --git a/misc/ide/jetbrains/build.gradle b/misc/ide/jetbrains/build.gradle
index eb2fbc0e69..dea81b4ea3 100644
--- a/misc/ide/jetbrains/build.gradle
+++ b/misc/ide/jetbrains/build.gradle
@@ -4,7 +4,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.3.2'
+ classpath 'com.android.tools.build:gradle:3.4.2'
}
}
diff --git a/misc/ide/jetbrains/gradle/wrapper/gradle-wrapper.properties b/misc/ide/jetbrains/gradle/wrapper/gradle-wrapper.properties
index b477add150..22e7a5c60b 100644
--- a/misc/ide/jetbrains/gradle/wrapper/gradle-wrapper.properties
+++ b/misc/ide/jetbrains/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sun Mar 31 16:34:43 PDT 2019
+#Wed Aug 21 13:47:30 PDT 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
diff --git a/misc/travis/clang-format.sh b/misc/travis/clang-format.sh
index 5463a6cedf..48378281d4 100755
--- a/misc/travis/clang-format.sh
+++ b/misc/travis/clang-format.sh
@@ -11,7 +11,7 @@ else
RANGE=HEAD
fi
-FILES=$(git diff-tree --no-commit-id --name-only -r $RANGE | grep -v thirdparty/ | grep -E "\.(c|h|cpp|hpp|cc|hh|cxx|m|mm|inc|java|glsl)$")
+FILES=$(git diff-tree --no-commit-id --name-only -r $RANGE | grep -v thirdparty/ | grep -v platform/android/java/src/com/ | grep -E "\.(c|h|cpp|hpp|cc|hh|cxx|m|mm|inc|java|glsl)$")
echo "Checking files:\n$FILES"
# create a random filename to store our generated patch
diff --git a/modules/arkit/arkit_interface.h b/modules/arkit/arkit_interface.h
index 8129611287..e1dbca1488 100644
--- a/modules/arkit/arkit_interface.h
+++ b/modules/arkit/arkit_interface.h
@@ -3,10 +3,10 @@
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
-/* http://www.godotengine.org */
+/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/arkit/arkit_interface.mm b/modules/arkit/arkit_interface.mm
index 68844c54c2..9614f775a5 100644
--- a/modules/arkit/arkit_interface.mm
+++ b/modules/arkit/arkit_interface.mm
@@ -3,10 +3,10 @@
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
-/* http://www.godotengine.org */
+/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/arkit/arkit_session_delegate.h b/modules/arkit/arkit_session_delegate.h
index afe093656b..9303552ca6 100644
--- a/modules/arkit/arkit_session_delegate.h
+++ b/modules/arkit/arkit_session_delegate.h
@@ -3,10 +3,10 @@
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
-/* http://www.godotengine.org */
+/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/arkit/arkit_session_delegate.mm b/modules/arkit/arkit_session_delegate.mm
index 56485c987c..d4072fc391 100644
--- a/modules/arkit/arkit_session_delegate.mm
+++ b/modules/arkit/arkit_session_delegate.mm
@@ -3,10 +3,10 @@
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
-/* http://www.godotengine.org */
+/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/assimp/editor_scene_importer_assimp.cpp b/modules/assimp/editor_scene_importer_assimp.cpp
index 05f9120a07..e5439fd132 100644
--- a/modules/assimp/editor_scene_importer_assimp.cpp
+++ b/modules/assimp/editor_scene_importer_assimp.cpp
@@ -28,24 +28,13 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#include "assimp/DefaultLogger.hpp"
-#include "assimp/Importer.hpp"
-#include "assimp/LogStream.hpp"
-#include "assimp/Logger.hpp"
-#include "assimp/SceneCombiner.h"
-#include "assimp/cexport.h"
-#include "assimp/cimport.h"
-#include "assimp/matrix4x4.h"
-#include "assimp/pbrmaterial.h"
-#include "assimp/postprocess.h"
-#include "assimp/scene.h"
-
+#include "editor_scene_importer_assimp.h"
#include "core/bind/core_bind.h"
#include "core/io/image_loader.h"
#include "editor/editor_file_system.h"
#include "editor/import/resource_importer_scene.h"
-#include "editor_scene_importer_assimp.h"
#include "editor_settings.h"
+#include "import_utils.h"
#include "scene/3d/camera.h"
#include "scene/3d/light.h"
#include "scene/3d/mesh_instance.h"
@@ -53,7 +42,19 @@
#include "scene/main/node.h"
#include "scene/resources/material.h"
#include "scene/resources/surface_tool.h"
-#include "zutil.h"
+
+#include <assimp/SceneCombiner.h>
+#include <assimp/cexport.h>
+#include <assimp/cimport.h>
+#include <assimp/matrix4x4.h>
+#include <assimp/pbrmaterial.h>
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <zutil.h>
+#include <assimp/DefaultLogger.hpp>
+#include <assimp/Importer.hpp>
+#include <assimp/LogStream.hpp>
+#include <assimp/Logger.hpp>
#include <string>
void EditorSceneImporterAssimp::get_extensions(List<String> *r_extensions) const {
@@ -92,18 +93,6 @@ uint32_t EditorSceneImporterAssimp::get_import_flags() const {
return IMPORT_SCENE;
}
-AssimpStream::AssimpStream() {
- // empty
-}
-
-AssimpStream::~AssimpStream() {
- // empty
-}
-
-void AssimpStream::write(const char *message) {
- print_verbose(String("Open Asset Import: ") + String(message).strip_edges());
-}
-
void EditorSceneImporterAssimp::_bind_methods() {
}
@@ -122,35 +111,36 @@ Node *EditorSceneImporterAssimp::import_scene(const String &p_path, uint32_t p_f
//}
importer.SetPropertyInteger(AI_CONFIG_PP_SBP_REMOVE, aiPrimitiveType_LINE | aiPrimitiveType_POINT);
+
//importer.SetPropertyFloat(AI_CONFIG_PP_DB_THRESHOLD, 1.0f);
int32_t post_process_Steps = aiProcess_CalcTangentSpace |
+ aiProcess_GlobalScale | // imports models and listens to their file scale for CM to M conversions
//aiProcess_FlipUVs |
- //aiProcess_FlipWindingOrder |
+ aiProcess_FlipWindingOrder | // very important for culling so that it is done in the correct order.
//aiProcess_DropNormals |
//aiProcess_GenSmoothNormals |
- aiProcess_JoinIdenticalVertices |
+ //aiProcess_JoinIdenticalVertices |
aiProcess_ImproveCacheLocality |
- aiProcess_LimitBoneWeights |
//aiProcess_RemoveRedundantMaterials | // Causes a crash
- aiProcess_SplitLargeMeshes |
+ //aiProcess_SplitLargeMeshes |
aiProcess_Triangulate |
aiProcess_GenUVCoords |
//aiProcess_FindDegenerates |
- aiProcess_SortByPType |
- aiProcess_FindInvalidData |
+ //aiProcess_SortByPType |
+ // aiProcess_FindInvalidData |
aiProcess_TransformUVCoords |
aiProcess_FindInstances |
//aiProcess_FixInfacingNormals |
- //aiProcess_ValidateDataStructure |
+ aiProcess_ValidateDataStructure |
aiProcess_OptimizeMeshes |
//aiProcess_OptimizeGraph |
//aiProcess_Debone |
- aiProcess_EmbedTextures |
- aiProcess_SplitByBoneCount |
+ // aiProcess_EmbedTextures |
+ //aiProcess_SplitByBoneCount |
0;
- const aiScene *scene = importer.ReadFile(s_path.c_str(),
- post_process_Steps);
- ERR_FAIL_COND_V_MSG(scene == NULL, NULL, String("Open Asset Import failed to open: ") + String(importer.GetErrorString()) + ".");
+ aiScene *scene = (aiScene *)importer.ReadFile(s_path.c_str(), post_process_Steps);
+ ERR_EXPLAIN(String("Open Asset Import failed to open: ") + String(importer.GetErrorString()));
+ ERR_FAIL_COND_V(scene == NULL, NULL);
return _generate_scene(p_path, scene, p_flags, p_bake_fps, max_bone_weights);
}
@@ -281,158 +271,7 @@ T EditorSceneImporterAssimp::_interpolate_track(const Vector<float> &p_times, co
ERR_FAIL_V(p_values[0]);
}
-void EditorSceneImporterAssimp::_generate_bone_groups(ImportState &state, const aiNode *p_assimp_node, Map<String, int> &ownership, Map<String, Transform> &bind_xforms) {
-
- Transform mesh_offset = _get_global_assimp_node_transform(p_assimp_node);
- //mesh_offset.basis = Basis();
- for (uint32_t i = 0; i < p_assimp_node->mNumMeshes; i++) {
- const aiMesh *mesh = state.assimp_scene->mMeshes[i];
- int owned_by = -1;
- for (uint32_t j = 0; j < mesh->mNumBones; j++) {
- const aiBone *bone = mesh->mBones[j];
- String name = _assimp_get_string(bone->mName);
-
- if (ownership.has(name)) {
- owned_by = ownership[name];
- break;
- }
- }
-
- if (owned_by == -1) { //no owned, create new unique id
- owned_by = 1;
- for (Map<String, int>::Element *E = ownership.front(); E; E = E->next()) {
- owned_by = MAX(E->get() + 1, owned_by);
- }
- }
-
- for (uint32_t j = 0; j < mesh->mNumBones; j++) {
- const aiBone *bone = mesh->mBones[j];
- String name = _assimp_get_string(bone->mName);
- ownership[name] = owned_by;
- //store the actual full path for the bone transform
- //when skeleton finds its place in the tree, it will be restored
- bind_xforms[name] = mesh_offset * _assimp_matrix_transform(bone->mOffsetMatrix);
- }
- }
-
- for (size_t i = 0; i < p_assimp_node->mNumChildren; i++) {
- _generate_bone_groups(state, p_assimp_node->mChildren[i], ownership, bind_xforms);
- }
-}
-
-void EditorSceneImporterAssimp::_fill_node_relationships(ImportState &state, const aiNode *p_assimp_node, Map<String, int> &ownership, Map<int, int> &skeleton_map, int p_skeleton_id, Skeleton *p_skeleton, const String &p_parent_name, int &holecount, const Vector<SkeletonHole> &p_holes, const Map<String, Transform> &bind_xforms) {
-
- String name = _assimp_get_string(p_assimp_node->mName);
- if (name == String()) {
- name = "AuxiliaryBone" + itos(holecount++);
- }
-
- Transform pose = _assimp_matrix_transform(p_assimp_node->mTransformation);
-
- if (!ownership.has(name)) {
- //not a bone, it's a hole
- Vector<SkeletonHole> holes = p_holes;
- SkeletonHole hole; //add a new one
- hole.name = name;
- hole.pose = pose;
- hole.node = p_assimp_node;
- hole.parent = p_parent_name;
- holes.push_back(hole);
-
- for (size_t i = 0; i < p_assimp_node->mNumChildren; i++) {
- _fill_node_relationships(state, p_assimp_node->mChildren[i], ownership, skeleton_map, p_skeleton_id, p_skeleton, name, holecount, holes, bind_xforms);
- }
-
- return;
- } else if (ownership[name] != p_skeleton_id) {
- //oh, it's from another skeleton? fine.. reparent all bones to this skeleton.
- int prev_owner = ownership[name];
- ERR_FAIL_COND_MSG(skeleton_map.has(prev_owner), "A previous skeleton exists for bone '" + name + "', this type of skeleton layout is unsupported.");
- for (Map<String, int>::Element *E = ownership.front(); E; E = E->next()) {
- if (E->get() == prev_owner) {
- E->get() = p_skeleton_id;
- }
- }
- }
-
- //valid bone, first fill holes if needed
- for (int i = 0; i < p_holes.size(); i++) {
-
- int bone_idx = p_skeleton->get_bone_count();
- p_skeleton->add_bone(p_holes[i].name);
- int parent_idx = p_skeleton->find_bone(p_holes[i].parent);
- if (parent_idx >= 0) {
- p_skeleton->set_bone_parent(bone_idx, parent_idx);
- }
-
- Transform pose_transform = _get_global_assimp_node_transform(p_holes[i].node);
- p_skeleton->set_bone_rest(bone_idx, pose_transform);
-
- state.bone_owners[p_holes[i].name] = skeleton_map[p_skeleton_id];
- }
-
- //finally fill bone
-
- int bone_idx = p_skeleton->get_bone_count();
- p_skeleton->add_bone(name);
- int parent_idx = p_skeleton->find_bone(p_parent_name);
- if (parent_idx >= 0) {
- p_skeleton->set_bone_parent(bone_idx, parent_idx);
- }
- //p_skeleton->set_bone_pose(bone_idx, pose);
- if (bind_xforms.has(name)) {
- //for now this is the full path to the bone in rest pose
- //when skeleton finds it's place in the tree, it will get fixed
- p_skeleton->set_bone_rest(bone_idx, bind_xforms[name]);
- }
- state.bone_owners[name] = skeleton_map[p_skeleton_id];
- //go to children
- for (size_t i = 0; i < p_assimp_node->mNumChildren; i++) {
- _fill_node_relationships(state, p_assimp_node->mChildren[i], ownership, skeleton_map, p_skeleton_id, p_skeleton, name, holecount, Vector<SkeletonHole>(), bind_xforms);
- }
-}
-
-void EditorSceneImporterAssimp::_generate_skeletons(ImportState &state, const aiNode *p_assimp_node, Map<String, int> &ownership, Map<int, int> &skeleton_map, const Map<String, Transform> &bind_xforms) {
-
- //find skeletons at this level, there may be multiple root nodes for each
- Map<int, List<aiNode *> > skeletons_found;
- for (size_t i = 0; i < p_assimp_node->mNumChildren; i++) {
- String name = _assimp_get_string(p_assimp_node->mChildren[i]->mName);
- if (ownership.has(name)) {
- int skeleton = ownership[name];
- if (!skeletons_found.has(skeleton)) {
- skeletons_found[skeleton] = List<aiNode *>();
- }
- skeletons_found[skeleton].push_back(p_assimp_node->mChildren[i]);
- }
- }
-
- //go via the potential skeletons found and generate the actual skeleton
- for (Map<int, List<aiNode *> >::Element *E = skeletons_found.front(); E; E = E->next()) {
- ERR_CONTINUE(skeleton_map.has(E->key())); //skeleton already exists? this can't be.. skip
- Skeleton *skeleton = memnew(Skeleton);
- //this the only way to reliably use multiple meshes with one skeleton, at the cost of less precision
- skeleton->set_use_bones_in_world_transform(true);
- skeleton_map[E->key()] = state.skeletons.size();
- state.skeletons.push_back(skeleton);
- int holecount = 1;
- //fill the bones and their relationships
- for (List<aiNode *>::Element *F = E->get().front(); F; F = F->next()) {
- _fill_node_relationships(state, F->get(), ownership, skeleton_map, E->key(), skeleton, "", holecount, Vector<SkeletonHole>(), bind_xforms);
- }
- }
-
- //go to the children
- for (uint32_t i = 0; i < p_assimp_node->mNumChildren; i++) {
- String name = _assimp_get_string(p_assimp_node->mChildren[i]->mName);
- if (ownership.has(name)) {
- continue; //a bone, so don't bother with this
- }
- _generate_skeletons(state, p_assimp_node->mChildren[i], ownership, skeleton_map, bind_xforms);
- }
-}
-
-Spatial *EditorSceneImporterAssimp::_generate_scene(const String &p_path, const aiScene *scene, const uint32_t p_flags, int p_bake_fps, const int32_t p_max_bone_weights) {
+Spatial *EditorSceneImporterAssimp::_generate_scene(const String &p_path, aiScene *scene, const uint32_t p_flags, int p_bake_fps, const int32_t p_max_bone_weights) {
ERR_FAIL_COND_V(scene == NULL, NULL);
ImportState state;
@@ -443,60 +282,37 @@ Spatial *EditorSceneImporterAssimp::_generate_scene(const String &p_path, const
state.fbx = false;
state.animation_player = NULL;
- real_t scale_factor = 1.0f;
- {
- //handle scale
- String ext = p_path.get_file().get_extension().to_lower();
- if (ext == "fbx") {
- if (scene->mMetaData != NULL) {
- float factor = 1.0;
- scene->mMetaData->Get("UnitScaleFactor", factor);
- scale_factor = factor * 0.01f;
- }
- state.fbx = true;
- }
- }
-
- state.root->set_scale(Vector3(scale_factor, scale_factor, scale_factor));
-
//fill light map cache
for (size_t l = 0; l < scene->mNumLights; l++) {
aiLight *ai_light = scene->mLights[l];
ERR_CONTINUE(ai_light == NULL);
- state.light_cache[_assimp_get_string(ai_light->mName)] = l;
+ state.light_cache[AssimpUtils::get_assimp_string(ai_light->mName)] = l;
}
//fill camera cache
for (size_t c = 0; c < scene->mNumCameras; c++) {
aiCamera *ai_camera = scene->mCameras[c];
ERR_CONTINUE(ai_camera == NULL);
- state.camera_cache[_assimp_get_string(ai_camera->mName)] = c;
+ state.camera_cache[AssimpUtils::get_assimp_string(ai_camera->mName)] = c;
}
if (scene->mRootNode) {
- Map<String, Transform> bind_xforms; //temporary map to store bind transforms
- //guess the skeletons, since assimp does not really support them directly
- Map<String, int> ownership; //bone names to groups
- //fill this map with bone names and which group where they detected to, going mesh by mesh
- _generate_bone_groups(state, state.assimp_scene->mRootNode, ownership, bind_xforms);
- Map<int, int> skeleton_map; //maps previously created groups to actual skeletons
- //generates the skeletons when bones are found in the hierarchy, and follows them (including gaps/holes).
- _generate_skeletons(state, state.assimp_scene->mRootNode, ownership, skeleton_map, bind_xforms);
//generate nodes
for (uint32_t i = 0; i < scene->mRootNode->mNumChildren; i++) {
- _generate_node(state, scene->mRootNode->mChildren[i], state.root);
+ _generate_node(state, NULL, scene->mRootNode->mChildren[i], state.root);
}
- //assign skeletons to nodes
-
- for (Map<MeshInstance *, Skeleton *>::Element *E = state.mesh_skeletons.front(); E; E = E->next()) {
- MeshInstance *mesh = E->key();
- Skeleton *skeleton = E->get();
- NodePath skeleton_path = mesh->get_path_to(skeleton);
- mesh->set_skeleton_path(skeleton_path);
+ // finalize skeleton
+ for (Map<Skeleton *, const Spatial *>::Element *key_value_pair = state.armature_skeletons.front(); key_value_pair; key_value_pair = key_value_pair->next()) {
+ Skeleton *skeleton = key_value_pair->key();
+ // convert world to local for skeleton bone rests
+ skeleton->localize_rests();
}
+
+ print_verbose("generating mesh phase from skeletal mesh");
+ generate_mesh_phase_from_skeletal_mesh(state);
}
if (p_flags & IMPORT_ANIMATION && scene->mNumAnimations) {
@@ -601,12 +417,14 @@ void EditorSceneImporterAssimp::_insert_animation_track(ImportState &scene, cons
}
}
+// animation tracks are per bone
+
void EditorSceneImporterAssimp::_import_animation(ImportState &state, int p_animation_index, int p_bake_fps) {
ERR_FAIL_INDEX(p_animation_index, (int)state.assimp_scene->mNumAnimations);
const aiAnimation *anim = state.assimp_scene->mAnimations[p_animation_index];
- String name = _assimp_anim_string_to_string(anim->mName);
+ String name = AssimpUtils::get_anim_string_from_assimp(anim->mName);
if (name == String()) {
name = "Animation " + itos(p_animation_index + 1);
}
@@ -616,7 +434,7 @@ void EditorSceneImporterAssimp::_import_animation(ImportState &state, int p_anim
if (state.assimp_scene->mMetaData != NULL && Math::is_equal_approx(ticks_per_second, 0.0f)) {
int32_t time_mode = 0;
state.assimp_scene->mMetaData->Get("TimeMode", time_mode);
- ticks_per_second = _get_fbx_fps(time_mode, state.assimp_scene);
+ ticks_per_second = AssimpUtils::get_fbx_fps(time_mode, state.assimp_scene);
}
//?
@@ -637,36 +455,31 @@ void EditorSceneImporterAssimp::_import_animation(ImportState &state, int p_anim
for (size_t i = 0; i < anim->mNumChannels; i++) {
const aiNodeAnim *track = anim->mChannels[i];
- String node_name = _assimp_get_string(track->mNodeName);
- /*
- if (node_name.find(ASSIMP_FBX_KEY) != -1) {
- String p_track_type = node_name.get_slice(ASSIMP_FBX_KEY, 1);
- if (p_track_type == "_Translation" || p_track_type == "_Rotation" || p_track_type == "_Scaling") {
- continue;
- }
- }
-*/
+ String node_name = AssimpUtils::get_assimp_string(track->mNodeName);
+
if (track->mNumRotationKeys == 0 && track->mNumPositionKeys == 0 && track->mNumScalingKeys == 0) {
continue; //do not bother
}
- bool is_bone = state.bone_owners.has(node_name);
- NodePath node_path;
- Skeleton *skeleton = NULL;
+ for (Map<Skeleton *, const Spatial *>::Element *key_value_pair = state.armature_skeletons.front(); key_value_pair; key_value_pair = key_value_pair->next()) {
+ Skeleton *skeleton = key_value_pair->key();
- if (is_bone) {
- skeleton = state.skeletons[state.bone_owners[node_name]];
- String path = state.root->get_path_to(skeleton);
- path += ":" + node_name;
- node_path = path;
- } else {
+ bool is_bone = skeleton->find_bone(node_name) != -1;
+ //print_verbose("Bone " + node_name + " is bone? " + (is_bone ? "Yes" : "No"));
+ NodePath node_path;
- ERR_CONTINUE(!state.node_map.has(node_name));
- Node *node = state.node_map[node_name];
- node_path = state.root->get_path_to(node);
- }
+ if (is_bone) {
+ String path = state.root->get_path_to(skeleton);
+ path += ":" + node_name;
+ node_path = path;
+ } else {
+ ERR_CONTINUE(!state.node_map.has(node_name));
+ Node *node = state.node_map[node_name];
+ node_path = state.root->get_path_to(node);
+ }
- _insert_animation_track(state, anim, i, p_bake_fps, animation, ticks_per_second, skeleton, node_path, node_name);
+ _insert_animation_track(state, anim, i, p_bake_fps, animation, ticks_per_second, skeleton, node_path, node_name);
+ }
}
//blend shape tracks
@@ -675,7 +488,7 @@ void EditorSceneImporterAssimp::_import_animation(ImportState &state, int p_anim
const aiMeshMorphAnim *anim_mesh = anim->mMorphMeshChannels[i];
- const String prop_name = _assimp_get_string(anim_mesh->mName);
+ const String prop_name = AssimpUtils::get_assimp_string(anim_mesh->mName);
const String mesh_name = prop_name.split("*")[0];
ERR_CONTINUE(prop_name.split("*").size() != 2);
@@ -715,513 +528,22 @@ void EditorSceneImporterAssimp::_import_animation(ImportState &state, int p_anim
}
}
-float EditorSceneImporterAssimp::_get_fbx_fps(int32_t time_mode, const aiScene *p_scene) {
- switch (time_mode) {
- case AssetImportFbx::TIME_MODE_DEFAULT: return 24; //hack
- case AssetImportFbx::TIME_MODE_120: return 120;
- case AssetImportFbx::TIME_MODE_100: return 100;
- case AssetImportFbx::TIME_MODE_60: return 60;
- case AssetImportFbx::TIME_MODE_50: return 50;
- case AssetImportFbx::TIME_MODE_48: return 48;
- case AssetImportFbx::TIME_MODE_30: return 30;
- case AssetImportFbx::TIME_MODE_30_DROP: return 30;
- case AssetImportFbx::TIME_MODE_NTSC_DROP_FRAME: return 29.9700262f;
- case AssetImportFbx::TIME_MODE_NTSC_FULL_FRAME: return 29.9700262f;
- case AssetImportFbx::TIME_MODE_PAL: return 25;
- case AssetImportFbx::TIME_MODE_CINEMA: return 24;
- case AssetImportFbx::TIME_MODE_1000: return 1000;
- case AssetImportFbx::TIME_MODE_CINEMA_ND: return 23.976f;
- case AssetImportFbx::TIME_MODE_CUSTOM:
- int32_t frame_rate;
- p_scene->mMetaData->Get("FrameRate", frame_rate);
- return frame_rate;
- }
- return 0;
-}
-
-Transform EditorSceneImporterAssimp::_get_global_assimp_node_transform(const aiNode *p_current_node) {
- aiNode const *current_node = p_current_node;
- Transform xform;
- while (current_node != NULL) {
- xform = _assimp_matrix_transform(current_node->mTransformation) * xform;
- current_node = current_node->mParent;
- }
- return xform;
-}
-
-Ref<Texture> EditorSceneImporterAssimp::_load_texture(ImportState &state, String p_path) {
- Vector<String> split_path = p_path.get_basename().split("*");
- if (split_path.size() == 2) {
- size_t texture_idx = split_path[1].to_int();
- ERR_FAIL_COND_V(texture_idx >= state.assimp_scene->mNumTextures, Ref<Texture>());
- aiTexture *tex = state.assimp_scene->mTextures[texture_idx];
- String filename = _assimp_raw_string_to_string(tex->mFilename);
- filename = filename.get_file();
- print_verbose("Open Asset Import: Loading embedded texture " + filename);
- if (tex->mHeight == 0) {
- if (tex->CheckFormat("png")) {
- Ref<Image> img = Image::_png_mem_loader_func((uint8_t *)tex->pcData, tex->mWidth);
- ERR_FAIL_COND_V(img.is_null(), Ref<Texture>());
-
- Ref<ImageTexture> t;
- t.instance();
- t->create_from_image(img);
- t->set_storage(ImageTexture::STORAGE_COMPRESS_LOSSY);
- return t;
- } else if (tex->CheckFormat("jpg")) {
- Ref<Image> img = Image::_jpg_mem_loader_func((uint8_t *)tex->pcData, tex->mWidth);
- ERR_FAIL_COND_V(img.is_null(), Ref<Texture>());
- Ref<ImageTexture> t;
- t.instance();
- t->create_from_image(img);
- t->set_storage(ImageTexture::STORAGE_COMPRESS_LOSSY);
- return t;
- } else if (tex->CheckFormat("dds")) {
- ERR_FAIL_V_MSG(Ref<Texture>(), "Open Asset Import: Embedded dds not implemented.");
- //Ref<Image> img = Image::_dds_mem_loader_func((uint8_t *)tex->pcData, tex->mWidth);
- //ERR_FAIL_COND_V(img.is_null(), Ref<Texture>());
- //Ref<ImageTexture> t;
- //t.instance();
- //t->create_from_image(img);
- //t->set_storage(ImageTexture::STORAGE_COMPRESS_LOSSY);
- //return t;
- }
- } else {
- Ref<Image> img;
- img.instance();
- PoolByteArray arr;
- uint32_t size = tex->mWidth * tex->mHeight;
- arr.resize(size);
- memcpy(arr.write().ptr(), tex->pcData, size);
- ERR_FAIL_COND_V(arr.size() % 4 != 0, Ref<Texture>());
- //ARGB8888 to RGBA8888
- for (int32_t i = 0; i < arr.size() / 4; i++) {
- arr.write().ptr()[(4 * i) + 3] = arr[(4 * i) + 0];
- arr.write().ptr()[(4 * i) + 0] = arr[(4 * i) + 1];
- arr.write().ptr()[(4 * i) + 1] = arr[(4 * i) + 2];
- arr.write().ptr()[(4 * i) + 2] = arr[(4 * i) + 3];
- }
- img->create(tex->mWidth, tex->mHeight, true, Image::FORMAT_RGBA8, arr);
- ERR_FAIL_COND_V(img.is_null(), Ref<Texture>());
-
- Ref<ImageTexture> t;
- t.instance();
- t->create_from_image(img);
- t->set_storage(ImageTexture::STORAGE_COMPRESS_LOSSY);
- return t;
- }
- return Ref<Texture>();
- }
- Ref<Texture> p_texture = ResourceLoader::load(p_path, "Texture");
- return p_texture;
-}
-
-Ref<Material> EditorSceneImporterAssimp::_generate_material_from_index(ImportState &state, int p_index, bool p_double_sided) {
-
- ERR_FAIL_INDEX_V(p_index, (int)state.assimp_scene->mNumMaterials, Ref<Material>());
-
- aiMaterial *ai_material = state.assimp_scene->mMaterials[p_index];
- Ref<SpatialMaterial> mat;
- mat.instance();
-
- int32_t mat_two_sided = 0;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_TWOSIDED, mat_two_sided)) {
- if (mat_two_sided > 0) {
- mat->set_cull_mode(SpatialMaterial::CULL_DISABLED);
- }
- }
-
- //const String mesh_name = _assimp_get_string(ai_mesh->mName);
- aiString mat_name;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_NAME, mat_name)) {
- mat->set_name(_assimp_get_string(mat_name));
- }
-
- aiTextureType tex_normal = aiTextureType_NORMALS;
- {
- aiString ai_filename = aiString();
- String filename = "";
- aiTextureMapMode map_mode[2];
-
- if (AI_SUCCESS == ai_material->GetTexture(tex_normal, 0, &ai_filename, NULL, NULL, NULL, NULL, map_mode)) {
- filename = _assimp_raw_string_to_string(ai_filename);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
-
- if (texture.is_valid()) {
- _set_texture_mapping_mode(map_mode, texture);
- mat->set_feature(SpatialMaterial::Feature::FEATURE_NORMAL_MAPPING, true);
- mat->set_texture(SpatialMaterial::TEXTURE_NORMAL, texture);
- }
- }
- }
- }
-
- {
- aiString ai_filename = aiString();
- String filename = "";
-
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_NORMAL_TEXTURE, ai_filename)) {
- filename = _assimp_raw_string_to_string(ai_filename);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- if (texture != NULL) {
- mat->set_feature(SpatialMaterial::Feature::FEATURE_NORMAL_MAPPING, true);
- mat->set_texture(SpatialMaterial::TEXTURE_NORMAL, texture);
- }
- }
- }
- }
-
- aiTextureType tex_emissive = aiTextureType_EMISSIVE;
-
- if (ai_material->GetTextureCount(tex_emissive) > 0) {
-
- aiString ai_filename = aiString();
- String filename = "";
- aiTextureMapMode map_mode[2];
-
- if (AI_SUCCESS == ai_material->GetTexture(tex_emissive, 0, &ai_filename, NULL, NULL, NULL, NULL, map_mode)) {
- filename = _assimp_raw_string_to_string(ai_filename);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- if (texture != NULL) {
- _set_texture_mapping_mode(map_mode, texture);
- mat->set_feature(SpatialMaterial::FEATURE_EMISSION, true);
- mat->set_texture(SpatialMaterial::TEXTURE_EMISSION, texture);
- }
- }
- }
- }
-
- aiTextureType tex_albedo = aiTextureType_DIFFUSE;
- if (ai_material->GetTextureCount(tex_albedo) > 0) {
-
- aiString ai_filename = aiString();
- String filename = "";
- aiTextureMapMode map_mode[2];
- if (AI_SUCCESS == ai_material->GetTexture(tex_albedo, 0, &ai_filename, NULL, NULL, NULL, NULL, map_mode)) {
- filename = _assimp_raw_string_to_string(ai_filename);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- if (texture != NULL) {
- if (texture->get_data()->detect_alpha() != Image::ALPHA_NONE) {
- _set_texture_mapping_mode(map_mode, texture);
- mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- mat->set_depth_draw_mode(SpatialMaterial::DepthDrawMode::DEPTH_DRAW_ALPHA_OPAQUE_PREPASS);
- }
- mat->set_texture(SpatialMaterial::TEXTURE_ALBEDO, texture);
- }
- }
- }
- } else {
- aiColor4D clr_diffuse;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_COLOR_DIFFUSE, clr_diffuse)) {
- if (Math::is_equal_approx(clr_diffuse.a, 1.0f) == false) {
- mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- mat->set_depth_draw_mode(SpatialMaterial::DepthDrawMode::DEPTH_DRAW_ALPHA_OPAQUE_PREPASS);
- }
- mat->set_albedo(Color(clr_diffuse.r, clr_diffuse.g, clr_diffuse.b, clr_diffuse.a));
- }
- }
-
- aiString tex_gltf_base_color_path = aiString();
- aiTextureMapMode map_mode[2];
- if (AI_SUCCESS == ai_material->GetTexture(AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_BASE_COLOR_TEXTURE, &tex_gltf_base_color_path, NULL, NULL, NULL, NULL, map_mode)) {
- String filename = _assimp_raw_string_to_string(tex_gltf_base_color_path);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- _find_texture_path(state.path, path, found);
- if (texture != NULL) {
- if (texture->get_data()->detect_alpha() == Image::ALPHA_BLEND) {
- _set_texture_mapping_mode(map_mode, texture);
- mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- mat->set_depth_draw_mode(SpatialMaterial::DepthDrawMode::DEPTH_DRAW_ALPHA_OPAQUE_PREPASS);
- }
- mat->set_texture(SpatialMaterial::TEXTURE_ALBEDO, texture);
- }
- }
- } else {
- aiColor4D pbr_base_color;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_BASE_COLOR_FACTOR, pbr_base_color)) {
- if (Math::is_equal_approx(pbr_base_color.a, 1.0f) == false) {
- mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- mat->set_depth_draw_mode(SpatialMaterial::DepthDrawMode::DEPTH_DRAW_ALPHA_OPAQUE_PREPASS);
- }
- mat->set_albedo(Color(pbr_base_color.r, pbr_base_color.g, pbr_base_color.b, pbr_base_color.a));
- }
- }
- {
- aiString tex_fbx_pbs_base_color_path = aiString();
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_BASE_COLOR_TEXTURE, tex_fbx_pbs_base_color_path)) {
- String filename = _assimp_raw_string_to_string(tex_fbx_pbs_base_color_path);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- _find_texture_path(state.path, path, found);
- if (texture != NULL) {
- if (texture->get_data()->detect_alpha() == Image::ALPHA_BLEND) {
- mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- mat->set_depth_draw_mode(SpatialMaterial::DepthDrawMode::DEPTH_DRAW_ALPHA_OPAQUE_PREPASS);
- }
- mat->set_texture(SpatialMaterial::TEXTURE_ALBEDO, texture);
- }
- }
- } else {
- aiColor4D pbr_base_color;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_BASE_COLOR_FACTOR, pbr_base_color)) {
- mat->set_albedo(Color(pbr_base_color.r, pbr_base_color.g, pbr_base_color.b, pbr_base_color.a));
- }
- }
-
- aiUVTransform pbr_base_color_uv_xform;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_BASE_COLOR_UV_XFORM, pbr_base_color_uv_xform)) {
- mat->set_uv1_offset(Vector3(pbr_base_color_uv_xform.mTranslation.x, pbr_base_color_uv_xform.mTranslation.y, 0.0f));
- mat->set_uv1_scale(Vector3(pbr_base_color_uv_xform.mScaling.x, pbr_base_color_uv_xform.mScaling.y, 1.0f));
- }
- }
-
- {
- aiString tex_fbx_pbs_normal_path = aiString();
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_NORMAL_TEXTURE, tex_fbx_pbs_normal_path)) {
- String filename = _assimp_raw_string_to_string(tex_fbx_pbs_normal_path);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- _find_texture_path(state.path, path, found);
- if (texture != NULL) {
- mat->set_feature(SpatialMaterial::Feature::FEATURE_NORMAL_MAPPING, true);
- mat->set_texture(SpatialMaterial::TEXTURE_NORMAL, texture);
- }
- }
- }
- }
-
- if (p_double_sided) {
- mat->set_cull_mode(SpatialMaterial::CULL_DISABLED);
- }
-
- {
- aiString tex_fbx_stingray_normal_path = aiString();
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_STINGRAY_NORMAL_TEXTURE, tex_fbx_stingray_normal_path)) {
- String filename = _assimp_raw_string_to_string(tex_fbx_stingray_normal_path);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- _find_texture_path(state.path, path, found);
- if (texture != NULL) {
- mat->set_feature(SpatialMaterial::Feature::FEATURE_NORMAL_MAPPING, true);
- mat->set_texture(SpatialMaterial::TEXTURE_NORMAL, texture);
- }
- }
- }
- }
-
- {
- aiString tex_fbx_pbs_base_color_path = aiString();
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_STINGRAY_COLOR_TEXTURE, tex_fbx_pbs_base_color_path)) {
- String filename = _assimp_raw_string_to_string(tex_fbx_pbs_base_color_path);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- _find_texture_path(state.path, path, found);
- if (texture != NULL) {
- if (texture->get_data()->detect_alpha() == Image::ALPHA_BLEND) {
- mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- mat->set_depth_draw_mode(SpatialMaterial::DepthDrawMode::DEPTH_DRAW_ALPHA_OPAQUE_PREPASS);
- }
- mat->set_texture(SpatialMaterial::TEXTURE_ALBEDO, texture);
- }
- }
- } else {
- aiColor4D pbr_base_color;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_STINGRAY_BASE_COLOR_FACTOR, pbr_base_color)) {
- mat->set_albedo(Color(pbr_base_color.r, pbr_base_color.g, pbr_base_color.b, pbr_base_color.a));
- }
- }
-
- aiUVTransform pbr_base_color_uv_xform;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_STINGRAY_COLOR_UV_XFORM, pbr_base_color_uv_xform)) {
- mat->set_uv1_offset(Vector3(pbr_base_color_uv_xform.mTranslation.x, pbr_base_color_uv_xform.mTranslation.y, 0.0f));
- mat->set_uv1_scale(Vector3(pbr_base_color_uv_xform.mScaling.x, pbr_base_color_uv_xform.mScaling.y, 1.0f));
- }
- }
-
- {
- aiString tex_fbx_pbs_emissive_path = aiString();
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_STINGRAY_EMISSIVE_TEXTURE, tex_fbx_pbs_emissive_path)) {
- String filename = _assimp_raw_string_to_string(tex_fbx_pbs_emissive_path);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- _find_texture_path(state.path, path, found);
- if (texture != NULL) {
- if (texture->get_data()->detect_alpha() == Image::ALPHA_BLEND) {
- mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- mat->set_depth_draw_mode(SpatialMaterial::DepthDrawMode::DEPTH_DRAW_ALPHA_OPAQUE_PREPASS);
- }
- mat->set_texture(SpatialMaterial::TEXTURE_ALBEDO, texture);
- }
- }
- } else {
- aiColor4D pbr_emmissive_color;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_STINGRAY_EMISSIVE_FACTOR, pbr_emmissive_color)) {
- mat->set_emission(Color(pbr_emmissive_color.r, pbr_emmissive_color.g, pbr_emmissive_color.b, pbr_emmissive_color.a));
- }
- }
-
- real_t pbr_emission_intensity;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_STINGRAY_EMISSIVE_INTENSITY_FACTOR, pbr_emission_intensity)) {
- mat->set_emission_energy(pbr_emission_intensity);
- }
- }
-
- aiString tex_gltf_pbr_metallicroughness_path;
- if (AI_SUCCESS == ai_material->GetTexture(AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLICROUGHNESS_TEXTURE, &tex_gltf_pbr_metallicroughness_path)) {
- String filename = _assimp_raw_string_to_string(tex_gltf_pbr_metallicroughness_path);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- if (texture != NULL) {
- mat->set_texture(SpatialMaterial::TEXTURE_METALLIC, texture);
- mat->set_metallic_texture_channel(SpatialMaterial::TEXTURE_CHANNEL_BLUE);
- mat->set_texture(SpatialMaterial::TEXTURE_ROUGHNESS, texture);
- mat->set_roughness_texture_channel(SpatialMaterial::TEXTURE_CHANNEL_GREEN);
- }
- }
- } else {
- float pbr_roughness = 0.0f;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_ROUGHNESS_FACTOR, pbr_roughness)) {
- mat->set_roughness(pbr_roughness);
- }
- float pbr_metallic = 0.0f;
-
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLIC_FACTOR, pbr_metallic)) {
- mat->set_metallic(pbr_metallic);
- }
- }
- {
- aiString tex_fbx_pbs_metallic_path;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_STINGRAY_METALLIC_TEXTURE, tex_fbx_pbs_metallic_path)) {
- String filename = _assimp_raw_string_to_string(tex_fbx_pbs_metallic_path);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- if (texture != NULL) {
- mat->set_texture(SpatialMaterial::TEXTURE_METALLIC, texture);
- mat->set_metallic_texture_channel(SpatialMaterial::TEXTURE_CHANNEL_GRAYSCALE);
- }
- }
- } else {
- float pbr_metallic = 0.0f;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_STINGRAY_METALLIC_FACTOR, pbr_metallic)) {
- mat->set_metallic(pbr_metallic);
- }
- }
-
- aiString tex_fbx_pbs_rough_path;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_STINGRAY_ROUGHNESS_TEXTURE, tex_fbx_pbs_rough_path)) {
- String filename = _assimp_raw_string_to_string(tex_fbx_pbs_rough_path);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- if (texture != NULL) {
- mat->set_texture(SpatialMaterial::TEXTURE_ROUGHNESS, texture);
- mat->set_roughness_texture_channel(SpatialMaterial::TEXTURE_CHANNEL_GRAYSCALE);
- }
- }
- } else {
- float pbr_roughness = 0.04f;
-
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_STINGRAY_ROUGHNESS_FACTOR, pbr_roughness)) {
- mat->set_roughness(pbr_roughness);
- }
- }
- }
-
- {
- aiString tex_fbx_pbs_metallic_path;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_METALNESS_TEXTURE, tex_fbx_pbs_metallic_path)) {
- String filename = _assimp_raw_string_to_string(tex_fbx_pbs_metallic_path);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- if (texture != NULL) {
- mat->set_texture(SpatialMaterial::TEXTURE_METALLIC, texture);
- mat->set_metallic_texture_channel(SpatialMaterial::TEXTURE_CHANNEL_GRAYSCALE);
- }
- }
- } else {
- float pbr_metallic = 0.0f;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_METALNESS_FACTOR, pbr_metallic)) {
- mat->set_metallic(pbr_metallic);
- }
- }
-
- aiString tex_fbx_pbs_rough_path;
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_DIFFUSE_ROUGHNESS_TEXTURE, tex_fbx_pbs_rough_path)) {
- String filename = _assimp_raw_string_to_string(tex_fbx_pbs_rough_path);
- String path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
- bool found = false;
- _find_texture_path(state.path, path, found);
- if (found) {
- Ref<Texture> texture = _load_texture(state, path);
- if (texture != NULL) {
- mat->set_texture(SpatialMaterial::TEXTURE_ROUGHNESS, texture);
- mat->set_roughness_texture_channel(SpatialMaterial::TEXTURE_CHANNEL_GRAYSCALE);
- }
- }
- } else {
- float pbr_roughness = 0.04f;
-
- if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_DIFFUSE_ROUGHNESS_FACTOR, pbr_roughness)) {
- mat->set_roughness(pbr_roughness);
- }
- }
- }
-
- return mat;
-}
-
-Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportState &state, const Vector<int> &p_surface_indices, Skeleton *p_skeleton, bool p_double_sided_material) {
+//
+// Mesh Generation from indicies ? why do we need so much mesh code
+// [debt needs looked into]
+Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(
+ ImportState &state,
+ const Vector<int> &p_surface_indices,
+ const aiNode *assimp_node,
+ Skeleton *p_skeleton) {
Ref<ArrayMesh> mesh;
mesh.instance();
bool has_uvs = false;
+ //
+ // Process Vertex Weights
+ //
for (int i = 0; i < p_surface_indices.size(); i++) {
const unsigned int mesh_idx = p_surface_indices[i];
const aiMesh *ai_mesh = state.assimp_scene->mMeshes[mesh_idx];
@@ -1231,7 +553,7 @@ Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportS
if (p_skeleton) {
for (size_t b = 0; b < ai_mesh->mNumBones; b++) {
aiBone *bone = ai_mesh->mBones[b];
- String bone_name = _assimp_get_string(bone->mName);
+ String bone_name = AssimpUtils::get_assimp_string(bone->mName);
int bone_index = p_skeleton->find_bone(bone_name);
ERR_CONTINUE(bone_index == -1); //bone refers to an unexisting index, wtf.
@@ -1244,7 +566,6 @@ Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportS
uint32_t vertex_index = ai_weights.mVertexId;
bi.bone = bone_index;
bi.weight = ai_weights.mWeight;
- ;
if (!vertex_weights.has(vertex_index)) {
vertex_weights[vertex_index] = Vector<BoneInfo>();
@@ -1255,23 +576,34 @@ Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportS
}
}
+ //
+ // Create mesh from data from assimp
+ //
+
Ref<SurfaceTool> st;
st.instance();
st->begin(Mesh::PRIMITIVE_TRIANGLES);
for (size_t j = 0; j < ai_mesh->mNumVertices; j++) {
+
+ // Get the texture coordinates if they exist
if (ai_mesh->HasTextureCoords(0)) {
has_uvs = true;
st->add_uv(Vector2(ai_mesh->mTextureCoords[0][j].x, 1.0f - ai_mesh->mTextureCoords[0][j].y));
}
+
if (ai_mesh->HasTextureCoords(1)) {
has_uvs = true;
st->add_uv2(Vector2(ai_mesh->mTextureCoords[1][j].x, 1.0f - ai_mesh->mTextureCoords[1][j].y));
}
+
+ // Assign vertex colors
if (ai_mesh->HasVertexColors(0)) {
Color color = Color(ai_mesh->mColors[0]->r, ai_mesh->mColors[0]->g, ai_mesh->mColors[0]->b, ai_mesh->mColors[0]->a);
st->add_color(color);
}
+
+ // Work out normal calculations? - this needs work it doesn't work properly on huestos
if (ai_mesh->mNormals != NULL) {
const aiVector3D normals = ai_mesh->mNormals[j];
const Vector3 godot_normal = Vector3(normals.x, normals.y, normals.z);
@@ -1286,6 +618,7 @@ Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportS
}
}
+ // We have vertex weights right?
if (vertex_weights.has(j)) {
Vector<BoneInfo> bone_info = vertex_weights[j];
@@ -1293,6 +626,8 @@ Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportS
bones.resize(bone_info.size());
Vector<float> weights;
weights.resize(bone_info.size());
+
+ // todo? do we really need to loop over all bones? - assimp may have helper to find all influences on this vertex.
for (int k = 0; k < bone_info.size(); k++) {
bones.write[k] = bone_info[k].bone;
weights.write[k] = bone_info[k].weight;
@@ -1302,30 +637,152 @@ Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportS
st->add_weights(weights);
}
+ // Assign vertex
const aiVector3D pos = ai_mesh->mVertices[j];
+
+ // note we must include node offset transform as this is relative to world space not local space.
Vector3 godot_pos = Vector3(pos.x, pos.y, pos.z);
st->add_vertex(godot_pos);
}
+ // fire replacement for face handling
for (size_t j = 0; j < ai_mesh->mNumFaces; j++) {
const aiFace face = ai_mesh->mFaces[j];
- ERR_CONTINUE(face.mNumIndices != 3);
- Vector<size_t> order;
- order.push_back(2);
- order.push_back(1);
- order.push_back(0);
- for (int32_t k = 0; k < order.size(); k++) {
- st->add_index(face.mIndices[order[k]]);
+ for (unsigned int k = 0; k < face.mNumIndices; k++) {
+ st->add_index(face.mIndices[k]);
}
}
+
if (ai_mesh->HasTangentsAndBitangents() == false && has_uvs) {
st->generate_tangents();
}
- Ref<Material> material;
+ aiMaterial *ai_material = state.assimp_scene->mMaterials[ai_mesh->mMaterialIndex];
+ Ref<SpatialMaterial> mat;
+ mat.instance();
+
+ int32_t mat_two_sided = 0;
+ if (AI_SUCCESS == ai_material->Get(AI_MATKEY_TWOSIDED, mat_two_sided)) {
+ if (mat_two_sided > 0) {
+ mat->set_cull_mode(SpatialMaterial::CULL_DISABLED);
+ }
+ }
+
+ const String mesh_name = AssimpUtils::get_assimp_string(ai_mesh->mName);
+ aiString mat_name;
+ if (AI_SUCCESS == ai_material->Get(AI_MATKEY_NAME, mat_name)) {
+ mat->set_name(AssimpUtils::get_assimp_string(mat_name));
+ }
+
+ // Culling handling for meshes
+
+ // cull all back faces
+ mat->set_cull_mode(SpatialMaterial::CULL_BACK);
+
+ // Now process materials
+ aiTextureType tex_diffuse = aiTextureType_DIFFUSE;
+ {
+ String filename, path;
+ AssimpImageData image_data;
+
+ if (AssimpUtils::GetAssimpTexture(state, ai_material, tex_diffuse, filename, path, image_data)) {
+ AssimpUtils::set_texture_mapping_mode(image_data.map_mode, image_data.texture);
+
+ // anything transparent must be culled
+ if (image_data.raw_image->detect_alpha() != Image::ALPHA_NONE) {
+ mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
+ mat->set_depth_draw_mode(SpatialMaterial::DepthDrawMode::DEPTH_DRAW_ALPHA_OPAQUE_PREPASS);
+ mat->set_cull_mode(SpatialMaterial::CULL_DISABLED); // since you can see both sides in transparent mode
+ }
+
+ mat->set_texture(SpatialMaterial::TEXTURE_ALBEDO, image_data.texture);
+ }
+
+ aiColor4D clr_diffuse;
+ if (AI_SUCCESS == ai_material->Get(AI_MATKEY_COLOR_DIFFUSE, clr_diffuse)) {
+ if (Math::is_equal_approx(clr_diffuse.a, 1.0f) == false) {
+ mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
+ mat->set_depth_draw_mode(SpatialMaterial::DepthDrawMode::DEPTH_DRAW_ALPHA_OPAQUE_PREPASS);
+ mat->set_cull_mode(SpatialMaterial::CULL_DISABLED); // since you can see both sides in transparent mode
+ }
+ mat->set_albedo(Color(clr_diffuse.r, clr_diffuse.g, clr_diffuse.b, clr_diffuse.a));
+ }
+ }
+
+ aiTextureType tex_normal = aiTextureType_NORMALS;
+ {
+ String filename, path;
+ Ref<ImageTexture> texture;
+ AssimpImageData image_data;
+
+ // Process texture normal map
+ if (AssimpUtils::GetAssimpTexture(state, ai_material, tex_normal, filename, path, image_data)) {
+ AssimpUtils::set_texture_mapping_mode(image_data.map_mode, image_data.texture);
+ mat->set_feature(SpatialMaterial::Feature::FEATURE_NORMAL_MAPPING, true);
+ mat->set_texture(SpatialMaterial::TEXTURE_NORMAL, image_data.texture);
+ } else {
+ aiString texture_path;
+ if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_NORMAL_TEXTURE, AI_PROPERTIES, texture_path)) {
+ if (AssimpUtils::CreateAssimpTexture(state, texture_path, filename, path, image_data)) {
+ mat->set_feature(SpatialMaterial::Feature::FEATURE_NORMAL_MAPPING, true);
+ mat->set_texture(SpatialMaterial::TEXTURE_NORMAL, image_data.texture);
+ }
+ }
+ }
+ }
+
+ aiTextureType tex_emissive = aiTextureType_EMISSIVE;
+ {
+ String filename = "";
+ String path = "";
+ Ref<Image> texture;
+ AssimpImageData image_data;
+
+ if (AssimpUtils::GetAssimpTexture(state, ai_material, tex_emissive, filename, path, image_data)) {
+ AssimpUtils::set_texture_mapping_mode(image_data.map_mode, image_data.texture);
+ mat->set_feature(SpatialMaterial::FEATURE_EMISSION, true);
+ mat->set_texture(SpatialMaterial::TEXTURE_EMISSION, image_data.texture);
+ } else {
+ // Process emission textures
+ aiString texture_emissive_path;
+ if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_EMISSION_TEXTURE, AI_PROPERTIES, texture_emissive_path)) {
+ if (AssimpUtils::CreateAssimpTexture(state, texture_emissive_path, filename, path, image_data)) {
+ mat->set_feature(SpatialMaterial::FEATURE_EMISSION, true);
+ mat->set_texture(SpatialMaterial::TEXTURE_EMISSION, image_data.texture);
+ }
+ } else {
+ float pbr_emission = 0.0f;
+ if (AI_SUCCESS == ai_material->Get(AI_MATKEY_FBX_MAYA_EMISSIVE_FACTOR, AI_NULL, pbr_emission)) {
+ mat->set_emission(Color(pbr_emission, pbr_emission, pbr_emission, 1.0f));
+ }
+ }
+ }
+ }
+
+ aiTextureType tex_specular = aiTextureType_SPECULAR;
+ {
+ String filename, path;
+ Ref<ImageTexture> texture;
+ AssimpImageData image_data;
+
+ // Process texture normal map
+ if (AssimpUtils::GetAssimpTexture(state, ai_material, tex_specular, filename, path, image_data)) {
+ AssimpUtils::set_texture_mapping_mode(image_data.map_mode, image_data.texture);
+ mat->set_texture(SpatialMaterial::TEXTURE_METALLIC, image_data.texture);
+ }
+ }
- if (!state.material_cache.has(ai_mesh->mMaterialIndex)) {
- material = _generate_material_from_index(state, ai_mesh->mMaterialIndex, p_double_sided_material);
+ aiTextureType tex_roughness = aiTextureType_SHININESS;
+ {
+ String filename, path;
+ Ref<ImageTexture> texture;
+ AssimpImageData image_data;
+
+ // Process texture normal map
+ if (AssimpUtils::GetAssimpTexture(state, ai_material, tex_roughness, filename, path, image_data)) {
+ AssimpUtils::set_texture_mapping_mode(image_data.map_mode, image_data.texture);
+ mat->set_texture(SpatialMaterial::TEXTURE_ROUGHNESS, image_data.texture);
+ }
}
Array array_mesh = st->commit_to_arrays();
@@ -1335,16 +792,13 @@ Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportS
Map<uint32_t, String> morph_mesh_idx_names;
for (size_t j = 0; j < ai_mesh->mNumAnimMeshes; j++) {
- if (i == 0) {
- //only do this the first time
- String ai_anim_mesh_name = _assimp_get_string(ai_mesh->mAnimMeshes[j]->mName);
- mesh->set_blend_shape_mode(Mesh::BLEND_SHAPE_MODE_NORMALIZED);
- if (ai_anim_mesh_name.empty()) {
- ai_anim_mesh_name = String("morph_") + itos(j);
- }
- mesh->add_blend_shape(ai_anim_mesh_name);
+ String ai_anim_mesh_name = AssimpUtils::get_assimp_string(ai_mesh->mAnimMeshes[j]->mName);
+ mesh->set_blend_shape_mode(Mesh::BLEND_SHAPE_MODE_NORMALIZED);
+ if (ai_anim_mesh_name.empty()) {
+ ai_anim_mesh_name = String("morph_") + itos(j);
}
-
+ mesh->add_blend_shape(ai_anim_mesh_name);
+ morph_mesh_idx_names.insert(j, ai_anim_mesh_name);
Array array_copy;
array_copy.resize(VisualServer::ARRAY_MAX);
@@ -1363,12 +817,11 @@ Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportS
vertices.write()[l] = position;
}
PoolVector3Array new_vertices = array_copy[VisualServer::ARRAY_VERTEX].duplicate(true);
-
- for (int32_t l = 0; l < vertices.size(); l++) {
+ ERR_CONTINUE(vertices.size() != new_vertices.size());
+ for (int32_t l = 0; l < new_vertices.size(); l++) {
PoolVector3Array::Write w = new_vertices.write();
w[l] = vertices[l];
}
- ERR_CONTINUE(vertices.size() != new_vertices.size());
array_copy[VisualServer::ARRAY_VERTEX] = new_vertices;
}
@@ -1382,7 +835,7 @@ Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportS
colors.write()[l] = color;
}
PoolColorArray new_colors = array_copy[VisualServer::ARRAY_COLOR].duplicate(true);
-
+ ERR_CONTINUE(colors.size() != new_colors.size());
for (int32_t l = 0; l < colors.size(); l++) {
PoolColorArray::Write w = new_colors.write();
w[l] = colors[l];
@@ -1394,12 +847,12 @@ Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportS
PoolVector3Array normals;
normals.resize(num_vertices);
for (size_t l = 0; l < num_vertices; l++) {
- const aiVector3D ai_normal = ai_mesh->mAnimMeshes[i]->mNormals[l];
+ const aiVector3D ai_normal = ai_mesh->mAnimMeshes[j]->mNormals[l];
Vector3 normal = Vector3(ai_normal.x, ai_normal.y, ai_normal.z);
normals.write()[l] = normal;
}
PoolVector3Array new_normals = array_copy[VisualServer::ARRAY_NORMAL].duplicate(true);
-
+ ERR_CONTINUE(normals.size() != new_normals.size());
for (int l = 0; l < normals.size(); l++) {
PoolVector3Array::Write w = new_normals.write();
w[l] = normals[l];
@@ -1412,7 +865,7 @@ Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportS
tangents.resize(num_vertices);
PoolColorArray::Write w = tangents.write();
for (size_t l = 0; l < num_vertices; l++) {
- _calc_tangent_from_mesh(ai_mesh, j, l, l, w);
+ AssimpUtils::calc_tangent_from_mesh(ai_mesh, j, l, l, w);
}
PoolRealArray new_tangents = array_copy[VisualServer::ARRAY_TANGENT].duplicate(true);
ERR_CONTINUE(new_tangents.size() != tangents.size() * 4);
@@ -1422,340 +875,388 @@ Ref<Mesh> EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportS
new_tangents.write()[l + 2] = tangents[l].b;
new_tangents.write()[l + 3] = tangents[l].a;
}
-
array_copy[VisualServer::ARRAY_TANGENT] = new_tangents;
}
morphs[j] = array_copy;
}
-
mesh->add_surface_from_arrays(primitive, array_mesh, morphs);
- mesh->surface_set_material(i, material);
- mesh->surface_set_name(i, _assimp_get_string(ai_mesh->mName));
+ mesh->surface_set_material(i, mat);
+ mesh->surface_set_name(i, AssimpUtils::get_assimp_string(ai_mesh->mName));
}
return mesh;
}
-void EditorSceneImporterAssimp::_generate_node(ImportState &state, const aiNode *p_assimp_node, Node *p_parent) {
+/* to be moved into assimp */
+aiBone *get_bone_by_name(const aiScene *scene, aiString bone_name) {
+ for (unsigned int mesh_id = 0; mesh_id < scene->mNumMeshes; ++mesh_id) {
+ aiMesh *mesh = scene->mMeshes[mesh_id];
- Spatial *new_node = NULL;
- String node_name = _assimp_get_string(p_assimp_node->mName);
- Transform node_transform = _assimp_matrix_transform(p_assimp_node->mTransformation);
-
- if (p_assimp_node->mNumMeshes > 0) {
- /* MESH NODE */
- Ref<Mesh> mesh;
- Skeleton *skeleton = NULL;
- {
+ // iterate over all the bones on the mesh for this node only!
+ for (unsigned int boneIndex = 0; boneIndex < mesh->mNumBones; boneIndex++) {
- //see if we have mesh cache for this.
- Vector<int> surface_indices;
- for (uint32_t i = 0; i < p_assimp_node->mNumMeshes; i++) {
- int mesh_index = p_assimp_node->mMeshes[i];
- surface_indices.push_back(mesh_index);
-
- //take the chance and attempt to find the skeleton from the bones
- if (!skeleton) {
- aiMesh *ai_mesh = state.assimp_scene->mMeshes[p_assimp_node->mMeshes[i]];
- for (uint32_t j = 0; j < ai_mesh->mNumBones; j++) {
- aiBone *bone = ai_mesh->mBones[j];
- String bone_name = _assimp_get_string(bone->mName);
- if (state.bone_owners.has(bone_name)) {
- skeleton = state.skeletons[state.bone_owners[bone_name]];
- break;
- }
- }
- }
- }
- surface_indices.sort();
- String mesh_key;
- for (int i = 0; i < surface_indices.size(); i++) {
- if (i > 0) {
- mesh_key += ":";
- }
- mesh_key += itos(surface_indices[i]);
+ aiBone *bone = mesh->mBones[boneIndex];
+ if (bone->mName == bone_name) {
+ printf("matched bone by name: %s\n", bone->mName.C_Str());
+ return bone;
}
+ }
+ }
- if (!state.mesh_cache.has(mesh_key)) {
- //adding cache
- aiString cull_mode; //cull is on mesh, which is kind of stupid tbh
- bool double_sided_material = false;
- if (p_assimp_node->mMetaData) {
- p_assimp_node->mMetaData->Get("Culling", cull_mode);
- }
- if (cull_mode.length != 0 && cull_mode == aiString("CullingOff")) {
- double_sided_material = true;
- }
+ return NULL;
+}
- mesh = _generate_mesh_from_surface_indices(state, surface_indices, skeleton, double_sided_material);
- state.mesh_cache[mesh_key] = mesh;
+/**
+ * Create a new mesh for the node supplied
+ */
+void EditorSceneImporterAssimp::create_mesh(ImportState &state, const aiNode *assimp_node, const String &node_name, Node *current_node, Node *parent_node, Transform node_transform) {
+ /* MESH NODE */
+ Ref<Mesh> mesh;
+ Skeleton *skeleton = NULL;
+ // see if we have mesh cache for this.
+ Vector<int> surface_indices;
+ for (uint32_t i = 0; i < assimp_node->mNumMeshes; i++) {
+ int mesh_index = assimp_node->mMeshes[i];
+ aiMesh *ai_mesh = state.assimp_scene->mMeshes[assimp_node->mMeshes[i]];
+
+ // Map<aiBone*, Skeleton*> // this is what we need
+ if (ai_mesh->mNumBones > 0) {
+ // we only need the first bone to retrieve the skeleton
+ const aiBone *first = ai_mesh->mBones[0];
+
+ ERR_FAIL_COND(first == NULL);
+
+ Map<const aiBone *, Skeleton *>::Element *match = state.bone_to_skeleton_lookup.find(first);
+ if (match != NULL) {
+ skeleton = match->value();
+
+ if (skeleton == NULL) {
+ print_error("failed to find bone skeleton for bone: " + AssimpUtils::get_assimp_string(first->mName));
+ } else {
+ print_verbose("successfully found skeleton for first bone on mesh, can properly handle animations now!");
+ }
+ // I really need the skeleton and bone to be known as this is something flaky in model exporters.
+ ERR_FAIL_COND(skeleton == NULL); // should not happen if bone was successfully created in previous step.
}
-
- mesh = state.mesh_cache[mesh_key];
}
+ surface_indices.push_back(mesh_index);
+ }
- MeshInstance *mesh_node = memnew(MeshInstance);
- if (skeleton) {
- state.mesh_skeletons[mesh_node] = skeleton;
+ surface_indices.sort();
+ String mesh_key;
+ for (int i = 0; i < surface_indices.size(); i++) {
+ if (i > 0) {
+ mesh_key += ":";
}
- mesh_node->set_mesh(mesh);
- new_node = mesh_node;
-
- } else if (state.light_cache.has(node_name)) {
-
- Light *light = NULL;
- aiLight *ai_light = state.assimp_scene->mLights[state.light_cache[node_name]];
- ERR_FAIL_COND(!ai_light);
+ mesh_key += itos(surface_indices[i]);
+ }
- if (ai_light->mType == aiLightSource_DIRECTIONAL) {
- light = memnew(DirectionalLight);
- Vector3 dir = Vector3(ai_light->mDirection.y, ai_light->mDirection.x, ai_light->mDirection.z);
- dir.normalize();
- Vector3 pos = Vector3(ai_light->mPosition.x, ai_light->mPosition.y, ai_light->mPosition.z);
- Vector3 up = Vector3(ai_light->mUp.x, ai_light->mUp.y, ai_light->mUp.z);
- up.normalize();
+ if (!state.mesh_cache.has(mesh_key)) {
+ mesh = _generate_mesh_from_surface_indices(state, surface_indices, assimp_node, skeleton);
+ state.mesh_cache[mesh_key] = mesh;
+ }
- Transform light_transform;
- light_transform.set_look_at(pos, pos + dir, up);
+ //Transform transform = recursive_state.node_transform;
- node_transform *= light_transform;
+ // we must unfortunately overwrite mesh and skeleton transform with armature data
+ if (skeleton != NULL) {
+ print_verbose("Applying mesh and skeleton to armature");
+ // required for blender, maya etc
+ Map<Skeleton *, const Spatial *>::Element *match = state.armature_skeletons.find(skeleton);
+ node_transform = match->value()->get_transform();
+ }
- } else if (ai_light->mType == aiLightSource_POINT) {
- light = memnew(OmniLight);
- Vector3 pos = Vector3(ai_light->mPosition.x, ai_light->mPosition.y, ai_light->mPosition.z);
- Transform xform;
- xform.origin = pos;
+ MeshInstance *mesh_node = memnew(MeshInstance);
+ mesh = state.mesh_cache[mesh_key];
+ mesh_node->set_mesh(mesh);
- node_transform *= xform;
+ attach_new_node(state,
+ mesh_node,
+ assimp_node,
+ parent_node,
+ node_name,
+ node_transform);
- light->set_transform(xform);
+ // set this once and for all
+ if (skeleton != NULL) {
+ // root must be informed of its new child
+ parent_node->add_child(skeleton);
- //light->set_param(Light::PARAM_ATTENUATION, 1);
- } else if (ai_light->mType == aiLightSource_SPOT) {
- light = memnew(SpotLight);
+ // owner must be set after adding to tree
+ skeleton->set_owner(state.root);
- Vector3 dir = Vector3(ai_light->mDirection.y, ai_light->mDirection.x, ai_light->mDirection.z);
- dir.normalize();
- Vector3 pos = Vector3(ai_light->mPosition.x, ai_light->mPosition.y, ai_light->mPosition.z);
- Vector3 up = Vector3(ai_light->mUp.x, ai_light->mUp.y, ai_light->mUp.z);
- up.normalize();
+ skeleton->set_transform(node_transform);
- Transform light_transform;
- light_transform.set_look_at(pos, pos + dir, up);
- node_transform *= light_transform;
+ // must be done after added to tree
+ mesh_node->set_skeleton_path(mesh_node->get_path_to(skeleton));
+ }
+}
- //light->set_param(Light::PARAM_ATTENUATION, 0.0f);
- }
- ERR_FAIL_COND(light == NULL);
- light->set_color(Color(ai_light->mColorDiffuse.r, ai_light->mColorDiffuse.g, ai_light->mColorDiffuse.b));
- new_node = light;
- } else if (state.camera_cache.has(node_name)) {
+/** generate_mesh_phase_from_skeletal_mesh
+ * This must be executed after generate_nodes because the skeleton doesn't exist until that has completed the first pass
+ */
+void EditorSceneImporterAssimp::generate_mesh_phase_from_skeletal_mesh(ImportState &state) {
+ // prevent more than one skeleton existing per mesh
+ // * multiple root bones have this
+ // * this simply filters the node out if it has already been added then references the skeleton so we know the actual skeleton for this node
+ for (Map<const aiNode *, const Node *>::Element *key_value_pair = state.assimp_node_map.front(); key_value_pair; key_value_pair = key_value_pair->next()) {
+ const aiNode *assimp_node = key_value_pair->key();
+ Node *current_node = (Node *)key_value_pair->value();
+ Node *parent_node = current_node->get_parent();
- aiCamera *ai_camera = state.assimp_scene->mCameras[state.camera_cache[node_name]];
- ERR_FAIL_COND(!ai_camera);
+ ERR_CONTINUE(assimp_node == NULL);
+ ERR_CONTINUE(parent_node == NULL);
- Camera *camera = memnew(Camera);
+ String node_name = AssimpUtils::get_assimp_string(assimp_node->mName);
+ Transform node_transform = AssimpUtils::assimp_matrix_transform(assimp_node->mTransformation);
- float near = ai_camera->mClipPlaneNear;
- if (Math::is_equal_approx(near, 0.0f)) {
- near = 0.1f;
+ if (assimp_node->mNumMeshes > 0) {
+ create_mesh(state, assimp_node, node_name, current_node, parent_node, node_transform);
}
- camera->set_perspective(Math::rad2deg(ai_camera->mHorizontalFOV) * 2.0f, near, ai_camera->mClipPlaneFar);
+ }
+}
- Vector3 pos = Vector3(ai_camera->mPosition.x, ai_camera->mPosition.y, ai_camera->mPosition.z);
- Vector3 look_at = Vector3(ai_camera->mLookAt.y, ai_camera->mLookAt.x, ai_camera->mLookAt.z).normalized();
- Vector3 up = Vector3(ai_camera->mUp.x, ai_camera->mUp.y, ai_camera->mUp.z);
+/**
+ * attach_new_node
+ * configures node, assigns parent node
+**/
+void EditorSceneImporterAssimp::attach_new_node(ImportState &state, Spatial *new_node, const aiNode *node, Node *parent_node, String Name, Transform &transform) {
+ ERR_FAIL_COND(new_node == NULL);
+ ERR_FAIL_COND(node == NULL);
+ ERR_FAIL_COND(parent_node == NULL);
+ ERR_FAIL_COND(state.root == NULL);
+
+ // assign properties to new godot note
+ new_node->set_name(Name);
+ new_node->set_transform(transform);
+
+ // add element as child to parent
+ parent_node->add_child(new_node);
+
+ // owner must be set after
+ new_node->set_owner(state.root);
+
+ // cache node mapping results by name and then by aiNode*
+ state.node_map[Name] = new_node;
+ state.assimp_node_map[node] = new_node;
+}
+/**
+ * Create a light for the scene
+ * Automatically caches lights for lookup later
+ */
+void EditorSceneImporterAssimp::create_light(ImportState &state, RecursiveState &recursive_state) {
+ Light *light = NULL;
+ aiLight *ai_light = state.assimp_scene->mLights[state.light_cache[recursive_state.node_name]];
+ ERR_FAIL_COND(!ai_light);
+
+ if (ai_light->mType == aiLightSource_DIRECTIONAL) {
+ light = memnew(DirectionalLight);
+ Vector3 dir = Vector3(ai_light->mDirection.y, ai_light->mDirection.x, ai_light->mDirection.z);
+ dir.normalize();
+ Vector3 pos = Vector3(ai_light->mPosition.x, ai_light->mPosition.y, ai_light->mPosition.z);
+ Vector3 up = Vector3(ai_light->mUp.x, ai_light->mUp.y, ai_light->mUp.z);
+ up.normalize();
+
+ Transform light_transform;
+ light_transform.set_look_at(pos, pos + dir, up);
+
+ recursive_state.node_transform *= light_transform;
+
+ } else if (ai_light->mType == aiLightSource_POINT) {
+ light = memnew(OmniLight);
+ Vector3 pos = Vector3(ai_light->mPosition.x, ai_light->mPosition.y, ai_light->mPosition.z);
Transform xform;
- xform.set_look_at(pos, look_at, up);
-
- new_node = camera;
- } else if (state.bone_owners.has(node_name)) {
-
- //have to actually put the skeleton somewhere, you know.
- Skeleton *skeleton = state.skeletons[state.bone_owners[node_name]];
- if (skeleton->get_parent()) {
- //a bone for a skeleton already added..
- //could go downwards here to add meshes children of skeleton bones
- //but let's not support it for now.
- return;
- }
- //restore rest poses to local, now that we know where the skeleton finally is
- Transform skeleton_transform;
- if (p_assimp_node->mParent) {
- skeleton_transform = _get_global_assimp_node_transform(p_assimp_node->mParent);
- }
- for (int i = 0; i < skeleton->get_bone_count(); i++) {
- Transform rest = skeleton_transform.affine_inverse() * skeleton->get_bone_rest(i);
- skeleton->set_bone_rest(i, rest.affine_inverse());
- }
+ xform.origin = pos;
- skeleton->localize_rests();
- node_name = "Skeleton"; //don't use the bone root name
- node_transform = Transform(); //don't transform
+ recursive_state.node_transform *= xform;
- new_node = skeleton;
- } else {
- //generic node
- new_node = memnew(Spatial);
- }
+ light->set_transform(xform);
- {
+ //light->set_param(Light::PARAM_ATTENUATION, 1);
+ } else if (ai_light->mType == aiLightSource_SPOT) {
+ light = memnew(SpotLight);
- new_node->set_name(node_name);
- new_node->set_transform(node_transform);
- p_parent->add_child(new_node);
- new_node->set_owner(state.root);
- }
+ Vector3 dir = Vector3(ai_light->mDirection.y, ai_light->mDirection.x, ai_light->mDirection.z);
+ dir.normalize();
+ Vector3 pos = Vector3(ai_light->mPosition.x, ai_light->mPosition.y, ai_light->mPosition.z);
+ Vector3 up = Vector3(ai_light->mUp.x, ai_light->mUp.y, ai_light->mUp.z);
+ up.normalize();
- state.node_map[node_name] = new_node;
+ Transform light_transform;
+ light_transform.set_look_at(pos, pos + dir, up);
+ recursive_state.node_transform *= light_transform;
- for (size_t i = 0; i < p_assimp_node->mNumChildren; i++) {
- _generate_node(state, p_assimp_node->mChildren[i], new_node);
+ //light->set_param(Light::PARAM_ATTENUATION, 0.0f);
}
-}
+ ERR_FAIL_COND(light == NULL);
-void EditorSceneImporterAssimp::_calc_tangent_from_mesh(const aiMesh *ai_mesh, int i, int tri_index, int index, PoolColorArray::Write &w) {
- const aiVector3D normals = ai_mesh->mAnimMeshes[i]->mNormals[tri_index];
- const Vector3 godot_normal = Vector3(normals.x, normals.y, normals.z);
- const aiVector3D tangent = ai_mesh->mAnimMeshes[i]->mTangents[tri_index];
- const Vector3 godot_tangent = Vector3(tangent.x, tangent.y, tangent.z);
- const aiVector3D bitangent = ai_mesh->mAnimMeshes[i]->mBitangents[tri_index];
- const Vector3 godot_bitangent = Vector3(bitangent.x, bitangent.y, bitangent.z);
- float d = godot_normal.cross(godot_tangent).dot(godot_bitangent) > 0.0f ? 1.0f : -1.0f;
- Color plane_tangent = Color(tangent.x, tangent.y, tangent.z, d);
- w[index] = plane_tangent;
+ light->set_color(Color(ai_light->mColorDiffuse.r, ai_light->mColorDiffuse.g, ai_light->mColorDiffuse.b));
+ recursive_state.new_node = light;
+
+ attach_new_node(state,
+ recursive_state.new_node,
+ recursive_state.assimp_node,
+ recursive_state.parent_node,
+ recursive_state.node_name,
+ recursive_state.node_transform);
}
-void EditorSceneImporterAssimp::_set_texture_mapping_mode(aiTextureMapMode *map_mode, Ref<Texture> texture) {
- ERR_FAIL_COND(map_mode == NULL);
- aiTextureMapMode tex_mode = aiTextureMapMode::aiTextureMapMode_Wrap;
- //for (size_t i = 0; i < 3; i++) {
- tex_mode = map_mode[0];
- //}
- int32_t flags = Texture::FLAGS_DEFAULT;
- if (tex_mode == aiTextureMapMode_Wrap) {
- //Default
- } else if (tex_mode == aiTextureMapMode_Clamp) {
- flags = flags & ~Texture::FLAG_REPEAT;
- } else if (tex_mode == aiTextureMapMode_Mirror) {
- flags = flags | Texture::FLAG_MIRRORED_REPEAT;
+/**
+ * Create camera for the scene
+ */
+void EditorSceneImporterAssimp::create_camera(ImportState &state, RecursiveState &recursive_state) {
+ aiCamera *ai_camera = state.assimp_scene->mCameras[state.camera_cache[recursive_state.node_name]];
+ ERR_FAIL_COND(!ai_camera);
+
+ Camera *camera = memnew(Camera);
+
+ float near = ai_camera->mClipPlaneNear;
+ if (Math::is_equal_approx(near, 0.0f)) {
+ near = 0.1f;
}
- texture->set_flags(flags);
-}
+ camera->set_perspective(Math::rad2deg(ai_camera->mHorizontalFOV) * 2.0f, near, ai_camera->mClipPlaneFar);
-void EditorSceneImporterAssimp::_find_texture_path(const String &r_p_path, String &r_path, bool &r_found) {
+ Vector3 pos = Vector3(ai_camera->mPosition.x, ai_camera->mPosition.y, ai_camera->mPosition.z);
+ Vector3 look_at = Vector3(ai_camera->mLookAt.y, ai_camera->mLookAt.x, ai_camera->mLookAt.z).normalized();
+ Vector3 up = Vector3(ai_camera->mUp.x, ai_camera->mUp.y, ai_camera->mUp.z);
- _Directory dir;
+ Transform xform;
+ xform.set_look_at(pos, look_at, up);
- List<String> exts;
- ImageLoader::get_recognized_extensions(&exts);
+ recursive_state.new_node = camera;
- Vector<String> split_path = r_path.get_basename().split("*");
- if (split_path.size() == 2) {
- r_found = true;
- return;
- }
+ attach_new_node(state,
+ recursive_state.new_node,
+ recursive_state.assimp_node,
+ recursive_state.parent_node,
+ recursive_state.node_name,
+ recursive_state.node_transform);
+}
- if (dir.file_exists(r_p_path.get_base_dir() + r_path.get_file())) {
- r_path = r_p_path.get_base_dir() + r_path.get_file();
- r_found = true;
- return;
- }
+/**
+ * Create Bone
+ * Create a bone in the scene
+ */
+void EditorSceneImporterAssimp::create_bone(ImportState &state, RecursiveState &recursive_state) {
+ // for each armature node we must make a new skeleton but ensure it
+ // has a bone in the child to ensure we don't make too many
+ // the reason you must do this is because a skeleton exists per mesh?
+ // and duplicate bone names are very bad for determining what is going on.
+ aiBone *parent_bone_assimp = get_bone_by_name(state.assimp_scene, recursive_state.assimp_node->mParent->mName);
- for (int32_t i = 0; i < exts.size(); i++) {
- if (r_found) {
- return;
- }
- if (r_found == false) {
- _find_texture_path(r_p_path, dir, r_path, r_found, "." + exts[i]);
+ // set to true when you want to use skeleton reference from cache.
+ bool do_not_create_armature = false;
+
+ // prevent more than one skeleton existing per mesh
+ // * multiple root bones have this
+ // * this simply filters the node out if it has already been added then references the skeleton so we know the actual skeleton for this node
+ for (Map<Skeleton *, const Spatial *>::Element *key_value_pair = state.armature_skeletons.front(); key_value_pair; key_value_pair = key_value_pair->next()) {
+ if (key_value_pair->value() == recursive_state.parent_node) {
+ // apply the skeleton for this mesh
+ recursive_state.skeleton = key_value_pair->key();
+
+ // force this off
+ do_not_create_armature = true;
}
}
-}
-void EditorSceneImporterAssimp::_find_texture_path(const String &p_path, _Directory &dir, String &path, bool &found, String extension) {
- String name = path.get_basename() + extension;
- if (dir.file_exists(name)) {
- found = true;
- path = name;
- return;
- }
- String name_ignore_sub_directory = p_path.get_base_dir().plus_file(path.get_file().get_basename()) + extension;
- if (dir.file_exists(name_ignore_sub_directory)) {
- found = true;
- path = name_ignore_sub_directory;
- return;
- }
+ // check if parent was a bone
+ // if parent was not a bone this is the first bone.
+ // therefore parent is the 'armature'?
+ // also for multi root bone support make sure we don't already have the skeleton cached.
+ // if we do we must merge them - as this is all godot supports right now.
+ if (!parent_bone_assimp && recursive_state.skeleton == NULL && !do_not_create_armature) {
+ // create new skeleton on the root.
+ recursive_state.skeleton = memnew(Skeleton);
- String name_find_texture_sub_directory = p_path.get_base_dir() + "/textures/" + path.get_file().get_basename() + extension;
- if (dir.file_exists(name_find_texture_sub_directory)) {
- found = true;
- path = name_find_texture_sub_directory;
- return;
- }
- String name_find_texture_upper_sub_directory = p_path.get_base_dir() + "/Textures/" + path.get_file().get_basename() + extension;
- if (dir.file_exists(name_find_texture_upper_sub_directory)) {
- found = true;
- path = name_find_texture_upper_sub_directory;
- return;
- }
- String name_find_texture_outside_sub_directory = p_path.get_base_dir() + "/../textures/" + path.get_file().get_basename() + extension;
- if (dir.file_exists(name_find_texture_outside_sub_directory)) {
- found = true;
- path = name_find_texture_outside_sub_directory;
- return;
- }
+ ERR_FAIL_COND(state.root == NULL);
+ ERR_FAIL_COND(recursive_state.skeleton == NULL);
- String name_find_upper_texture_outside_sub_directory = p_path.get_base_dir() + "/../Textures/" + path.get_file().get_basename() + extension;
- if (dir.file_exists(name_find_upper_texture_outside_sub_directory)) {
- found = true;
- path = name_find_upper_texture_outside_sub_directory;
- return;
- }
-}
+ print_verbose("Parent armature node is called " + recursive_state.parent_node->get_name());
+ // store root node for this skeleton / used in animation playback and bone detection.
+
+ state.armature_skeletons.insert(recursive_state.skeleton, Object::cast_to<Spatial>(recursive_state.parent_node));
-String EditorSceneImporterAssimp::_assimp_get_string(const aiString &p_string) const {
- //convert an assimp String to a Godot String
- String name;
- name.parse_utf8(p_string.C_Str() /*,p_string.length*/);
- if (name.find(":") != -1) {
- String replaced_name = name.split(":")[1];
- print_verbose("Replacing " + name + " containing : with " + replaced_name);
- name = replaced_name;
+ //skeleton->set_use_bones_in_world_transform(true);
+ print_verbose("Created new FBX skeleton for armature node");
}
- name = name.replace(".", ""); //can break things, specially bone names
+ ERR_FAIL_COND_MSG(recursive_state.skeleton == NULL, "Mesh has invalid armature detection - report this");
- return name;
-}
+ // this transform is a bone
+ recursive_state.skeleton->add_bone(recursive_state.node_name);
-String EditorSceneImporterAssimp::_assimp_anim_string_to_string(const aiString &p_string) const {
+ ERR_FAIL_COND(recursive_state.skeleton == NULL); // serious bug we must now exit.
+ //ERR_FAIL_COND(recursive_state.skeleton->get_name() == "");
+ print_verbose("Bone added to lookup: " + AssimpUtils::get_assimp_string(recursive_state.bone->mName));
+ print_verbose("Skeleton attached to: " + recursive_state.skeleton->get_name());
+ // make sure to write the bone lookup inverse so we can retrieve the mesh for this bone later
+ state.bone_to_skeleton_lookup.insert(recursive_state.bone, recursive_state.skeleton);
- String name;
- name.parse_utf8(p_string.C_Str() /*,p_string.length*/);
- if (name.find(":") != -1) {
- String replaced_name = name.split(":")[1];
- print_verbose("Replacing " + name + " containing : with " + replaced_name);
- name = replaced_name;
+ Transform xform = AssimpUtils::assimp_matrix_transform(recursive_state.bone->mOffsetMatrix);
+ recursive_state.skeleton->set_bone_rest(recursive_state.skeleton->get_bone_count() - 1, xform.affine_inverse());
+
+ // get parent node of assimp node
+ const aiNode *parent_node_assimp = recursive_state.assimp_node->mParent;
+
+ // ensure we have a parent
+ if (parent_node_assimp != NULL) {
+ int parent_bone_id = recursive_state.skeleton->find_bone(AssimpUtils::get_assimp_string(parent_node_assimp->mName));
+ int current_bone_id = recursive_state.skeleton->find_bone(recursive_state.node_name);
+ print_verbose("Parent bone id " + itos(parent_bone_id) + " current bone id" + itos(current_bone_id));
+ print_verbose("Bone debug: " + AssimpUtils::get_assimp_string(parent_node_assimp->mName));
+ recursive_state.skeleton->set_bone_parent(current_bone_id, parent_bone_id);
}
- return name;
}
-String EditorSceneImporterAssimp::_assimp_raw_string_to_string(const aiString &p_string) const {
- String name;
- name.parse_utf8(p_string.C_Str() /*,p_string.length*/);
- return name;
-}
+/**
+ * Generate node
+ * Recursive call to iterate over all nodes
+ */
+void EditorSceneImporterAssimp::_generate_node(
+ ImportState &state,
+ Skeleton *skeleton,
+ const aiNode *assimp_node, Node *parent_node) {
+
+ // sanity check
+ ERR_FAIL_COND(state.root == NULL);
+ ERR_FAIL_COND(state.assimp_scene == NULL);
+ ERR_FAIL_COND(assimp_node == NULL);
+ ERR_FAIL_COND(parent_node == NULL);
-Ref<Animation> EditorSceneImporterAssimp::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) {
- return Ref<Animation>();
-}
+ Spatial *new_node = NULL;
+ String node_name = AssimpUtils::get_assimp_string(assimp_node->mName);
+ Transform node_transform = AssimpUtils::assimp_matrix_transform(assimp_node->mTransformation);
-const Transform EditorSceneImporterAssimp::_assimp_matrix_transform(const aiMatrix4x4 p_matrix) {
- aiMatrix4x4 matrix = p_matrix;
- Transform xform;
- //xform.set(matrix.a1, matrix.b1, matrix.c1, matrix.a2, matrix.b2, matrix.c2, matrix.a3, matrix.b3, matrix.c3, matrix.a4, matrix.b4, matrix.c4);
- xform.set(matrix.a1, matrix.a2, matrix.a3, matrix.b1, matrix.b2, matrix.b3, matrix.c1, matrix.c2, matrix.c3, matrix.a4, matrix.b4, matrix.c4);
- return xform;
-}
+ // can safely return null - is this node a bone?
+ aiBone *bone = get_bone_by_name(state.assimp_scene, assimp_node->mName);
+
+ // out arguments helper - for pushing state down into creation functions
+ RecursiveState recursive_state(node_transform, skeleton, new_node, node_name, assimp_node, parent_node, bone);
+
+ // Creation code
+ if (state.light_cache.has(node_name)) {
+ create_light(state, recursive_state);
+ } else if (state.camera_cache.has(node_name)) {
+ create_camera(state, recursive_state);
+ } else if (bone != NULL) {
+ create_bone(state, recursive_state);
+ } else {
+ //generic node
+ recursive_state.new_node = memnew(Spatial);
+ attach_new_node(state,
+ recursive_state.new_node,
+ recursive_state.assimp_node,
+ recursive_state.parent_node,
+ recursive_state.node_name,
+ recursive_state.node_transform);
+ }
+
+ // recurse into all child elements
+ for (size_t i = 0; i < recursive_state.assimp_node->mNumChildren; i++) {
+ _generate_node(state, recursive_state.skeleton, recursive_state.assimp_node->mChildren[i],
+ recursive_state.new_node != NULL ? recursive_state.new_node : recursive_state.parent_node);
+ }
+} \ No newline at end of file
diff --git a/modules/assimp/editor_scene_importer_assimp.h b/modules/assimp/editor_scene_importer_assimp.h
index 7a30816e3b..787376c9af 100644
--- a/modules/assimp/editor_scene_importer_assimp.h
+++ b/modules/assimp/editor_scene_importer_assimp.h
@@ -44,60 +44,31 @@
#include "scene/resources/animation.h"
#include "scene/resources/surface_tool.h"
-#include "assimp/DefaultLogger.hpp"
-#include "assimp/LogStream.hpp"
-#include "assimp/Logger.hpp"
-#include "assimp/matrix4x4.h"
-#include "assimp/scene.h"
-#include "assimp/types.h"
+#include <assimp/matrix4x4.h>
+#include <assimp/scene.h>
+#include <assimp/types.h>
+#include <assimp/DefaultLogger.hpp>
+#include <assimp/LogStream.hpp>
+#include <assimp/Logger.hpp>
+
+#include "import_state.h"
+#include "import_utils.h"
+
+using namespace AssimpImporter;
class AssimpStream : public Assimp::LogStream {
public:
// Constructor
- AssimpStream();
+ AssimpStream() {}
// Destructor
- ~AssimpStream();
+ ~AssimpStream() {}
// Write something using your own functionality
- void write(const char *message);
+ void write(const char *message) {
+ print_verbose(String("Open Asset Import: ") + String(message).strip_edges());
+ }
};
-#define AI_MATKEY_FBX_MAYA_BASE_COLOR_FACTOR "$raw.Maya|baseColor", 0, 0
-#define AI_MATKEY_FBX_MAYA_METALNESS_FACTOR "$raw.Maya|metalness", 0, 0
-#define AI_MATKEY_FBX_MAYA_DIFFUSE_ROUGHNESS_FACTOR "$raw.Maya|diffuseRoughness", 0, 0
-
-#define AI_MATKEY_FBX_MAYA_METALNESS_TEXTURE "$raw.Maya|metalness|file", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_METALNESS_UV_XFORM "$raw.Maya|metalness|uvtrafo", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_DIFFUSE_ROUGHNESS_TEXTURE "$raw.Maya|diffuseRoughness|file", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_DIFFUSE_ROUGHNESS_UV_XFORM "$raw.Maya|diffuseRoughness|uvtrafo", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_BASE_COLOR_TEXTURE "$raw.Maya|baseColor|file", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_BASE_COLOR_UV_XFORM "$raw.Maya|baseColor|uvtrafo", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_NORMAL_TEXTURE "$raw.Maya|normalCamera|file", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_NORMAL_UV_XFORM "$raw.Maya|normalCamera|uvtrafo", aiTextureType_UNKNOWN, 0
-
-#define AI_MATKEY_FBX_NORMAL_TEXTURE "$raw.Maya|normalCamera|file", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_NORMAL_UV_XFORM "$raw.Maya|normalCamera|uvtrafo", aiTextureType_UNKNOWN, 0
-
-#define AI_MATKEY_FBX_MAYA_STINGRAY_DISPLACEMENT_SCALING_FACTOR "$raw.Maya|displacementscaling", 0, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_BASE_COLOR_FACTOR "$raw.Maya|base_color", 0, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_EMISSIVE_FACTOR "$raw.Maya|emissive", 0, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_METALLIC_FACTOR "$raw.Maya|metallic", 0, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_ROUGHNESS_FACTOR "$raw.Maya|roughness", 0, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_EMISSIVE_INTENSITY_FACTOR "$raw.Maya|emissive_intensity", 0, 0
-
-#define AI_MATKEY_FBX_MAYA_STINGRAY_NORMAL_TEXTURE "$raw.Maya|TEX_normal_map|file", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_NORMAL_UV_XFORM "$raw.Maya|TEX_normal_map|uvtrafo", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_COLOR_TEXTURE "$raw.Maya|TEX_color_map|file", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_COLOR_UV_XFORM "$raw.Maya|TEX_color_map|uvtrafo", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_METALLIC_TEXTURE "$raw.Maya|TEX_metallic_map|file", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_METALLIC_UV_XFORM "$raw.Maya|TEX_metallic_map|uvtrafo", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_ROUGHNESS_TEXTURE "$raw.Maya|TEX_roughness_map|file", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_ROUGHNESS_UV_XFORM "$raw.Maya|TEX_roughness_map|uvtrafo", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_EMISSIVE_TEXTURE "$raw.Maya|TEX_emissive_map|file", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_EMISSIVE_UV_XFORM "$raw.Maya|TEX_emissive_map|uvtrafo", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_AO_TEXTURE "$raw.Maya|TEX_ao_map|file", aiTextureType_UNKNOWN, 0
-#define AI_MATKEY_FBX_MAYA_STINGRAY_AO_UV_XFORM "$raw.Maya|TEX_ao_map|uvtrafo", aiTextureType_UNKNOWN, 0
-
class EditorSceneImporterAssimp : public EditorSceneImporter {
private:
GDCLASS(EditorSceneImporterAssimp, EditorSceneImporter);
@@ -112,59 +83,6 @@ private:
};
};
- struct AssetImportFbx {
- enum ETimeMode {
- TIME_MODE_DEFAULT = 0,
- TIME_MODE_120 = 1,
- TIME_MODE_100 = 2,
- TIME_MODE_60 = 3,
- TIME_MODE_50 = 4,
- TIME_MODE_48 = 5,
- TIME_MODE_30 = 6,
- TIME_MODE_30_DROP = 7,
- TIME_MODE_NTSC_DROP_FRAME = 8,
- TIME_MODE_NTSC_FULL_FRAME = 9,
- TIME_MODE_PAL = 10,
- TIME_MODE_CINEMA = 11,
- TIME_MODE_1000 = 12,
- TIME_MODE_CINEMA_ND = 13,
- TIME_MODE_CUSTOM = 14,
- TIME_MODE_TIME_MODE_COUNT = 15
- };
- enum UpAxis {
- UP_VECTOR_AXIS_X = 1,
- UP_VECTOR_AXIS_Y = 2,
- UP_VECTOR_AXIS_Z = 3
- };
- enum FrontAxis {
- FRONT_PARITY_EVEN = 1,
- FRONT_PARITY_ODD = 2,
- };
-
- enum CoordAxis {
- COORD_RIGHT = 0,
- COORD_LEFT = 1
- };
- };
-
- struct ImportState {
-
- String path;
- const aiScene *assimp_scene;
- uint32_t max_bone_weights;
- Spatial *root;
- Map<String, Ref<Mesh> > mesh_cache;
- Map<int, Ref<Material> > material_cache;
- Map<String, int> light_cache;
- Map<String, int> camera_cache;
- Vector<Skeleton *> skeletons;
- Map<String, int> bone_owners; //maps bones to skeleton index owned by
- Map<String, Node *> node_map;
- Map<MeshInstance *, Skeleton *> mesh_skeletons;
- bool fbx; //for some reason assimp does some things different for FBX
- AnimationPlayer *animation_player;
- };
-
struct BoneInfo {
uint32_t bone;
float weight;
@@ -177,28 +95,29 @@ private:
const aiNode *node;
};
- const Transform _assimp_matrix_transform(const aiMatrix4x4 p_matrix);
- String _assimp_get_string(const aiString &p_string) const;
- Transform _get_global_assimp_node_transform(const aiNode *p_current_node);
-
void _calc_tangent_from_mesh(const aiMesh *ai_mesh, int i, int tri_index, int index, PoolColorArray::Write &w);
void _set_texture_mapping_mode(aiTextureMapMode *map_mode, Ref<Texture> texture);
- void _find_texture_path(const String &p_path, String &path, bool &r_found);
- void _find_texture_path(const String &p_path, _Directory &dir, String &path, bool &found, String extension);
-
- Ref<Texture> _load_texture(ImportState &state, String p_path);
- Ref<Material> _generate_material_from_index(ImportState &state, int p_index, bool p_double_sided);
- Ref<Mesh> _generate_mesh_from_surface_indices(ImportState &state, const Vector<int> &p_surface_indices, Skeleton *p_skeleton = NULL, bool p_double_sided_material = false);
- void _generate_node(ImportState &state, const aiNode *p_assimp_node, Node *p_parent);
- void _generate_bone_groups(ImportState &state, const aiNode *p_assimp_node, Map<String, int> &ownership, Map<String, Transform> &bind_xforms);
- void _fill_node_relationships(ImportState &state, const aiNode *p_assimp_node, Map<String, int> &ownership, Map<int, int> &skeleton_map, int p_skeleton_id, Skeleton *p_skeleton, const String &p_parent_name, int &holecount, const Vector<SkeletonHole> &p_holes, const Map<String, Transform> &bind_xforms);
- void _generate_skeletons(ImportState &state, const aiNode *p_assimp_node, Map<String, int> &ownership, Map<int, int> &skeleton_map, const Map<String, Transform> &bind_xforms);
+ Ref<Mesh> _generate_mesh_from_surface_indices(ImportState &state, const Vector<int> &p_surface_indices, const aiNode *assimp_node, Skeleton *p_skeleton = NULL);
+
+ // utility for node creation
+ void attach_new_node(ImportState &state, Spatial *new_node, const aiNode *node, Node *parent_node, String Name, Transform &transform);
+ // simple object creation functions
+ void create_light(ImportState &state, RecursiveState &recursive_state);
+ void create_camera(ImportState &state, RecursiveState &recursive_state);
+ void create_bone(ImportState &state, RecursiveState &recursive_state);
+ // non recursive - linear so must not use recursive arguments
+ void create_mesh(ImportState &state, const aiNode *assimp_node, const String &node_name, Node *current_node, Node *parent_node, Transform node_transform);
+
+ // recursive node generator
+ void _generate_node(ImportState &state, Skeleton *skeleton, const aiNode *assimp_node, Node *parent_node);
+ // runs after _generate_node as it must then use pre-created godot skeleton.
+ void generate_mesh_phase_from_skeletal_mesh(ImportState &state);
void _insert_animation_track(ImportState &scene, const aiAnimation *assimp_anim, int p_track, int p_bake_fps, Ref<Animation> animation, float ticks_per_second, Skeleton *p_skeleton, const NodePath &p_path, const String &p_name);
void _import_animation(ImportState &state, int p_animation_index, int p_bake_fps);
- Spatial *_generate_scene(const String &p_path, const aiScene *scene, const uint32_t p_flags, int p_bake_fps, const int32_t p_max_bone_weights);
+ Spatial *_generate_scene(const String &p_path, aiScene *scene, const uint32_t p_flags, int p_bake_fps, const int32_t p_max_bone_weights);
String _assimp_anim_string_to_string(const aiString &p_string) const;
String _assimp_raw_string_to_string(const aiString &p_string) const;
@@ -228,7 +147,7 @@ public:
virtual void get_extensions(List<String> *r_extensions) const;
virtual uint32_t get_import_flags() const;
virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err = NULL);
- virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps);
+ Ref<Image> load_image(ImportState &state, const aiScene *p_scene, String p_path);
};
#endif
#endif
diff --git a/modules/assimp/import_state.h b/modules/assimp/import_state.h
new file mode 100644
index 0000000000..8d82cd3e39
--- /dev/null
+++ b/modules/assimp/import_state.h
@@ -0,0 +1,115 @@
+/*************************************************************************/
+/* import_state.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef EDITOR_SCENE_IMPORT_STATE_H
+#define EDITOR_SCENE_IMPORT_STATE_H
+
+#include "core/bind/core_bind.h"
+#include "core/io/resource_importer.h"
+#include "core/vector.h"
+#include "editor/import/resource_importer_scene.h"
+#include "editor/project_settings_editor.h"
+#include "scene/3d/mesh_instance.h"
+#include "scene/3d/skeleton.h"
+#include "scene/3d/spatial.h"
+#include "scene/animation/animation_player.h"
+#include "scene/resources/animation.h"
+#include "scene/resources/surface_tool.h"
+
+#include <assimp/matrix4x4.h>
+#include <assimp/scene.h>
+#include <assimp/types.h>
+#include <assimp/DefaultLogger.hpp>
+#include <assimp/LogStream.hpp>
+#include <assimp/Logger.hpp>
+
+namespace AssimpImporter {
+/** Import state is for global scene import data
+ * This makes the code simpler and contains useful lookups.
+ */
+struct ImportState {
+
+ String path;
+ const aiScene *assimp_scene;
+ uint32_t max_bone_weights;
+
+ Spatial *root;
+ Map<String, Ref<Mesh> > mesh_cache;
+ Map<int, Ref<Material> > material_cache;
+ Map<String, int> light_cache;
+ Map<String, int> camera_cache;
+ //Vector<Skeleton *> skeletons;
+ Map<Skeleton *, const Spatial *> armature_skeletons; // maps skeletons based on their armature nodes.
+ Map<const aiBone *, Skeleton *> bone_to_skeleton_lookup; // maps bones back into their skeleton
+ // very useful for when you need to ask assimp for the bone mesh
+ Map<String, Node *> node_map;
+ Map<const aiNode *, const Node *> assimp_node_map;
+ Map<String, Ref<Image> > path_to_image_cache;
+ bool fbx; //for some reason assimp does some things different for FBX
+ AnimationPlayer *animation_player;
+};
+
+struct AssimpImageData {
+ Ref<Image> raw_image;
+ Ref<ImageTexture> texture;
+ aiTextureMapMode *map_mode = NULL;
+};
+
+/** Recursive state is used to push state into functions instead of specifying them
+ * This makes the code easier to handle too and add extra arguments without breaking things
+ */
+struct RecursiveState {
+ RecursiveState(
+ Transform &_node_transform,
+ Skeleton *_skeleton,
+ Spatial *_new_node,
+ const String &_node_name,
+ const aiNode *_assimp_node,
+ Node *_parent_node,
+ const aiBone *_bone) :
+ node_transform(_node_transform),
+ skeleton(_skeleton),
+ new_node(_new_node),
+ node_name(_node_name),
+ assimp_node(_assimp_node),
+ parent_node(_parent_node),
+ bone(_bone) {}
+
+ Transform &node_transform;
+ Skeleton *skeleton;
+ Spatial *new_node;
+ const String &node_name;
+ const aiNode *assimp_node;
+ Node *parent_node;
+ const aiBone *bone;
+};
+} // namespace AssimpImporter
+
+#endif // EDITOR_SCENE_IMPORT_STATE_H
diff --git a/modules/assimp/import_utils.h b/modules/assimp/import_utils.h
new file mode 100644
index 0000000000..4be76ade0f
--- /dev/null
+++ b/modules/assimp/import_utils.h
@@ -0,0 +1,448 @@
+/*************************************************************************/
+/* import_utils.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef IMPORT_UTILS_IMPORTER_ASSIMP_H
+#define IMPORT_UTILS_IMPORTER_ASSIMP_H
+
+#include "core/io/image_loader.h"
+#include "import_state.h"
+
+#include <assimp/SceneCombiner.h>
+#include <assimp/cexport.h>
+#include <assimp/cimport.h>
+#include <assimp/matrix4x4.h>
+#include <assimp/pbrmaterial.h>
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/DefaultLogger.hpp>
+#include <assimp/Importer.hpp>
+#include <assimp/LogStream.hpp>
+#include <assimp/Logger.hpp>
+#include <string>
+
+using namespace AssimpImporter;
+
+#define AI_PROPERTIES aiTextureType_UNKNOWN, 0
+#define AI_NULL 0, 0
+#define AI_MATKEY_FBX_MAYA_BASE_COLOR_FACTOR "$raw.Maya|baseColor"
+#define AI_MATKEY_FBX_MAYA_METALNESS_FACTOR "$raw.Maya|metalness"
+#define AI_MATKEY_FBX_MAYA_DIFFUSE_ROUGHNESS_FACTOR "$raw.Maya|diffuseRoughness"
+
+#define AI_MATKEY_FBX_MAYA_EMISSION_TEXTURE "$raw.Maya|emissionColor|file"
+#define AI_MATKEY_FBX_MAYA_EMISSIVE_FACTOR "$raw.Maya|emission"
+#define AI_MATKEY_FBX_MAYA_METALNESS_TEXTURE "$raw.Maya|metalness|file"
+#define AI_MATKEY_FBX_MAYA_METALNESS_UV_XFORM "$raw.Maya|metalness|uvtrafo"
+#define AI_MATKEY_FBX_MAYA_DIFFUSE_ROUGHNESS_TEXTURE "$raw.Maya|diffuseRoughness|file"
+#define AI_MATKEY_FBX_MAYA_DIFFUSE_ROUGHNESS_UV_XFORM "$raw.Maya|diffuseRoughness|uvtrafo"
+#define AI_MATKEY_FBX_MAYA_BASE_COLOR_TEXTURE "$raw.Maya|baseColor|file"
+#define AI_MATKEY_FBX_MAYA_BASE_COLOR_UV_XFORM "$raw.Maya|baseColor|uvtrafo"
+#define AI_MATKEY_FBX_MAYA_NORMAL_TEXTURE "$raw.Maya|normalCamera|file"
+#define AI_MATKEY_FBX_MAYA_NORMAL_UV_XFORM "$raw.Maya|normalCamera|uvtrafo"
+
+#define AI_MATKEY_FBX_NORMAL_TEXTURE "$raw.Maya|normalCamera|file"
+#define AI_MATKEY_FBX_NORMAL_UV_XFORM "$raw.Maya|normalCamera|uvtrafo"
+
+#define AI_MATKEY_FBX_MAYA_STINGRAY_DISPLACEMENT_SCALING_FACTOR "$raw.Maya|displacementscaling"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_BASE_COLOR_FACTOR "$raw.Maya|base_color"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_EMISSIVE_FACTOR "$raw.Maya|emissive"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_METALLIC_FACTOR "$raw.Maya|metallic"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_ROUGHNESS_FACTOR "$raw.Maya|roughness"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_EMISSIVE_INTENSITY_FACTOR "$raw.Maya|emissive_intensity"
+
+#define AI_MATKEY_FBX_MAYA_STINGRAY_NORMAL_TEXTURE "$raw.Maya|TEX_normal_map|file"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_NORMAL_UV_XFORM "$raw.Maya|TEX_normal_map|uvtrafo"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_COLOR_TEXTURE "$raw.Maya|TEX_color_map|file"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_COLOR_UV_XFORM "$raw.Maya|TEX_color_map|uvtrafo"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_METALLIC_TEXTURE "$raw.Maya|TEX_metallic_map|file"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_METALLIC_UV_XFORM "$raw.Maya|TEX_metallic_map|uvtrafo"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_ROUGHNESS_TEXTURE "$raw.Maya|TEX_roughness_map|file"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_ROUGHNESS_UV_XFORM "$raw.Maya|TEX_roughness_map|uvtrafo"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_EMISSIVE_TEXTURE "$raw.Maya|TEX_emissive_map|file"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_EMISSIVE_UV_XFORM "$raw.Maya|TEX_emissive_map|uvtrafo"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_AO_TEXTURE "$raw.Maya|TEX_ao_map|file"
+#define AI_MATKEY_FBX_MAYA_STINGRAY_AO_UV_XFORM "$raw.Maya|TEX_ao_map|uvtrafo"
+
+/**
+ * Assimp Utils
+ * Conversion tools / glue code to convert from assimp to godot
+*/
+class AssimpUtils {
+public:
+ /**
+ * calculate tangents for mesh data from assimp data
+ */
+ static void calc_tangent_from_mesh(const aiMesh *ai_mesh, int i, int tri_index, int index, PoolColorArray::Write &w) {
+ const aiVector3D normals = ai_mesh->mAnimMeshes[i]->mNormals[tri_index];
+ const Vector3 godot_normal = Vector3(normals.x, normals.y, normals.z);
+ const aiVector3D tangent = ai_mesh->mAnimMeshes[i]->mTangents[tri_index];
+ const Vector3 godot_tangent = Vector3(tangent.x, tangent.y, tangent.z);
+ const aiVector3D bitangent = ai_mesh->mAnimMeshes[i]->mBitangents[tri_index];
+ const Vector3 godot_bitangent = Vector3(bitangent.x, bitangent.y, bitangent.z);
+ float d = godot_normal.cross(godot_tangent).dot(godot_bitangent) > 0.0f ? 1.0f : -1.0f;
+ Color plane_tangent = Color(tangent.x, tangent.y, tangent.z, d);
+ w[index] = plane_tangent;
+ }
+
+ struct AssetImportFbx {
+ enum ETimeMode {
+ TIME_MODE_DEFAULT = 0,
+ TIME_MODE_120 = 1,
+ TIME_MODE_100 = 2,
+ TIME_MODE_60 = 3,
+ TIME_MODE_50 = 4,
+ TIME_MODE_48 = 5,
+ TIME_MODE_30 = 6,
+ TIME_MODE_30_DROP = 7,
+ TIME_MODE_NTSC_DROP_FRAME = 8,
+ TIME_MODE_NTSC_FULL_FRAME = 9,
+ TIME_MODE_PAL = 10,
+ TIME_MODE_CINEMA = 11,
+ TIME_MODE_1000 = 12,
+ TIME_MODE_CINEMA_ND = 13,
+ TIME_MODE_CUSTOM = 14,
+ TIME_MODE_TIME_MODE_COUNT = 15
+ };
+ enum UpAxis {
+ UP_VECTOR_AXIS_X = 1,
+ UP_VECTOR_AXIS_Y = 2,
+ UP_VECTOR_AXIS_Z = 3
+ };
+ enum FrontAxis {
+ FRONT_PARITY_EVEN = 1,
+ FRONT_PARITY_ODD = 2,
+ };
+
+ enum CoordAxis {
+ COORD_RIGHT = 0,
+ COORD_LEFT = 1
+ };
+ };
+
+ /** Get assimp string
+ * automatically filters the string data
+ */
+ static String get_assimp_string(const aiString &p_string) {
+ //convert an assimp String to a Godot String
+ String name;
+ name.parse_utf8(p_string.C_Str() /*,p_string.length*/);
+ if (name.find(":") != -1) {
+ String replaced_name = name.split(":")[1];
+ print_verbose("Replacing " + name + " containing : with " + replaced_name);
+ name = replaced_name;
+ }
+
+ return name;
+ }
+
+ static String get_anim_string_from_assimp(const aiString &p_string) {
+
+ String name;
+ name.parse_utf8(p_string.C_Str() /*,p_string.length*/);
+ if (name.find(":") != -1) {
+ String replaced_name = name.split(":")[1];
+ print_verbose("Replacing " + name + " containing : with " + replaced_name);
+ name = replaced_name;
+ }
+ return name;
+ }
+
+ /**
+ * No filter logic get_raw_string_from_assimp
+ * This just convers the aiString to a parsed utf8 string
+ * Without removing special chars etc
+ */
+ static String get_raw_string_from_assimp(const aiString &p_string) {
+ String name;
+ name.parse_utf8(p_string.C_Str() /*,p_string.length*/);
+ return name;
+ }
+
+ static Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) {
+ return Ref<Animation>();
+ }
+
+ /**
+ * Converts aiMatrix4x4 to godot Transform
+ */
+ static const Transform assimp_matrix_transform(const aiMatrix4x4 p_matrix) {
+ aiMatrix4x4 matrix = p_matrix;
+ Transform xform;
+ xform.set(matrix.a1, matrix.a2, matrix.a3, matrix.b1, matrix.b2, matrix.b3, matrix.c1, matrix.c2, matrix.c3, matrix.a4, matrix.b4, matrix.c4);
+ return xform;
+ }
+
+ /** Get fbx fps for time mode meta data
+ */
+ static float get_fbx_fps(int32_t time_mode, const aiScene *p_scene) {
+ switch (time_mode) {
+ case AssetImportFbx::TIME_MODE_DEFAULT: return 24; //hack
+ case AssetImportFbx::TIME_MODE_120: return 120;
+ case AssetImportFbx::TIME_MODE_100: return 100;
+ case AssetImportFbx::TIME_MODE_60: return 60;
+ case AssetImportFbx::TIME_MODE_50: return 50;
+ case AssetImportFbx::TIME_MODE_48: return 48;
+ case AssetImportFbx::TIME_MODE_30: return 30;
+ case AssetImportFbx::TIME_MODE_30_DROP: return 30;
+ case AssetImportFbx::TIME_MODE_NTSC_DROP_FRAME: return 29.9700262f;
+ case AssetImportFbx::TIME_MODE_NTSC_FULL_FRAME: return 29.9700262f;
+ case AssetImportFbx::TIME_MODE_PAL: return 25;
+ case AssetImportFbx::TIME_MODE_CINEMA: return 24;
+ case AssetImportFbx::TIME_MODE_1000: return 1000;
+ case AssetImportFbx::TIME_MODE_CINEMA_ND: return 23.976f;
+ case AssetImportFbx::TIME_MODE_CUSTOM:
+ int32_t frame_rate = -1;
+ p_scene->mMetaData->Get("FrameRate", frame_rate);
+ return frame_rate;
+ }
+ return 0;
+ }
+
+ /**
+ * Get global transform for the current node - so we can use world space rather than
+ * local space coordinates
+ * useful if you need global - although recommend using local wherever possible over global
+ * as you could break fbx scaling :)
+ */
+ static Transform _get_global_assimp_node_transform(const aiNode *p_current_node) {
+ aiNode const *current_node = p_current_node;
+ Transform xform;
+ while (current_node != NULL) {
+ xform = assimp_matrix_transform(current_node->mTransformation) * xform;
+ current_node = current_node->mParent;
+ }
+ return xform;
+ }
+
+ /**
+ * Find hardcoded textures from assimp which could be in many different directories
+ */
+ static void find_texture_path(const String &p_path, _Directory &dir, String &path, bool &found, String extension) {
+ Vector<String> paths;
+ paths.push_back(path.get_basename() + extension);
+ paths.push_back(path + extension);
+ paths.push_back(path);
+ paths.push_back(p_path.get_base_dir().plus_file(path.get_file().get_basename() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file(path.get_file() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file(path.get_file()));
+ paths.push_back(p_path.get_base_dir().plus_file("textures/" + path.get_file().get_basename() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("textures/" + path.get_file() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("textures/" + path.get_file()));
+ paths.push_back(p_path.get_base_dir().plus_file("Textures/" + path.get_file().get_basename() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("Textures/" + path.get_file() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("Textures/" + path.get_file()));
+ paths.push_back(p_path.get_base_dir().plus_file("../Textures/" + path.get_file() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("../Textures/" + path.get_file().get_basename() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("../Textures/" + path.get_file()));
+ paths.push_back(p_path.get_base_dir().plus_file("../textures/" + path.get_file().get_basename() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("../textures/" + path.get_file() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("../textures/" + path.get_file()));
+ paths.push_back(p_path.get_base_dir().plus_file("texture/" + path.get_file().get_basename() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("texture/" + path.get_file() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("texture/" + path.get_file()));
+ paths.push_back(p_path.get_base_dir().plus_file("Texture/" + path.get_file().get_basename() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("Texture/" + path.get_file() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("Texture/" + path.get_file()));
+ paths.push_back(p_path.get_base_dir().plus_file("../Texture/" + path.get_file() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("../Texture/" + path.get_file().get_basename() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("../Texture/" + path.get_file()));
+ paths.push_back(p_path.get_base_dir().plus_file("../texture/" + path.get_file().get_basename() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("../texture/" + path.get_file() + extension));
+ paths.push_back(p_path.get_base_dir().plus_file("../texture/" + path.get_file()));
+ for (int i = 0; i < paths.size(); i++) {
+ if (dir.file_exists(paths[i])) {
+ found = true;
+ path = paths[i];
+ return;
+ }
+ }
+ }
+
+ /** find the texture path for the supplied fbx path inside godot
+ * very simple lookup for subfolders etc for a texture which may or may not be in a directory
+ */
+ static void find_texture_path(const String &r_p_path, String &r_path, bool &r_found) {
+ _Directory dir;
+
+ List<String> exts;
+ ImageLoader::get_recognized_extensions(&exts);
+
+ Vector<String> split_path = r_path.get_basename().split("*");
+ if (split_path.size() == 2) {
+ r_found = true;
+ return;
+ }
+
+ if (dir.file_exists(r_p_path.get_base_dir() + r_path.get_file())) {
+ r_path = r_p_path.get_base_dir() + r_path.get_file();
+ r_found = true;
+ return;
+ }
+
+ for (int32_t i = 0; i < exts.size(); i++) {
+ if (r_found) {
+ return;
+ }
+ if (r_found == false) {
+ find_texture_path(r_p_path, dir, r_path, r_found, "." + exts[i]);
+ }
+ }
+ }
+
+ /**
+ * set_texture_mapping_mode
+ * Helper to check the mapping mode of the texture (repeat, clamp and mirror)
+ */
+ static void set_texture_mapping_mode(aiTextureMapMode *map_mode, Ref<ImageTexture> texture) {
+ ERR_FAIL_COND(texture.is_null());
+ ERR_FAIL_COND(map_mode == NULL);
+ aiTextureMapMode tex_mode = aiTextureMapMode::aiTextureMapMode_Wrap;
+
+ tex_mode = map_mode[0];
+
+ int32_t flags = Texture::FLAGS_DEFAULT;
+ if (tex_mode == aiTextureMapMode_Wrap) {
+ //Default
+ } else if (tex_mode == aiTextureMapMode_Clamp) {
+ flags = flags & ~Texture::FLAG_REPEAT;
+ } else if (tex_mode == aiTextureMapMode_Mirror) {
+ flags = flags | Texture::FLAG_MIRRORED_REPEAT;
+ }
+ texture->set_flags(flags);
+ }
+
+ /**
+ * Load or load from cache image :)
+ */
+ static Ref<Image> load_image(ImportState &state, const aiScene *p_scene, String p_path) {
+
+ Map<String, Ref<Image> >::Element *match = state.path_to_image_cache.find(p_path);
+
+ // if our cache contains this image then don't bother
+ if (match) {
+ return match->get();
+ }
+
+ Vector<String> split_path = p_path.get_basename().split("*");
+ if (split_path.size() == 2) {
+ size_t texture_idx = split_path[1].to_int();
+ ERR_FAIL_COND_V(texture_idx >= p_scene->mNumTextures, Ref<Image>());
+ aiTexture *tex = p_scene->mTextures[texture_idx];
+ String filename = AssimpUtils::get_raw_string_from_assimp(tex->mFilename);
+ filename = filename.get_file();
+ print_verbose("Open Asset Import: Loading embedded texture " + filename);
+ if (tex->mHeight == 0) {
+ if (tex->CheckFormat("png")) {
+ Ref<Image> img = Image::_png_mem_loader_func((uint8_t *)tex->pcData, tex->mWidth);
+ ERR_FAIL_COND_V(img.is_null(), Ref<Image>());
+ state.path_to_image_cache.insert(p_path, img);
+ return img;
+ } else if (tex->CheckFormat("jpg")) {
+ Ref<Image> img = Image::_jpg_mem_loader_func((uint8_t *)tex->pcData, tex->mWidth);
+ ERR_FAIL_COND_V(img.is_null(), Ref<Image>());
+ state.path_to_image_cache.insert(p_path, img);
+ return img;
+ } else if (tex->CheckFormat("dds")) {
+ ERR_EXPLAIN("Open Asset Import: Embedded dds not implemented");
+ ERR_FAIL_COND_V(true, Ref<Image>());
+ }
+ } else {
+ Ref<Image> img;
+ img.instance();
+ PoolByteArray arr;
+ uint32_t size = tex->mWidth * tex->mHeight;
+ arr.resize(size);
+ memcpy(arr.write().ptr(), tex->pcData, size);
+ ERR_FAIL_COND_V(arr.size() % 4 != 0, Ref<Image>());
+ //ARGB8888 to RGBA8888
+ for (int32_t i = 0; i < arr.size() / 4; i++) {
+ arr.write().ptr()[(4 * i) + 3] = arr[(4 * i) + 0];
+ arr.write().ptr()[(4 * i) + 0] = arr[(4 * i) + 1];
+ arr.write().ptr()[(4 * i) + 1] = arr[(4 * i) + 2];
+ arr.write().ptr()[(4 * i) + 2] = arr[(4 * i) + 3];
+ }
+ img->create(tex->mWidth, tex->mHeight, true, Image::FORMAT_RGBA8, arr);
+ ERR_FAIL_COND_V(img.is_null(), Ref<Image>());
+ state.path_to_image_cache.insert(p_path, img);
+ return img;
+ }
+ return Ref<Image>();
+ } else {
+ Ref<Texture> texture = ResourceLoader::load(p_path);
+ Ref<Image> image = texture->get_data();
+ state.path_to_image_cache.insert(p_path, image);
+ return image;
+ }
+
+ return Ref<Image>();
+ }
+
+ /* create texture from assimp data, if found in path */
+ static bool CreateAssimpTexture(
+ AssimpImporter::ImportState &state,
+ aiString texture_path,
+ String &filename,
+ String &path,
+ AssimpImageData &image_state) {
+ filename = get_raw_string_from_assimp(texture_path);
+ path = state.path.get_base_dir().plus_file(filename.replace("\\", "/"));
+ bool found = false;
+ find_texture_path(state.path, path, found);
+ if (found) {
+ image_state.raw_image = AssimpUtils::load_image(state, state.assimp_scene, path);
+ if (image_state.raw_image.is_valid()) {
+ image_state.texture.instance();
+ image_state.texture->create_from_image(image_state.raw_image);
+ image_state.texture->set_storage(ImageTexture::STORAGE_COMPRESS_LOSSY);
+ return true;
+ }
+ }
+
+ return false;
+ }
+ /** GetAssimpTexture
+ * Designed to retrieve textures for you
+ */
+ static bool GetAssimpTexture(
+ AssimpImporter::ImportState &state,
+ aiMaterial *ai_material,
+ aiTextureType texture_type,
+ String &filename,
+ String &path,
+ AssimpImageData &image_state) {
+ aiString ai_filename = aiString();
+ if (AI_SUCCESS == ai_material->GetTexture(texture_type, 0, &ai_filename, NULL, NULL, NULL, NULL, image_state.map_mode)) {
+ return CreateAssimpTexture(state, ai_filename, filename, path, image_state);
+ }
+
+ return false;
+ }
+};
+
+#endif // IMPORT_UTILS_IMPORTER_ASSIMP_H
diff --git a/modules/csg/csg.cpp b/modules/csg/csg.cpp
index fd0d36eddf..f1b3fa2ac6 100644
--- a/modules/csg/csg.cpp
+++ b/modules/csg/csg.cpp
@@ -242,7 +242,7 @@ void CSGBrushOperation::BuildPoly::_clip_segment(const CSGBrush *p_brush, int p_
//check if edge and poly share a vertex, of so, assign it to segment_idx
for (int i = 0; i < points.size(); i++) {
for (int j = 0; j < 2; j++) {
- if (Math::is_zero_approx(segment[j].distance_to(points[i].point))) {
+ if (segment[j] == points[i].point) {
segment_idx[j] = i;
inserted_points.push_back(i);
break;
@@ -310,7 +310,7 @@ void CSGBrushOperation::BuildPoly::_clip_segment(const CSGBrush *p_brush, int p_
Vector2 edgeseg[2] = { points[edges[i].points[0]].point, points[edges[i].points[1]].point };
Vector2 closest = Geometry::get_closest_point_to_segment_2d(segment[j], edgeseg);
- if (Math::is_zero_approx(closest.distance_to(segment[j]))) {
+ if (closest == segment[j]) {
//point rest of this edge
res = closest;
found = true;
@@ -439,7 +439,7 @@ void CSGBrushOperation::BuildPoly::clip(const CSGBrush *p_brush, int p_face, Mes
//transform A points to 2D
- if (Math::is_zero_approx(segment[0].distance_to(segment[1])))
+ if (segment[0] == segment[1])
return; //too small
_clip_segment(p_brush, p_face, segment, mesh_merge, p_for_B);
@@ -461,10 +461,10 @@ void CSGBrushOperation::_collision_callback(const CSGBrush *A, int p_face_a, Map
{
//check if either is a degenerate
- if (Math::is_zero_approx(va[0].distance_to(va[1])) || Math::is_zero_approx(va[0].distance_to(va[2])) || Math::is_zero_approx(va[1].distance_to(va[2])))
+ if (va[0] == va[1] || va[0] == va[2] || va[1] == va[2])
return;
- if (Math::is_zero_approx(vb[0].distance_to(vb[1])) || Math::is_zero_approx(vb[0].distance_to(vb[2])) || Math::is_zero_approx(vb[1].distance_to(vb[2])))
+ if (vb[0] == vb[1] || vb[0] == vb[2] || vb[1] == vb[2])
return;
}
diff --git a/modules/etc/texture_loader_pkm.cpp b/modules/etc/texture_loader_pkm.cpp
index 3337460dfc..dd61d816d4 100644
--- a/modules/etc/texture_loader_pkm.cpp
+++ b/modules/etc/texture_loader_pkm.cpp
@@ -62,10 +62,8 @@ RES ResourceFormatPKM::load(const String &p_path, const String &p_original_path,
f->set_endian_swap(true);
ETC1Header h;
- ERR_EXPLAIN("Invalid or Unsupported PKM texture file: " + p_path);
f->get_buffer((uint8_t *)&h.tag, sizeof(h.tag));
- if (strncmp(h.tag, "PKM 10", sizeof(h.tag)))
- ERR_FAIL_V(RES());
+ ERR_FAIL_COND_V_MSG(strncmp(h.tag, "PKM 10", sizeof(h.tag)), RES(), "Invalid or unsupported PKM texture file: " + p_path + ".");
h.format = f->get_16();
h.texWidth = f->get_16();
diff --git a/modules/gdnative/doc_classes/NativeScript.xml b/modules/gdnative/doc_classes/NativeScript.xml
index e34e209374..dc735546e3 100644
--- a/modules/gdnative/doc_classes/NativeScript.xml
+++ b/modules/gdnative/doc_classes/NativeScript.xml
@@ -42,7 +42,7 @@
</description>
</method>
<method name="new" qualifiers="vararg">
- <return type="Object">
+ <return type="Variant">
</return>
<description>
Constructs a new object of the base type with a script of this type already attached.
diff --git a/modules/gdnative/doc_classes/PluginScript.xml b/modules/gdnative/doc_classes/PluginScript.xml
index b07122bbdf..33b5f02bd4 100644
--- a/modules/gdnative/doc_classes/PluginScript.xml
+++ b/modules/gdnative/doc_classes/PluginScript.xml
@@ -8,7 +8,7 @@
</tutorials>
<methods>
<method name="new" qualifiers="vararg">
- <return type="Object">
+ <return type="Variant">
</return>
<description>
Returns a new instance of the script.
diff --git a/modules/gdnative/nativescript/nativescript.cpp b/modules/gdnative/nativescript/nativescript.cpp
index 9f7c3880ec..7c313c983f 100644
--- a/modules/gdnative/nativescript/nativescript.cpp
+++ b/modules/gdnative/nativescript/nativescript.cpp
@@ -79,7 +79,7 @@ void NativeScript::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::STRING, "script_class_name"), "set_script_class_name", "get_script_class_name");
ADD_PROPERTY(PropertyInfo(Variant::STRING, "script_class_icon_path", PROPERTY_HINT_FILE), "set_script_class_icon_path", "get_script_class_icon_path");
- ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "new", &NativeScript::_new, MethodInfo(Variant::OBJECT, "new"));
+ ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "new", &NativeScript::_new, MethodInfo("new"));
}
#define NSL NativeScriptLanguage::get_singleton()
diff --git a/modules/gdnative/pluginscript/pluginscript_script.cpp b/modules/gdnative/pluginscript/pluginscript_script.cpp
index b82823ab64..94d38e1be1 100644
--- a/modules/gdnative/pluginscript/pluginscript_script.cpp
+++ b/modules/gdnative/pluginscript/pluginscript_script.cpp
@@ -50,7 +50,7 @@
#endif
void PluginScript::_bind_methods() {
- ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "new", &PluginScript::_new, MethodInfo(Variant::OBJECT, "new"));
+ ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "new", &PluginScript::_new, MethodInfo("new"));
}
PluginScriptInstance *PluginScript::_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, Variant::CallError &r_error) {
diff --git a/modules/gdscript/SCsub b/modules/gdscript/SCsub
index 6904154953..74e653ce43 100644
--- a/modules/gdscript/SCsub
+++ b/modules/gdscript/SCsub
@@ -8,4 +8,12 @@ env_gdscript = env_modules.Clone()
env_gdscript.add_source_files(env.modules_sources, "*.cpp")
if env['tools']:
- env_gdscript.add_source_files(env.modules_sources, "./editor/*.cpp")
+ env_gdscript.add_source_files(env.modules_sources, "./editor/*.cpp")
+
+ # Those two modules are required for the language server protocol
+ if env['module_jsonrpc_enabled'] and env['module_websocket_enabled']:
+ env_gdscript.add_source_files(env.modules_sources, "./language_server/*.cpp")
+ else:
+ # Using a define in the disabled case, to avoid having an extra define
+ # in regular builds where all modules are enabled.
+ env_gdscript.Append(CPPDEFINES=['GDSCRIPT_NO_LSP'])
diff --git a/modules/gdscript/doc_classes/@GDScript.xml b/modules/gdscript/doc_classes/@GDScript.xml
index ad47323613..4efa90fd86 100644
--- a/modules/gdscript/doc_classes/@GDScript.xml
+++ b/modules/gdscript/doc_classes/@GDScript.xml
@@ -1115,7 +1115,11 @@
<argument index="1" name="step" type="float">
</argument>
<description>
- Snaps float value [code]s[/code] to a given [code]step[/code].
+ Snaps float value [code]s[/code] to a given [code]step[/code]. This can also be used to round a floating point number to an arbitrary number of decimals.
+ [codeblock]
+ stepify(100, 32) # Returns 96
+ stepify(3.14159, 0.01) # Returns 3.14
+ [/codeblock]
</description>
</method>
<method name="str" qualifiers="vararg">
diff --git a/modules/gdscript/doc_classes/GDScript.xml b/modules/gdscript/doc_classes/GDScript.xml
index d606a41fab..6f43361914 100644
--- a/modules/gdscript/doc_classes/GDScript.xml
+++ b/modules/gdscript/doc_classes/GDScript.xml
@@ -19,7 +19,7 @@
</description>
</method>
<method name="new" qualifiers="vararg">
- <return type="Object">
+ <return type="Variant">
</return>
<description>
Returns a new instance of the script.
diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp
index d929bdb3e5..5dab063061 100644
--- a/modules/gdscript/gdscript.cpp
+++ b/modules/gdscript/gdscript.cpp
@@ -710,7 +710,7 @@ void GDScript::_get_property_list(List<PropertyInfo> *p_properties) const {
void GDScript::_bind_methods() {
- ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "new", &GDScript::_new, MethodInfo(Variant::OBJECT, "new"));
+ ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "new", &GDScript::_new, MethodInfo("new"));
ClassDB::bind_method(D_METHOD("get_as_byte_code"), &GDScript::get_as_byte_code);
}
diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp
index 9f65a9fff1..925dbda620 100644
--- a/modules/gdscript/gdscript_editor.cpp
+++ b/modules/gdscript/gdscript_editor.cpp
@@ -634,7 +634,7 @@ static GDScriptCompletionIdentifier _type_from_gdtype(const GDScriptDataType &p_
switch (p_gdtype.kind) {
case GDScriptDataType::UNINITIALIZED: {
- ERR_EXPLAIN("Uninitialized completion. Please report a bug.");
+ ERR_PRINT("Uninitialized completion. Please report a bug.");
} break;
case GDScriptDataType::BUILTIN: {
ci.type.kind = GDScriptParser::DataType::BUILTIN;
@@ -2826,6 +2826,16 @@ Error GDScriptLanguage::complete_code(const String &p_code, const String &p_path
ScriptCodeCompletionOption option(Variant::get_type_name((Variant::Type)i), ScriptCodeCompletionOption::KIND_CLASS);
options.insert(option.display, option);
}
+ List<PropertyInfo> props;
+ ProjectSettings::get_singleton()->get_property_list(&props);
+ for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
+ String s = E->get().name;
+ if (!s.begins_with("autoload/")) {
+ continue;
+ }
+ ScriptCodeCompletionOption option(s.get_slice("/", 1), ScriptCodeCompletionOption::KIND_CLASS);
+ options.insert(option.display, option);
+ }
}
List<StringName> native_classes;
diff --git a/modules/gdscript/gdscript_function.cpp b/modules/gdscript/gdscript_function.cpp
index dc0e64fd03..68f2a9473e 100644
--- a/modules/gdscript/gdscript_function.cpp
+++ b/modules/gdscript/gdscript_function.cpp
@@ -431,6 +431,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
profile.frame_call_count++;
}
bool exit_ok = false;
+ bool yielded = false;
#endif
#ifdef DEBUG_ENABLED
@@ -1323,6 +1324,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
#ifdef DEBUG_ENABLED
exit_ok = true;
+ yielded = true;
#endif
OPCODE_BREAK;
}
@@ -1589,8 +1591,6 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GDScriptLanguage::get_singleton()->script_frame_time += time_taken - function_call_time;
}
- bool yielded = retvalue.is_ref() && Object::cast_to<GDScriptFunctionState>(retvalue);
-
// Check if this is the last time the function is resuming from yield
// Will be true if never yielded as well
// When it's the last resume it will postpone the exit from stack,
diff --git a/modules/gdscript/gdscript_functions.cpp b/modules/gdscript/gdscript_functions.cpp
index ad8bf5b2c0..97790e00bb 100644
--- a/modules/gdscript/gdscript_functions.cpp
+++ b/modules/gdscript/gdscript_functions.cpp
@@ -106,6 +106,7 @@ const char *GDScriptFunctions::get_func_name(Function p_func) {
"typeof",
"type_exists",
"char",
+ "ord",
"str",
"print",
"printt",
@@ -665,6 +666,33 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_
CharType result[2] = { *p_args[0], 0 };
r_ret = String(result);
} break;
+ case TEXT_ORD: {
+
+ VALIDATE_ARG_COUNT(1);
+
+ if (p_args[0]->get_type() != Variant::STRING) {
+
+ r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
+ r_error.argument = 0;
+ r_error.expected = Variant::STRING;
+ r_ret = Variant();
+ return;
+ }
+
+ String str = p_args[0]->operator String();
+
+ if (str.length() != 1) {
+
+ r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
+ r_error.argument = 0;
+ r_error.expected = Variant::STRING;
+ r_ret = RTR("Expected a string of length 1 (a character).");
+ return;
+ }
+
+ r_ret = str.get(0);
+
+ } break;
case TEXT_STR: {
if (p_arg_count < 1) {
r_error.error = Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
@@ -1507,6 +1535,7 @@ bool GDScriptFunctions::is_deterministic(Function p_func) {
case TYPE_OF:
case TYPE_EXISTS:
case TEXT_CHAR:
+ case TEXT_ORD:
case TEXT_STR:
case COLOR8:
case LEN:
@@ -1849,6 +1878,13 @@ MethodInfo GDScriptFunctions::get_info(Function p_func) {
return mi;
} break;
+ case TEXT_ORD: {
+
+ MethodInfo mi("ord", PropertyInfo(Variant::STRING, "char"));
+ mi.return_val.type = Variant::INT;
+ return mi;
+
+ } break;
case TEXT_STR: {
MethodInfo mi("str");
diff --git a/modules/gdscript/gdscript_functions.h b/modules/gdscript/gdscript_functions.h
index 8f7ba76d2c..9ea5dd46cf 100644
--- a/modules/gdscript/gdscript_functions.h
+++ b/modules/gdscript/gdscript_functions.h
@@ -97,6 +97,7 @@ public:
TYPE_OF,
TYPE_EXISTS,
TEXT_CHAR,
+ TEXT_ORD,
TEXT_STR,
TEXT_PRINT,
TEXT_PRINT_TABBED,
diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp
index 9a25e788c7..e96bf0238a 100644
--- a/modules/gdscript/gdscript_parser.cpp
+++ b/modules/gdscript/gdscript_parser.cpp
@@ -252,6 +252,16 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s
}
}
+ // Check that the next token is not TK_CURSOR and if it is, the offset should be incremented.
+ int next_valid_offset = 1;
+ if (tokenizer->get_token(next_valid_offset) == GDScriptTokenizer::TK_CURSOR) {
+ next_valid_offset++;
+ // There is a chunk of the identifier that also needs to be ignored (not always there!)
+ if (tokenizer->get_token(next_valid_offset) == GDScriptTokenizer::TK_IDENTIFIER) {
+ next_valid_offset++;
+ }
+ }
+
if (tokenizer->get_token() == GDScriptTokenizer::TK_PARENTHESIS_OPEN) {
//subexpression ()
tokenizer->advance();
@@ -504,7 +514,7 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s
Ref<GDScript> gds = res;
if (gds.is_valid() && !gds->is_valid()) {
- _set_error("Could not fully preload the script, possible cyclic reference or compilation error. Use 'load()' instead if a cyclic reference is intended.");
+ _set_error("Couldn't fully preload the script, possible cyclic reference or compilation error. Use \"load()\" instead if a cyclic reference is intended.");
return NULL;
}
@@ -518,7 +528,7 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s
} else if (tokenizer->get_token() == GDScriptTokenizer::TK_PR_YIELD) {
if (!current_function) {
- _set_error("yield() can only be used inside function blocks.");
+ _set_error("\"yield()\" can only be used inside function blocks.");
return NULL;
}
@@ -526,7 +536,7 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_OPEN) {
- _set_error("Expected '(' after 'yield'");
+ _set_error("Expected \"(\" after \"yield\".");
return NULL;
}
@@ -552,7 +562,7 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s
yield->arguments.push_back(object);
if (tokenizer->get_token() != GDScriptTokenizer::TK_COMMA) {
- _set_error("Expected ',' after first argument of 'yield'");
+ _set_error("Expected \",\" after the first argument of \"yield\".");
return NULL;
}
@@ -578,7 +588,7 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s
yield->arguments.push_back(signal);
if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_CLOSE) {
- _set_error("Expected ')' after second argument of 'yield'");
+ _set_error("Expected \")\" after the second argument of \"yield\".");
return NULL;
}
@@ -592,7 +602,7 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s
} else if (tokenizer->get_token() == GDScriptTokenizer::TK_SELF) {
if (p_static) {
- _set_error("'self'' not allowed in static function or constant expression");
+ _set_error("\"self\" isn't allowed in a static function or constant expression.");
return NULL;
}
//constant defined by tokenizer
@@ -613,7 +623,7 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s
if (identifier == StringName()) {
- _set_error("Built-in type constant or static function expected after '.'");
+ _set_error("Built-in type constant or static function expected after \".\".");
return NULL;
}
if (!Variant::has_constant(bi_type, identifier)) {
@@ -668,7 +678,7 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s
expr = cn;
}
- } else if (tokenizer->get_token(1) == GDScriptTokenizer::TK_PARENTHESIS_OPEN && tokenizer->is_token_literal()) {
+ } else if (tokenizer->get_token(next_valid_offset) == GDScriptTokenizer::TK_PARENTHESIS_OPEN && tokenizer->is_token_literal()) {
// We check with is_token_literal, as this allows us to use match/sync/etc. as a name
//function or constructor
@@ -2309,7 +2319,7 @@ void GDScriptParser::_generate_pattern(PatternNode *p_pattern, Node *p_node_to_m
// static type check if possible
if (pattern_type.has_type && to_match_type.has_type) {
if (!_is_type_compatible(to_match_type, pattern_type) && !_is_type_compatible(pattern_type, to_match_type)) {
- _set_error("Pattern type (" + pattern_type.to_string() + ") is not compatible with the type of the value to match (" + to_match_type.to_string() + ").",
+ _set_error("The pattern type (" + pattern_type.to_string() + ") isn't compatible with the type of the value to match (" + to_match_type.to_string() + ").",
p_pattern->line);
return;
}
@@ -2761,24 +2771,24 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
case GDScriptTokenizer::TK_CF_PASS: {
if (tokenizer->get_token(1) != GDScriptTokenizer::TK_SEMICOLON && tokenizer->get_token(1) != GDScriptTokenizer::TK_NEWLINE && tokenizer->get_token(1) != GDScriptTokenizer::TK_EOF) {
- _set_error("Expected ';' or <NewLine>.");
+ _set_error("Expected \";\" or a line break.");
return;
}
_mark_line_as_safe(tokenizer->get_token_line());
tokenizer->advance();
if (tokenizer->get_token() == GDScriptTokenizer::TK_SEMICOLON) {
- // Ignore semicolon after 'pass'
+ // Ignore semicolon after 'pass'.
tokenizer->advance();
}
} break;
case GDScriptTokenizer::TK_PR_VAR: {
- //variale declaration and (eventual) initialization
+ // Variable declaration and (eventual) initialization.
tokenizer->advance();
int var_line = tokenizer->get_token_line();
if (!tokenizer->is_token_literal(0, true)) {
- _set_error("Expected identifier for local variable name.");
+ _set_error("Expected an identifier for the local variable name.");
return;
}
StringName n = tokenizer->get_token_literal();
@@ -2786,7 +2796,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
if (current_function) {
for (int i = 0; i < current_function->arguments.size(); i++) {
if (n == current_function->arguments[i]) {
- _set_error("Variable '" + String(n) + "' already defined in the scope (at line: " + itos(current_function->line) + ").");
+ _set_error("Variable \"" + String(n) + "\" already defined in the scope (at line " + itos(current_function->line) + ").");
return;
}
}
@@ -2794,7 +2804,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
BlockNode *check_block = p_block;
while (check_block) {
if (check_block->variables.has(n)) {
- _set_error("Variable '" + String(n) + "' already defined in the scope (at line: " + itos(check_block->variables[n]->line) + ").");
+ _set_error("Variable \"" + String(n) + "\" already defined in the scope (at line " + itos(check_block->variables[n]->line) + ").");
return;
}
check_block = check_block->parent_block;
@@ -2816,7 +2826,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
#endif
tokenizer->advance();
} else if (!_parse_type(lv->datatype)) {
- _set_error("Expected type for variable.");
+ _set_error("Expected a type for the variable.");
return;
}
}
@@ -2865,7 +2875,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
lv->assign = assigned;
if (!_end_statement()) {
- _set_error("Expected end of statement (var)");
+ _set_error("Expected end of statement (\"var\").");
return;
}
@@ -2894,7 +2904,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
p_block->sub_blocks.push_back(cf_if->body);
if (!_enter_indent_block(cf_if->body)) {
- _set_error("Expected indented block after 'if'");
+ _set_error("Expected an indented block after \"if\".");
p_block->end_line = tokenizer->get_token_line();
return;
}
@@ -2924,7 +2934,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
if (tab_level.back()->get() > indent_level) {
- _set_error("Invalid indent");
+ _set_error("Invalid indentation.");
return;
}
@@ -2955,7 +2965,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
p_block->sub_blocks.push_back(cf_if->body);
if (!_enter_indent_block(cf_if->body)) {
- _set_error("Expected indented block after 'elif'");
+ _set_error("Expected an indented block after \"elif\".");
p_block->end_line = tokenizer->get_token_line();
return;
}
@@ -2971,7 +2981,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
} else if (tokenizer->get_token() == GDScriptTokenizer::TK_CF_ELSE) {
if (tab_level.back()->get() > indent_level) {
- _set_error("Invalid indent");
+ _set_error("Invalid indentation.");
return;
}
@@ -2981,7 +2991,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
p_block->sub_blocks.push_back(cf_if->body_else);
if (!_enter_indent_block(cf_if->body_else)) {
- _set_error("Expected indented block after 'else'");
+ _set_error("Expected an indented block after \"else\".");
p_block->end_line = tokenizer->get_token_line();
return;
}
@@ -3026,7 +3036,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
p_block->sub_blocks.push_back(cf_while->body);
if (!_enter_indent_block(cf_while->body)) {
- _set_error("Expected indented block after 'while'");
+ _set_error("Expected an indented block after \"while\".");
p_block->end_line = tokenizer->get_token_line();
return;
}
@@ -3045,7 +3055,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
if (!tokenizer->is_token_literal(0, true)) {
- _set_error("identifier expected after 'for'");
+ _set_error("Identifier expected after \"for\".");
}
IdentifierNode *id = alloc_node<IdentifierNode>();
@@ -3054,7 +3064,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_OP_IN) {
- _set_error("'in' expected after identifier");
+ _set_error("\"in\" expected after identifier.");
return;
}
@@ -3144,7 +3154,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
p_block->sub_blocks.push_back(cf_for->body);
if (!_enter_indent_block(cf_for->body)) {
- _set_error("Expected indented block after 'for'");
+ _set_error("Expected indented block after \"for\".");
p_block->end_line = tokenizer->get_token_line();
return;
}
@@ -3171,23 +3181,25 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
} break;
case GDScriptTokenizer::TK_CF_CONTINUE: {
+ _mark_line_as_safe(tokenizer->get_token_line());
tokenizer->advance();
ControlFlowNode *cf_continue = alloc_node<ControlFlowNode>();
cf_continue->cf_type = ControlFlowNode::CF_CONTINUE;
p_block->statements.push_back(cf_continue);
if (!_end_statement()) {
- _set_error("Expected end of statement (continue)");
+ _set_error("Expected end of statement (\"continue\").");
return;
}
} break;
case GDScriptTokenizer::TK_CF_BREAK: {
+ _mark_line_as_safe(tokenizer->get_token_line());
tokenizer->advance();
ControlFlowNode *cf_break = alloc_node<ControlFlowNode>();
cf_break->cf_type = ControlFlowNode::CF_BREAK;
p_block->statements.push_back(cf_break);
if (!_end_statement()) {
- _set_error("Expected end of statement (break)");
+ _set_error("Expected end of statement (\"break\").");
return;
}
} break;
@@ -3241,7 +3253,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
match_node->val_to_match = val_to_match;
if (!_enter_indent_block()) {
- _set_error("Expected indented pattern matching block after 'match'");
+ _set_error("Expected indented pattern matching block after \"match\".");
return;
}
@@ -3280,7 +3292,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
p_block->statements.push_back(an);
if (!_end_statement()) {
- _set_error("Expected end of statement after assert.");
+ _set_error("Expected end of statement after \"assert\".");
return;
}
} break;
@@ -3291,7 +3303,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
p_block->statements.push_back(bn);
if (!_end_statement()) {
- _set_error("Expected end of statement after breakpoint.");
+ _set_error("Expected end of statement after \"breakpoint\".");
return;
}
} break;
@@ -3323,7 +3335,7 @@ bool GDScriptParser::_parse_newline() {
int current_indent = tab_level.back()->get();
if (indent > current_indent) {
- _set_error("Unexpected indent.");
+ _set_error("Unexpected indentation.");
return false;
}
@@ -3333,7 +3345,7 @@ bool GDScriptParser::_parse_newline() {
//exit block
if (tab_level.size() == 1) {
- _set_error("Invalid indent. BUG?");
+ _set_error("Invalid indentation. Bug?");
return false;
}
@@ -3360,13 +3372,13 @@ void GDScriptParser::_parse_extends(ClassNode *p_class) {
if (p_class->extends_used) {
- _set_error("'extends' already used for this class.");
+ _set_error("\"extends\" can only be present once per script.");
return;
}
- if (!p_class->constant_expressions.empty() || !p_class->subclasses.empty() || !p_class->functions.empty() || !p_class->variables.empty() || p_class->classname_used) {
+ if (!p_class->constant_expressions.empty() || !p_class->subclasses.empty() || !p_class->functions.empty() || !p_class->variables.empty()) {
- _set_error("'extends' must be used before anything else.");
+ _set_error("\"extends\" must be used before anything else.");
return;
}
@@ -3386,7 +3398,7 @@ void GDScriptParser::_parse_extends(ClassNode *p_class) {
Variant constant = tokenizer->get_token_constant();
if (constant.get_type() != Variant::STRING) {
- _set_error("'extends' constant must be a string.");
+ _set_error("\"extends\" constant must be a string.");
return;
}
@@ -3421,7 +3433,7 @@ void GDScriptParser::_parse_extends(ClassNode *p_class) {
default: {
- _set_error("Invalid 'extends' syntax, expected string constant (path) and/or identifier (parent class).");
+ _set_error("Invalid \"extends\" syntax, expected string constant (path) and/or identifier (parent class).");
return;
}
}
@@ -3481,7 +3493,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (error_set)
return;
if (!_end_statement()) {
- _set_error("Expected end of statement after extends");
+ _set_error("Expected end of statement after \"extends\".");
return;
}
@@ -3490,20 +3502,20 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
_mark_line_as_safe(tokenizer->get_token_line());
if (p_class->owner) {
- _set_error("'class_name' is only valid for the main class namespace.");
+ _set_error("\"class_name\" is only valid for the main class namespace.");
return;
}
if (self_path.begins_with("res://") && self_path.find("::") != -1) {
- _set_error("'class_name' not allowed in built-in scripts.");
+ _set_error("\"class_name\" isn't allowed in built-in scripts.");
return;
}
if (tokenizer->get_token(1) != GDScriptTokenizer::TK_IDENTIFIER) {
- _set_error("'class_name' syntax: 'class_name <UniqueName>'");
+ _set_error("\"class_name\" syntax: \"class_name <UniqueName>\"");
return;
}
if (p_class->classname_used) {
- _set_error("'class_name' already used for this class.");
+ _set_error("\"class_name\" can only be present once per script.");
return;
}
@@ -3512,12 +3524,12 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
p_class->name = tokenizer->get_token_identifier(1);
if (self_path != String() && ScriptServer::is_global_class(p_class->name) && ScriptServer::get_global_class_path(p_class->name) != self_path) {
- _set_error("Unique global class '" + p_class->name + "' already exists at path: " + ScriptServer::get_global_class_path(p_class->name));
+ _set_error("Unique global class \"" + p_class->name + "\" already exists at path: " + ScriptServer::get_global_class_path(p_class->name));
return;
}
if (ClassDB::class_exists(p_class->name)) {
- _set_error("Class '" + p_class->name + "' shadows a native class.");
+ _set_error("The class \"" + p_class->name + "\" shadows a native class.");
return;
}
@@ -3544,12 +3556,12 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
} else {
- _set_error("Optional parameter after 'class_name' must be a string constant file path to an icon.");
+ _set_error("The optional parameter after \"class_name\" must be a string constant file path to an icon.");
return;
}
} else if (tokenizer->get_token() == GDScriptTokenizer::TK_CONSTANT) {
- _set_error("Class icon must be separated by a comma.");
+ _set_error("The class icon must be separated by a comma.");
return;
}
@@ -3558,7 +3570,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (p_class->tool) {
- _set_error("tool used more than once");
+ _set_error("The \"tool\" keyword can only be present once per script.");
return;
}
@@ -3573,7 +3585,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token(1) != GDScriptTokenizer::TK_IDENTIFIER) {
- _set_error("'class' syntax: 'class <Name>:' or 'class <Name> extends <BaseClass>:'");
+ _set_error("\"class\" syntax: \"class <Name>:\" or \"class <Name> extends <BaseClass>:\"");
return;
}
name = tokenizer->get_token_identifier(1);
@@ -3581,23 +3593,23 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
// Check if name is shadowing something else
if (ClassDB::class_exists(name) || ClassDB::class_exists("_" + name.operator String())) {
- _set_error("Class '" + String(name) + "' shadows a native class.");
+ _set_error("The class \"" + String(name) + "\" shadows a native class.");
return;
}
if (ScriptServer::is_global_class(name)) {
- _set_error("Can't override name of unique global class '" + name + "' already exists at path: " + ScriptServer::get_global_class_path(p_class->name));
+ _set_error("Can't override name of the unique global class \"" + name + "\". It already exists at: " + ScriptServer::get_global_class_path(p_class->name));
return;
}
ClassNode *outer_class = p_class;
while (outer_class) {
for (int i = 0; i < outer_class->subclasses.size(); i++) {
if (outer_class->subclasses[i]->name == name) {
- _set_error("Another class named '" + String(name) + "' already exists in this scope (at line " + itos(outer_class->subclasses[i]->line) + ").");
+ _set_error("Another class named \"" + String(name) + "\" already exists in this scope (at line " + itos(outer_class->subclasses[i]->line) + ").");
return;
}
}
if (outer_class->constant_expressions.has(name)) {
- _set_error("A constant named '" + String(name) + "' already exists in the outer class scope (at line" + itos(outer_class->constant_expressions[name].expression->line) + ").");
+ _set_error("A constant named \"" + String(name) + "\" already exists in the outer class scope (at line" + itos(outer_class->constant_expressions[name].expression->line) + ").");
return;
}
@@ -3641,7 +3653,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PR_FUNCTION) {
- _set_error("Expected 'func'.");
+ _set_error("Expected \"func\".");
return;
}
@@ -3665,18 +3677,18 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (name == StringName()) {
- _set_error("Expected identifier after 'func' (syntax: 'func <identifier>([arguments]):' ).");
+ _set_error("Expected an identifier after \"func\" (syntax: \"func <identifier>([arguments]):\").");
return;
}
for (int i = 0; i < p_class->functions.size(); i++) {
if (p_class->functions[i]->name == name) {
- _set_error("Function '" + String(name) + "' already exists in this class (at line: " + itos(p_class->functions[i]->line) + ").");
+ _set_error("The function \"" + String(name) + "\" already exists in this class (at line " + itos(p_class->functions[i]->line) + ").");
}
}
for (int i = 0; i < p_class->static_functions.size(); i++) {
if (p_class->static_functions[i]->name == name) {
- _set_error("Function '" + String(name) + "' already exists in this class (at line: " + itos(p_class->static_functions[i]->line) + ").");
+ _set_error("The function \"" + String(name) + "\" already exists in this class (at line " + itos(p_class->static_functions[i]->line) + ").");
}
}
@@ -3698,7 +3710,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_OPEN) {
- _set_error("Expected '(' after identifier (syntax: 'func <identifier>([arguments]):' ).");
+ _set_error("Expected \"(\" after the identifier (syntax: \"func <identifier>([arguments]):\" ).");
return;
}
@@ -3730,7 +3742,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (!tokenizer->is_token_literal(0, true)) {
- _set_error("Expected identifier for argument.");
+ _set_error("Expected an identifier for an argument.");
return;
}
@@ -3748,7 +3760,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
argtype.infer_type = true;
tokenizer->advance();
} else if (!_parse_type(argtype)) {
- _set_error("Expected type for argument.");
+ _set_error("Expected a type for an argument.");
return;
}
}
@@ -3797,7 +3809,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
continue;
} else if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_CLOSE) {
- _set_error("Expected ',' or ')'.");
+ _set_error("Expected \",\" or \")\".");
return;
}
@@ -3826,7 +3838,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (name == "_init") {
if (_static) {
- _set_error("Constructor cannot be static.");
+ _set_error("The constructor cannot be static.");
return;
}
@@ -3843,7 +3855,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() == GDScriptTokenizer::TK_PERIOD) {
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_OPEN) {
- _set_error("expected '(' for parent constructor arguments.");
+ _set_error("Expected \"(\" for parent constructor arguments.");
return;
}
tokenizer->advance();
@@ -3863,7 +3875,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
continue;
} else if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_CLOSE) {
- _set_error("Expected ',' or ')'.");
+ _set_error("Expected \",\" or \")\".");
return;
}
@@ -3888,7 +3900,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() == GDScriptTokenizer::TK_FORWARD_ARROW) {
if (!_parse_type(return_type, true)) {
- _set_error("Expected return type for function.");
+ _set_error("Expected a return type for the function.");
return;
}
}
@@ -3918,7 +3930,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (!tokenizer->is_token_literal()) {
- _set_error("Expected identifier after 'signal'.");
+ _set_error("Expected an identifier after \"signal\".");
return;
}
@@ -3942,7 +3954,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
}
if (!tokenizer->is_token_literal(0, true)) {
- _set_error("Expected identifier in signal argument.");
+ _set_error("Expected an identifier in a \"signal\" argument.");
return;
}
@@ -3956,7 +3968,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() == GDScriptTokenizer::TK_COMMA) {
tokenizer->advance();
} else if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_CLOSE) {
- _set_error("Expected ',' or ')' after signal parameter identifier.");
+ _set_error("Expected \",\" or \")\" after a \"signal\" parameter identifier.");
return;
}
}
@@ -3965,7 +3977,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
p_class->_signals.push_back(sig);
if (!_end_statement()) {
- _set_error("Expected end of statement (signal)");
+ _set_error("Expected end of statement (\"signal\").");
return;
}
} break;
@@ -4024,7 +4036,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
break;
}
if (tokenizer->get_token() != GDScriptTokenizer::TK_COMMA) {
- _set_error("Expected ',' in bit flags hint.");
+ _set_error("Expected \",\" in the bit flags hint.");
return;
}
@@ -4036,7 +4048,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_CONSTANT || tokenizer->get_token_constant().get_type() != Variant::STRING) {
current_export = PropertyInfo();
- _set_error("Expected a string constant in named bit flags hint.");
+ _set_error("Expected a string constant in the named bit flags hint.");
return;
}
@@ -4054,7 +4066,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_COMMA) {
current_export = PropertyInfo();
- _set_error("Expected ')' or ',' in named bit flags hint.");
+ _set_error("Expected \")\" or \",\" in the named bit flags hint.");
return;
}
tokenizer->advance();
@@ -4067,7 +4079,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_CLOSE) {
- _set_error("Expected ')' in layers 2D render hint.");
+ _set_error("Expected \")\" in the layers 2D render hint.");
return;
}
current_export.hint = PROPERTY_HINT_LAYERS_2D_RENDER;
@@ -4078,7 +4090,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_CLOSE) {
- _set_error("Expected ')' in layers 2D physics hint.");
+ _set_error("Expected \")\" in the layers 2D physics hint.");
return;
}
current_export.hint = PROPERTY_HINT_LAYERS_2D_PHYSICS;
@@ -4089,7 +4101,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_CLOSE) {
- _set_error("Expected ')' in layers 3D render hint.");
+ _set_error("Expected \")\" in the layers 3D render hint.");
return;
}
current_export.hint = PROPERTY_HINT_LAYERS_3D_RENDER;
@@ -4100,7 +4112,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_CLOSE) {
- _set_error("Expected ')' in layers 3D physics hint.");
+ _set_error("Expected \")\" in the layers 3D physics hint.");
return;
}
current_export.hint = PROPERTY_HINT_LAYERS_3D_PHYSICS;
@@ -4116,7 +4128,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_CONSTANT || tokenizer->get_token_constant().get_type() != Variant::STRING) {
current_export = PropertyInfo();
- _set_error("Expected a string constant in enumeration hint.");
+ _set_error("Expected a string constant in the enumeration hint.");
return;
}
@@ -4134,7 +4146,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_COMMA) {
current_export = PropertyInfo();
- _set_error("Expected ')' or ',' in enumeration hint.");
+ _set_error("Expected \")\" or \",\" in the enumeration hint.");
return;
}
@@ -4152,7 +4164,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
current_export.hint = PROPERTY_HINT_EXP_EASING;
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_CLOSE) {
- _set_error("Expected ')' in hint.");
+ _set_error("Expected \")\" in the hint.");
return;
}
break;
@@ -4167,7 +4179,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() == GDScriptTokenizer::TK_PARENTHESIS_CLOSE)
break;
else if (tokenizer->get_token() != GDScriptTokenizer::TK_COMMA) {
- _set_error("Expected ')' or ',' in exponential range hint.");
+ _set_error("Expected \")\" or \",\" in the exponential range hint.");
return;
}
tokenizer->advance();
@@ -4183,7 +4195,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_CONSTANT || !tokenizer->get_token_constant().is_num()) {
current_export = PropertyInfo();
- _set_error("Expected a range in numeric hint.");
+ _set_error("Expected a range in the numeric hint.");
return;
}
@@ -4198,7 +4210,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_COMMA) {
current_export = PropertyInfo();
- _set_error("Expected ',' or ')' in numeric range hint.");
+ _set_error("Expected \",\" or \")\" in the numeric range hint.");
return;
}
@@ -4213,7 +4225,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_CONSTANT || !tokenizer->get_token_constant().is_num()) {
current_export = PropertyInfo();
- _set_error("Expected a number as upper bound in numeric range hint.");
+ _set_error("Expected a number as upper bound in the numeric range hint.");
return;
}
@@ -4226,7 +4238,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_COMMA) {
current_export = PropertyInfo();
- _set_error("Expected ',' or ')' in numeric range hint.");
+ _set_error("Expected \",\" or \")\" in the numeric range hint.");
return;
}
@@ -4240,7 +4252,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_CONSTANT || !tokenizer->get_token_constant().is_num()) {
current_export = PropertyInfo();
- _set_error("Expected a number as step in numeric range hint.");
+ _set_error("Expected a number as step in the numeric range hint.");
return;
}
@@ -4259,7 +4271,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_CONSTANT || tokenizer->get_token_constant().get_type() != Variant::STRING) {
current_export = PropertyInfo();
- _set_error("Expected a string constant in enumeration hint.");
+ _set_error("Expected a string constant in the enumeration hint.");
return;
}
@@ -4276,7 +4288,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_COMMA) {
current_export = PropertyInfo();
- _set_error("Expected ')' or ',' in enumeration hint.");
+ _set_error("Expected \")\" or \",\" in the enumeration hint.");
return;
}
tokenizer->advance();
@@ -4296,7 +4308,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_IDENTIFIER || !(tokenizer->get_token_identifier() == "GLOBAL")) {
- _set_error("Expected 'GLOBAL' after comma in directory hint.");
+ _set_error("Expected \"GLOBAL\" after comma in the directory hint.");
return;
}
if (!p_class->tool) {
@@ -4307,11 +4319,11 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_CLOSE) {
- _set_error("Expected ')' in hint.");
+ _set_error("Expected \")\" in the hint.");
return;
}
} else {
- _set_error("Expected ')' or ',' in hint.");
+ _set_error("Expected \")\" or \",\" in the hint.");
return;
}
break;
@@ -4340,7 +4352,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
else if (tokenizer->get_token() == GDScriptTokenizer::TK_COMMA)
tokenizer->advance();
else {
- _set_error("Expected ')' or ',' in hint.");
+ _set_error("Expected \")\" or \",\" in the hint.");
return;
}
}
@@ -4348,9 +4360,9 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_CONSTANT || tokenizer->get_token_constant().get_type() != Variant::STRING) {
if (current_export.hint == PROPERTY_HINT_GLOBAL_FILE)
- _set_error("Expected string constant with filter");
+ _set_error("Expected string constant with filter.");
else
- _set_error("Expected 'GLOBAL' or string constant with filter");
+ _set_error("Expected \"GLOBAL\" or string constant with filter.");
return;
}
current_export.hint_string = tokenizer->get_token_constant();
@@ -4358,7 +4370,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
}
if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_CLOSE) {
- _set_error("Expected ')' in hint.");
+ _set_error("Expected \")\" in the hint.");
return;
}
break;
@@ -4369,7 +4381,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
current_export.hint = PROPERTY_HINT_MULTILINE_TEXT;
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_CLOSE) {
- _set_error("Expected ')' in hint.");
+ _set_error("Expected \")\" in the hint.");
return;
}
break;
@@ -4380,7 +4392,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_IDENTIFIER) {
current_export = PropertyInfo();
- _set_error("Color type hint expects RGB or RGBA as hints");
+ _set_error("Color type hint expects RGB or RGBA as hints.");
return;
}
@@ -4391,7 +4403,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
//none
} else {
current_export = PropertyInfo();
- _set_error("Color type hint expects RGB or RGBA as hints");
+ _set_error("Color type hint expects RGB or RGBA as hints.");
return;
}
tokenizer->advance();
@@ -4400,7 +4412,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
default: {
current_export = PropertyInfo();
- _set_error("Type '" + Variant::get_type_name(type) + "' can't take hints.");
+ _set_error("Type \"" + Variant::get_type_name(type) + "\" can't take hints.");
return;
} break;
}
@@ -4438,7 +4450,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
} else {
current_export = PropertyInfo();
- _set_error("Export hint not a resource type.");
+ _set_error("The export hint isn't a resource type.");
}
} else if (constant.get_type() == Variant::DICTIONARY) {
// Enumeration
@@ -4452,7 +4464,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
} else {
current_export = PropertyInfo();
- _set_error("Expected 'FLAGS' after comma.");
+ _set_error("Expected \"FLAGS\" after comma.");
}
}
@@ -4489,7 +4501,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_PARENTHESIS_CLOSE) {
current_export = PropertyInfo();
- _set_error("Expected ')' or ',' after export hint.");
+ _set_error("Expected \")\" or \",\" after the export hint.");
return;
}
@@ -4509,7 +4521,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_PR_VAR && tokenizer->get_token() != GDScriptTokenizer::TK_PR_ONREADY && tokenizer->get_token() != GDScriptTokenizer::TK_PR_REMOTE && tokenizer->get_token() != GDScriptTokenizer::TK_PR_MASTER && tokenizer->get_token() != GDScriptTokenizer::TK_PR_PUPPET && tokenizer->get_token() != GDScriptTokenizer::TK_PR_SYNC && tokenizer->get_token() != GDScriptTokenizer::TK_PR_REMOTESYNC && tokenizer->get_token() != GDScriptTokenizer::TK_PR_MASTERSYNC && tokenizer->get_token() != GDScriptTokenizer::TK_PR_PUPPETSYNC && tokenizer->get_token() != GDScriptTokenizer::TK_PR_SLAVE) {
current_export = PropertyInfo();
- _set_error("Expected 'var', 'onready', 'remote', 'master', 'puppet', 'sync', 'remotesync', 'mastersync', 'puppetsync'.");
+ _set_error("Expected \"var\", \"onready\", \"remote\", \"master\", \"puppet\", \"sync\", \"remotesync\", \"mastersync\", \"puppetsync\".");
return;
}
@@ -4520,7 +4532,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
//may be fallthrough from export, ignore if so
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PR_VAR) {
- _set_error("Expected 'var'.");
+ _set_error("Expected \"var\".");
return;
}
@@ -4532,13 +4544,13 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (current_export.type) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_PR_VAR) {
- _set_error("Expected 'var'.");
+ _set_error("Expected \"var\".");
return;
}
} else {
if (tokenizer->get_token() != GDScriptTokenizer::TK_PR_VAR && tokenizer->get_token() != GDScriptTokenizer::TK_PR_FUNCTION) {
- _set_error("Expected 'var' or 'func'.");
+ _set_error("Expected \"var\" or \"func\".");
return;
}
}
@@ -4552,13 +4564,13 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (current_export.type) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_PR_VAR) {
- _set_error("Expected 'var'.");
+ _set_error("Expected \"var\".");
return;
}
} else {
if (tokenizer->get_token() != GDScriptTokenizer::TK_PR_VAR && tokenizer->get_token() != GDScriptTokenizer::TK_PR_FUNCTION) {
- _set_error("Expected 'var' or 'func'.");
+ _set_error("Expected \"var\" or \"func\".");
return;
}
}
@@ -4577,13 +4589,13 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (current_export.type) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_PR_VAR) {
- _set_error("Expected 'var'.");
+ _set_error("Expected \"var\".");
return;
}
} else {
if (tokenizer->get_token() != GDScriptTokenizer::TK_PR_VAR && tokenizer->get_token() != GDScriptTokenizer::TK_PR_FUNCTION) {
- _set_error("Expected 'var' or 'func'.");
+ _set_error("Expected \"var\" or \"func\".");
return;
}
}
@@ -4598,9 +4610,9 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PR_VAR && tokenizer->get_token() != GDScriptTokenizer::TK_PR_FUNCTION) {
if (current_export.type)
- _set_error("Expected 'var'.");
+ _set_error("Expected \"var\".");
else
- _set_error("Expected 'var' or 'func'.");
+ _set_error("Expected \"var\" or \"func\".");
return;
}
@@ -4613,9 +4625,9 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PR_VAR && tokenizer->get_token() != GDScriptTokenizer::TK_PR_FUNCTION) {
if (current_export.type)
- _set_error("Expected 'var'.");
+ _set_error("Expected \"var\".");
else
- _set_error("Expected 'var' or 'func'.");
+ _set_error("Expected \"var\" or \"func\".");
return;
}
@@ -4628,9 +4640,9 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (tokenizer->get_token() != GDScriptTokenizer::TK_PR_VAR && tokenizer->get_token() != GDScriptTokenizer::TK_PR_FUNCTION) {
if (current_export.type)
- _set_error("Expected 'var'.");
+ _set_error("Expected \"var\".");
else
- _set_error("Expected 'var' or 'func'.");
+ _set_error("Expected \"var\" or \"func\".");
return;
}
@@ -4653,7 +4665,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (!tokenizer->is_token_literal(0, true)) {
- _set_error("Expected identifier for member variable name.");
+ _set_error("Expected an identifier for the member variable name.");
return;
}
@@ -4669,14 +4681,14 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
#endif
if (current_class->constant_expressions.has(member.identifier)) {
- _set_error("A constant named '" + String(member.identifier) + "' already exists in this class (at line: " +
+ _set_error("A constant named \"" + String(member.identifier) + "\" already exists in this class (at line: " +
itos(current_class->constant_expressions[member.identifier].expression->line) + ").");
return;
}
for (int i = 0; i < current_class->variables.size(); i++) {
if (current_class->variables[i].identifier == member.identifier) {
- _set_error("Variable '" + String(member.identifier) + "' already exists in this class (at line: " +
+ _set_error("Variable \"" + String(member.identifier) + "\" already exists in this class (at line: " +
itos(current_class->variables[i].line) + ").");
return;
}
@@ -4684,7 +4696,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
for (int i = 0; i < current_class->subclasses.size(); i++) {
if (current_class->subclasses[i]->name == member.identifier) {
- _set_error("A class named '" + String(member.identifier) + "' already exists in this class (at line " + itos(current_class->subclasses[i]->line) + ").");
+ _set_error("A class named \"" + String(member.identifier) + "\" already exists in this class (at line " + itos(current_class->subclasses[i]->line) + ").");
return;
}
}
@@ -4714,7 +4726,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
#endif
tokenizer->advance();
} else if (!_parse_type(member.data_type)) {
- _set_error("Expected type for class variable.");
+ _set_error("Expected a type for the class variable.");
return;
}
}
@@ -4742,7 +4754,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
IdentifierNode *id = static_cast<IdentifierNode *>(op->arguments[1]);
if (id->name == "get_node") {
- _set_error("Use 'onready var " + String(member.identifier) + " = get_node(..)' instead");
+ _set_error("Use \"onready var " + String(member.identifier) + " = get_node(...)\" instead.");
return;
}
}
@@ -4770,7 +4782,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
Object *obj = cn->value;
Resource *res = Object::cast_to<Resource>(obj);
if (res == NULL) {
- _set_error("Exported constant not a type or resource.");
+ _set_error("The exported constant isn't a type or resource.");
return;
}
member._export.hint = PROPERTY_HINT_RESOURCE_TYPE;
@@ -4788,7 +4800,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
const Variant *args = &cn->value;
cn->value = Variant::construct(member._export.type, &args, 1, err);
} else {
- _set_error("Cannot convert the provided value to the export type.");
+ _set_error("Can't convert the provided value to the export type.");
return;
}
}
@@ -4886,7 +4898,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() != GDScriptTokenizer::TK_COMMA) {
//just comma means using only getter
if (!tokenizer->is_token_literal()) {
- _set_error("Expected identifier for setter function after 'setget'.");
+ _set_error("Expected an identifier for the setter function after \"setget\".");
}
member.setter = tokenizer->get_token_literal();
@@ -4899,7 +4911,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (!tokenizer->is_token_literal()) {
- _set_error("Expected identifier for getter function after ','.");
+ _set_error("Expected an identifier for the getter function after \",\".");
}
member.getter = tokenizer->get_token_literal();
@@ -4910,7 +4922,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
p_class->variables.push_back(member);
if (!_end_statement()) {
- _set_error("Expected end of statement (continue)");
+ _set_error("Expected end of statement (\"continue\").");
return;
}
} break;
@@ -4922,7 +4934,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
if (!tokenizer->is_token_literal(0, true)) {
- _set_error("Expected name (identifier) for constant.");
+ _set_error("Expected an identifier for the constant.");
return;
}
@@ -4930,14 +4942,14 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
int line = tokenizer->get_token_line();
if (current_class->constant_expressions.has(const_id)) {
- _set_error("Constant '" + String(const_id) + "' already exists in this class (at line: " +
+ _set_error("Constant \"" + String(const_id) + "\" already exists in this class (at line " +
itos(current_class->constant_expressions[const_id].expression->line) + ").");
return;
}
for (int i = 0; i < current_class->variables.size(); i++) {
if (current_class->variables[i].identifier == const_id) {
- _set_error("A variable named '" + String(const_id) + "' already exists in this class (at line: " +
+ _set_error("A variable named \"" + String(const_id) + "\" already exists in this class (at line " +
itos(current_class->variables[i].line) + ").");
return;
}
@@ -4945,7 +4957,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
for (int i = 0; i < current_class->subclasses.size(); i++) {
if (current_class->subclasses[i]->name == const_id) {
- _set_error("A class named '" + String(const_id) + "' already exists in this class (at line " + itos(current_class->subclasses[i]->line) + ").");
+ _set_error("A class named \"" + String(const_id) + "\" already exists in this class (at line " + itos(current_class->subclasses[i]->line) + ").");
return;
}
}
@@ -4960,13 +4972,13 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
#endif
tokenizer->advance();
} else if (!_parse_type(constant.type)) {
- _set_error("Expected type for class constant.");
+ _set_error("Expected a type for the class constant.");
return;
}
}
if (tokenizer->get_token() != GDScriptTokenizer::TK_OP_ASSIGN) {
- _set_error("Constant expects assignment.");
+ _set_error("Constants must be assigned immediately.");
return;
}
@@ -4981,7 +4993,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
}
if (subexpr->type != Node::TYPE_CONSTANT) {
- _set_error("Expected constant expression", line);
+ _set_error("Expected a constant expression.", line);
return;
}
subexpr->line = line;
@@ -4990,7 +5002,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
p_class->constant_expressions.insert(const_id, constant);
if (!_end_statement()) {
- _set_error("Expected end of statement (constant)", line);
+ _set_error("Expected end of statement (constant).", line);
return;
}
@@ -5007,14 +5019,14 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
enum_name = tokenizer->get_token_literal();
if (current_class->constant_expressions.has(enum_name)) {
- _set_error("A constant named '" + String(enum_name) + "' already exists in this class (at line: " +
+ _set_error("A constant named \"" + String(enum_name) + "\" already exists in this class (at line " +
itos(current_class->constant_expressions[enum_name].expression->line) + ").");
return;
}
for (int i = 0; i < current_class->variables.size(); i++) {
if (current_class->variables[i].identifier == enum_name) {
- _set_error("A variable named '" + String(enum_name) + "' already exists in this class (at line: " +
+ _set_error("A variable named \"" + String(enum_name) + "\" already exists in this class (at line " +
itos(current_class->variables[i].line) + ").");
return;
}
@@ -5022,7 +5034,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
for (int i = 0; i < current_class->subclasses.size(); i++) {
if (current_class->subclasses[i]->name == enum_name) {
- _set_error("A class named '" + String(enum_name) + "' already exists in this class (at line " + itos(current_class->subclasses[i]->line) + ").");
+ _set_error("A class named \"" + String(enum_name) + "\" already exists in this class (at line " + itos(current_class->subclasses[i]->line) + ").");
return;
}
}
@@ -5030,7 +5042,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
tokenizer->advance();
}
if (tokenizer->get_token() != GDScriptTokenizer::TK_CURLY_BRACKET_OPEN) {
- _set_error("Expected '{' in enum declaration");
+ _set_error("Expected \"{\" in the enum declaration.");
return;
}
tokenizer->advance();
@@ -5048,7 +5060,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() == GDScriptTokenizer::TK_EOF) {
_set_error("Unexpected end of file.");
} else {
- _set_error(String("Unexpected ") + GDScriptTokenizer::get_token_name(tokenizer->get_token()) + ", expected identifier");
+ _set_error(String("Unexpected ") + GDScriptTokenizer::get_token_name(tokenizer->get_token()) + ", expected an identifier.");
}
return;
@@ -5071,14 +5083,14 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
}
if (subexpr->type != Node::TYPE_CONSTANT) {
- _set_error("Expected constant expression");
+ _set_error("Expected a constant expression.");
return;
}
enum_value_expr = static_cast<ConstantNode *>(subexpr);
if (enum_value_expr->value.get_type() != Variant::INT) {
- _set_error("Expected an int value for enum");
+ _set_error("Expected an integer value for \"enum\".");
return;
}
@@ -5094,7 +5106,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (tokenizer->get_token() == GDScriptTokenizer::TK_COMMA) {
tokenizer->advance();
} else if (tokenizer->is_token_literal(0, true)) {
- _set_error("Unexpected identifier");
+ _set_error("Unexpected identifier.");
return;
}
@@ -5102,14 +5114,14 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
enum_dict[const_id] = enum_value_expr->value;
} else {
if (current_class->constant_expressions.has(const_id)) {
- _set_error("A constant named '" + String(const_id) + "' already exists in this class (at line: " +
+ _set_error("A constant named \"" + String(const_id) + "\" already exists in this class (at line " +
itos(current_class->constant_expressions[const_id].expression->line) + ").");
return;
}
for (int i = 0; i < current_class->variables.size(); i++) {
if (current_class->variables[i].identifier == const_id) {
- _set_error("A variable named '" + String(const_id) + "' already exists in this class (at line: " +
+ _set_error("A variable named \"" + String(const_id) + "\" already exists in this class (at line " +
itos(current_class->variables[i].line) + ").");
return;
}
@@ -5117,7 +5129,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
for (int i = 0; i < current_class->subclasses.size(); i++) {
if (current_class->subclasses[i]->name == const_id) {
- _set_error("A class named '" + String(const_id) + "' already exists in this class (at line " + itos(current_class->subclasses[i]->line) + ").");
+ _set_error("A class named \"" + String(const_id) + "\" already exists in this class (at line " + itos(current_class->subclasses[i]->line) + ").");
return;
}
}
@@ -5144,7 +5156,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
}
if (!_end_statement()) {
- _set_error("Expected end of statement (enum)");
+ _set_error("Expected end of statement (\"enum\").");
return;
}
@@ -5190,19 +5202,19 @@ void GDScriptParser::_determine_inheritance(ClassNode *p_class, bool p_recursive
String base = base_path;
if (base == "" || base.is_rel_path()) {
- _set_error("Could not resolve relative path for parent class: " + path, p_class->line);
+ _set_error("Couldn't resolve relative path for the parent class: " + path, p_class->line);
return;
}
path = base.plus_file(path).simplify_path();
}
script = ResourceLoader::load(path);
if (script.is_null()) {
- _set_error("Could not load base class: " + path, p_class->line);
+ _set_error("Couldn't load the base class: " + path, p_class->line);
return;
}
if (!script->is_valid()) {
- _set_error("Script not fully loaded (cyclic preload?): " + path, p_class->line);
+ _set_error("Script isn't fully loaded (cyclic preload?): " + path, p_class->line);
return;
}
@@ -5217,7 +5229,7 @@ void GDScriptParser::_determine_inheritance(ClassNode *p_class, bool p_recursive
script = subclass;
} else {
- _set_error("Could not find subclass: " + sub, p_class->line);
+ _set_error("Couldn't find the subclass: " + sub, p_class->line);
return;
}
}
@@ -5239,10 +5251,35 @@ void GDScriptParser::_determine_inheritance(ClassNode *p_class, bool p_recursive
if (ScriptServer::is_global_class(base)) {
base_script = ResourceLoader::load(ScriptServer::get_global_class_path(base));
if (!base_script.is_valid()) {
- _set_error("Class '" + base + "' could not be fully loaded (script error or cyclic dependency).", p_class->line);
+ _set_error("The class \"" + base + "\" couldn't be fully loaded (script error or cyclic dependency).", p_class->line);
return;
}
p = NULL;
+ } else {
+ List<PropertyInfo> props;
+ ProjectSettings::get_singleton()->get_property_list(&props);
+ for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
+ String s = E->get().name;
+ if (!s.begins_with("autoload/")) {
+ continue;
+ }
+ String name = s.get_slice("/", 1);
+ if (name == base) {
+ String singleton_path = ProjectSettings::get_singleton()->get(s);
+ if (singleton_path.begins_with("*")) {
+ singleton_path = singleton_path.right(1);
+ }
+ if (!singleton_path.begins_with("res://")) {
+ singleton_path = "res://" + singleton_path;
+ }
+ base_script = ResourceLoader::load(singleton_path);
+ if (!base_script.is_valid()) {
+ _set_error("Class '" + base + "' could not be fully loaded (script error or cyclic inheritance).", p_class->line);
+ return;
+ }
+ p = NULL;
+ }
+ }
}
while (p) {
@@ -5280,13 +5317,13 @@ void GDScriptParser::_determine_inheritance(ClassNode *p_class, bool p_recursive
if (p->constant_expressions.has(base)) {
if (p->constant_expressions[base].expression->type != Node::TYPE_CONSTANT) {
- _set_error("Could not resolve constant '" + base + "'.", p_class->line);
+ _set_error("Couldn't resolve the constant \"" + base + "\".", p_class->line);
return;
}
const ConstantNode *cn = static_cast<const ConstantNode *>(p->constant_expressions[base].expression);
base_script = cn->value;
if (base_script.is_null()) {
- _set_error("Constant is not a class: " + base, p_class->line);
+ _set_error("Constant isn't a class: " + base, p_class->line);
return;
}
break;
@@ -5313,13 +5350,13 @@ void GDScriptParser::_determine_inheritance(ClassNode *p_class, bool p_recursive
Ref<GDScript> new_base_class = base_script->get_constants()[subclass];
if (new_base_class.is_null()) {
- _set_error("Constant is not a class: " + ident, p_class->line);
+ _set_error("Constant isn't a class: " + ident, p_class->line);
return;
}
find_subclass = new_base_class;
} else {
- _set_error("Could not find subclass: " + ident, p_class->line);
+ _set_error("Couldn't find the subclass: " + ident, p_class->line);
return;
}
}
@@ -5330,13 +5367,13 @@ void GDScriptParser::_determine_inheritance(ClassNode *p_class, bool p_recursive
if (p_class->extends_class.size() > 1) {
- _set_error("Invalid inheritance (unknown class + subclasses)", p_class->line);
+ _set_error("Invalid inheritance (unknown class + subclasses).", p_class->line);
return;
}
//if not found, try engine classes
if (!GDScriptLanguage::get_singleton()->get_global_map().has(base)) {
- _set_error("Unknown class: '" + base + "'", p_class->line);
+ _set_error("Unknown class: \"" + base + "\"", p_class->line);
return;
}
@@ -5358,7 +5395,7 @@ void GDScriptParser::_determine_inheritance(ClassNode *p_class, bool p_recursive
p_class->base_type.kind = DataType::NATIVE;
p_class->base_type.native_type = native;
} else {
- _set_error("Could not determine inheritance", p_class->line);
+ _set_error("Couldn't determine inheritance.", p_class->line);
return;
}
@@ -5503,7 +5540,7 @@ bool GDScriptParser::_parse_type(DataType &r_type, bool p_can_be_void) {
switch (tokenizer->get_token()) {
case GDScriptTokenizer::TK_PERIOD: {
if (!can_index) {
- _set_error("Unexpected '.'.");
+ _set_error("Unexpected \".\".");
return false;
}
can_index = false;
@@ -5534,7 +5571,7 @@ bool GDScriptParser::_parse_type(DataType &r_type, bool p_can_be_void) {
}
if (tokenizer->get_token(-1) == GDScriptTokenizer::TK_PERIOD) {
- _set_error("Expected subclass identifier.");
+ _set_error("Expected a subclass identifier.");
return false;
}
@@ -5572,7 +5609,7 @@ GDScriptParser::DataType GDScriptParser::_resolve_type(const DataType &p_source,
Ref<GDScript> gds = script;
if (gds.is_valid()) {
if (!gds->is_valid()) {
- _set_error("Class '" + id + "' could not be fully loaded (script error or cyclic dependency).", p_line);
+ _set_error("The class \"" + id + "\" couldn't be fully loaded (script error or cyclic dependency).", p_line);
return DataType();
}
result.kind = DataType::GDSCRIPT;
@@ -5581,15 +5618,55 @@ GDScriptParser::DataType GDScriptParser::_resolve_type(const DataType &p_source,
result.kind = DataType::SCRIPT;
result.script_type = script;
} else {
- _set_error("Class '" + id + "' was found in global scope but its script could not be loaded.", p_line);
+ _set_error("The class \"" + id + "\" was found in global scope, but its script couldn't be loaded.", p_line);
return DataType();
}
}
name_part++;
continue;
- } else {
- p = current_class;
}
+ List<PropertyInfo> props;
+ ProjectSettings::get_singleton()->get_property_list(&props);
+ String singleton_path;
+ for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
+ String s = E->get().name;
+ if (!s.begins_with("autoload/")) {
+ continue;
+ }
+ String name = s.get_slice("/", 1);
+ if (name == id) {
+ singleton_path = ProjectSettings::get_singleton()->get(s);
+ if (singleton_path.begins_with("*")) {
+ singleton_path = singleton_path.right(1);
+ }
+ if (!singleton_path.begins_with("res://")) {
+ singleton_path = "res://" + singleton_path;
+ }
+ break;
+ }
+ }
+ if (!singleton_path.empty()) {
+ Ref<Script> script = ResourceLoader::load(singleton_path);
+ Ref<GDScript> gds = script;
+ if (gds.is_valid()) {
+ if (!gds->is_valid()) {
+ _set_error("Class '" + id + "' could not be fully loaded (script error or cyclic inheritance).", p_line);
+ return DataType();
+ }
+ result.kind = DataType::GDSCRIPT;
+ result.script_type = gds;
+ } else if (script.is_valid()) {
+ result.kind = DataType::SCRIPT;
+ result.script_type = script;
+ } else {
+ _set_error("Couldn't fully load singleton script '" + id + "' (possible cyclic reference or parse error).", p_line);
+ return DataType();
+ }
+ name_part++;
+ continue;
+ }
+
+ p = current_class;
} else if (base_type.kind == DataType::CLASS) {
p = base_type.class_type;
}
@@ -5682,8 +5759,8 @@ GDScriptParser::DataType GDScriptParser::_resolve_type(const DataType &p_source,
} else {
base = result.to_string();
}
- _set_error("Identifier '" + String(id) + "' is not a valid type (not a script or class), or could not be found on base '" +
- base + "'.",
+ _set_error("The identifier \"" + String(id) + "\" isn't a valid type (not a script or class), or couldn't be found on base \"" +
+ base + "\".",
p_line);
return DataType();
}
@@ -5761,7 +5838,7 @@ GDScriptParser::DataType GDScriptParser::_type_from_gdtype(const GDScriptDataTyp
switch (p_gdtype.kind) {
case GDScriptDataType::UNINITIALIZED: {
- ERR_EXPLAIN("Uninitialized datatype. Please report a bug.");
+ ERR_PRINT("Uninitialized datatype. Please report a bug.");
} break;
case GDScriptDataType::BUILTIN: {
result.kind = DataType::BUILTIN;
@@ -6147,8 +6224,8 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
}
if (!valid) {
- _set_error("Invalid cast. Cannot convert from '" + source_type.to_string() +
- "' to '" + cn->cast_type.to_string() + "'.",
+ _set_error("Invalid cast. Cannot convert from \"" + source_type.to_string() +
+ "\" to \"" + cn->cast_type.to_string() + "\".",
cn->line);
return DataType();
}
@@ -6177,11 +6254,11 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
DataType signal_type = _reduce_node_type(op->arguments[1]);
// TODO: Check if signal exists when it's a constant
if (base_type.has_type && base_type.kind == DataType::BUILTIN && base_type.builtin_type != Variant::NIL && base_type.builtin_type != Variant::OBJECT) {
- _set_error("First argument of 'yield()' must be an object.", op->line);
+ _set_error("The first argument of \"yield()\" must be an object.", op->line);
return DataType();
}
if (signal_type.has_type && (signal_type.kind != DataType::BUILTIN || signal_type.builtin_type != Variant::STRING)) {
- _set_error("Second argument of 'yield()' must be a string.", op->line);
+ _set_error("The second argument of \"yield()\" must be a string.", op->line);
return DataType();
}
}
@@ -6201,15 +6278,15 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
if (check_types && type_type.has_type) {
if (!type_type.is_meta_type && (type_type.kind != DataType::NATIVE || !ClassDB::is_parent_class(type_type.native_type, "Script"))) {
- _set_error("Invalid 'is' test: right operand is not a type (not a native type nor a script).", op->line);
+ _set_error("Invalid \"is\" test: the right operand isn't a type (neither a native type nor a script).", op->line);
return DataType();
}
type_type.is_meta_type = false; // Test the actual type
if (!_is_type_compatible(type_type, value_type) && !_is_type_compatible(value_type, type_type)) {
if (op->op == OperatorNode::OP_IS) {
- _set_error("A value of type '" + value_type.to_string() + "' will never be an instance of '" + type_type.to_string() + "'.", op->line);
+ _set_error("A value of type \"" + value_type.to_string() + "\" will never be an instance of \"" + type_type.to_string() + "\".", op->line);
} else {
- _set_error("A value of type '" + value_type.to_string() + "' will never be of type '" + type_type.to_string() + "'.", op->line);
+ _set_error("A value of type \"" + value_type.to_string() + "\" will never be of type \"" + type_type.to_string() + "\".", op->line);
}
return DataType();
}
@@ -6237,8 +6314,8 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
node_type = _get_operation_type(var_op, argument_type, argument_type, valid);
if (check_types && !valid) {
- _set_error("Invalid operand type ('" + argument_type.to_string() +
- "') to unary operator '" + Variant::get_operator_name(var_op) + "'.",
+ _set_error("Invalid operand type (\"" + argument_type.to_string() +
+ "\") to unary operator \"" + Variant::get_operator_name(var_op) + "\".",
op->line, op->column);
return DataType();
}
@@ -6282,8 +6359,8 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
node_type = _get_operation_type(var_op, argument_a_type, argument_b_type, valid);
if (check_types && !valid) {
- _set_error("Invalid operand types ('" + argument_a_type.to_string() + "' and '" +
- argument_b_type.to_string() + "') to operator '" + Variant::get_operator_name(var_op) + "'.",
+ _set_error("Invalid operand types (\"" + argument_a_type.to_string() + "\" and \"" +
+ argument_b_type.to_string() + "\") to operator \"" + Variant::get_operator_name(var_op) + "\".",
op->line, op->column);
return DataType();
}
@@ -6298,7 +6375,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
// Ternary operators
case OperatorNode::OP_TERNARY_IF: {
if (op->arguments.size() != 3) {
- _set_error("Parser bug: ternary operation without 3 arguments");
+ _set_error("Parser bug: ternary operation without 3 arguments.");
ERR_FAIL_V(DataType());
}
@@ -6331,7 +6408,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
case OperatorNode::OP_ASSIGN_BIT_XOR:
case OperatorNode::OP_INIT_ASSIGN: {
- _set_error("Assignment inside expression is not allowed (parser bug?).", op->line);
+ _set_error("Assignment inside an expression isn't allowed (parser bug?).", op->line);
return DataType();
} break;
@@ -6367,8 +6444,8 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
if (valid) {
result = _type_from_variant(res);
} else if (check_types) {
- _set_error("Can't get index '" + String(member_id->name.operator String()) + "' on base '" +
- base_type.to_string() + "'.",
+ _set_error("Can't get index \"" + String(member_id->name.operator String()) + "\" on base \"" +
+ base_type.to_string() + "\".",
op->line);
return DataType();
}
@@ -6460,7 +6537,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
}
}
if (error) {
- _set_error("Invalid index type (" + index_type.to_string() + ") for base '" + base_type.to_string() + "'.",
+ _set_error("Invalid index type (" + index_type.to_string() + ") for base \"" + base_type.to_string() + "\".",
op->line);
return DataType();
}
@@ -6493,8 +6570,8 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
node_type = _type_from_variant(res);
node_type.is_constant = false;
} else if (check_types) {
- _set_error("Can't get index '" + String(cn->value) + "' on base '" +
- base_type.to_string() + "'.",
+ _set_error("Can't get index \"" + String(cn->value) + "\" on base \"" +
+ base_type.to_string() + "\".",
op->line);
return DataType();
}
@@ -6504,11 +6581,11 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
_mark_line_as_unsafe(op->line);
}
} else if (!for_completion && (index_type.kind != DataType::BUILTIN || index_type.builtin_type != Variant::STRING)) {
- _set_error("Only strings can be used as index in the base type '" + base_type.to_string() + "'.", op->line);
+ _set_error("Only strings can be used as an index in the base type \"" + base_type.to_string() + "\".", op->line);
return DataType();
}
}
- if (check_types && !node_type.has_type) {
+ if (check_types && !node_type.has_type && base_type.kind == DataType::BUILTIN) {
// Can infer indexing type for some variant types
DataType result;
result.has_type = true;
@@ -6521,7 +6598,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
case Variant::REAL:
case Variant::NODE_PATH:
case Variant::_RID: {
- _set_error("Can't index on a value of type '" + base_type.to_string() + "'.", op->line);
+ _set_error("Can't index on a value of type \"" + base_type.to_string() + "\".", op->line);
return DataType();
} break;
// Return int
@@ -6919,7 +6996,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_function_call_type(const Operat
if (check_types) {
if (!tmp.has_method(callee_name)) {
- _set_error("Method '" + callee_name + "' is not declared on base '" + base_type.to_string() + "'.", p_call->line);
+ _set_error("The method \"" + callee_name + "\" isn't declared on base \"" + base_type.to_string() + "\".", p_call->line);
return DataType();
}
@@ -6979,7 +7056,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_function_call_type(const Operat
if (!valid) {
#ifdef DEBUG_ENABLED
if (p_call->arguments[0]->type == Node::TYPE_SELF) {
- _set_error("Method '" + callee_name + "' is not declared in the current class.", p_call->line);
+ _set_error("The method \"" + callee_name + "\" isn't declared in the current class.", p_call->line);
return DataType();
}
DataType tmp_type;
@@ -7004,7 +7081,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_function_call_type(const Operat
}
if (check_types && !is_static && !is_initializer && base_type.is_meta_type) {
- _set_error("Non-static function '" + String(callee_name) + "' can only be called from an instance.", p_call->line);
+ _set_error("Non-static function \"" + String(callee_name) + "\" can only be called from an instance.", p_call->line);
return DataType();
}
@@ -7029,11 +7106,11 @@ GDScriptParser::DataType GDScriptParser::_reduce_function_call_type(const Operat
}
if (arg_count < arg_types.size() - default_args_count) {
- _set_error("Too few arguments for '" + callee_name + "()' call. Expected at least " + itos(arg_types.size() - default_args_count) + ".", p_call->line);
+ _set_error("Too few arguments for \"" + callee_name + "()\" call. Expected at least " + itos(arg_types.size() - default_args_count) + ".", p_call->line);
return return_type;
}
if (!is_vararg && arg_count > arg_types.size()) {
- _set_error("Too many arguments for '" + callee_name + "()' call. Expected at most " + itos(arg_types.size()) + ".", p_call->line);
+ _set_error("Too many arguments for \"" + callee_name + "()\" call. Expected at most " + itos(arg_types.size()) + ".", p_call->line);
return return_type;
}
@@ -7055,7 +7132,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_function_call_type(const Operat
} else if (!_is_type_compatible(arg_types[i - arg_diff], par_type, true)) {
// Supertypes are acceptable for dynamic compliance
if (!_is_type_compatible(par_type, arg_types[i - arg_diff])) {
- _set_error("At '" + callee_name + "()' call, argument " + itos(i - arg_diff + 1) + ". Assigned type (" +
+ _set_error("At \"" + callee_name + "()\" call, argument " + itos(i - arg_diff + 1) + ". Assigned type (" +
par_type.to_string() + ") doesn't match the function argument's type (" +
arg_types[i - arg_diff].to_string() + ").",
p_call->line);
@@ -7203,7 +7280,7 @@ bool GDScriptParser::_get_member_type(const DataType &p_base_type, const StringN
}
if (!ClassDB::class_exists(native)) {
if (!check_types) return false;
- ERR_FAIL_V_MSG(false, "Parser bug: Class '" + String(native) + "' not found.");
+ ERR_FAIL_V_MSG(false, "Parser bug: Class \"" + String(native) + "\" not found.");
}
bool valid = false;
@@ -7373,7 +7450,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_identifier_type(const DataType
Ref<GDScript> gds = scr;
if (gds.is_valid()) {
if (!gds->is_valid()) {
- _set_error("Class '" + p_identifier + "' could not be fully loaded (script error or cyclic dependency).");
+ _set_error("The class \"" + p_identifier + "\" couldn't be fully loaded (script error or cyclic dependency).");
return DataType();
}
result.kind = DataType::GDSCRIPT;
@@ -7382,7 +7459,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_identifier_type(const DataType
}
return result;
}
- _set_error("Class '" + p_identifier + "' was found in global scope but its script could not be loaded.");
+ _set_error("The class \"" + p_identifier + "\" was found in global scope, but its script couldn't be loaded.");
return DataType();
}
@@ -7425,7 +7502,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_identifier_type(const DataType
Ref<GDScript> gds = singleton;
if (gds.is_valid()) {
if (!gds->is_valid()) {
- _set_error("Couldn't fully load singleton script '" + p_identifier + "' (possible cyclic reference or parse error).", p_line);
+ _set_error("Couldn't fully load the singleton script \"" + p_identifier + "\" (possible cyclic reference or parse error).", p_line);
return DataType();
}
result.kind = DataType::GDSCRIPT;
@@ -7437,7 +7514,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_identifier_type(const DataType
}
// This means looking in the current class, which type is always known
- _set_error("Identifier '" + p_identifier.operator String() + "' is not declared in the current scope.", p_line);
+ _set_error("The identifier \"" + p_identifier.operator String() + "\" isn't declared in the current scope.", p_line);
}
#ifdef DEBUG_ENABLED
@@ -7469,7 +7546,7 @@ void GDScriptParser::_check_class_level_types(ClassNode *p_class) {
DataType expr = _resolve_type(c.expression->get_datatype(), c.expression->line);
if (check_types && !_is_type_compatible(cont, expr)) {
- _set_error("Constant value type (" + expr.to_string() + ") is not compatible with declared type (" + cont.to_string() + ").",
+ _set_error("The constant value type (" + expr.to_string() + ") isn't compatible with declared type (" + cont.to_string() + ").",
c.expression->line);
return;
}
@@ -7480,7 +7557,7 @@ void GDScriptParser::_check_class_level_types(ClassNode *p_class) {
DataType tmp;
if (_get_member_type(p_class->base_type, E->key(), tmp)) {
- _set_error("Member '" + String(E->key()) + "' already exists in parent class.", c.expression->line);
+ _set_error("The member \"" + String(E->key()) + "\" already exists in a parent class.", c.expression->line);
return;
}
}
@@ -7502,7 +7579,7 @@ void GDScriptParser::_check_class_level_types(ClassNode *p_class) {
DataType tmp;
if (_get_member_type(p_class->base_type, v.identifier, tmp)) {
- _set_error("Member '" + String(v.identifier) + "' already exists in parent class.", v.line);
+ _set_error("The member \"" + String(v.identifier) + "\" already exists in a parent class.", v.line);
return;
}
@@ -7519,7 +7596,7 @@ void GDScriptParser::_check_class_level_types(ClassNode *p_class) {
} else {
// Try with implicit conversion
if (v.data_type.kind != DataType::BUILTIN || !_is_type_compatible(v.data_type, expr_type, true)) {
- _set_error("Assigned expression type (" + expr_type.to_string() + ") doesn't match the variable's type (" +
+ _set_error("The assigned expression's type (" + expr_type.to_string() + ") doesn't match the variable's type (" +
v.data_type.to_string() + ").",
v.line);
return;
@@ -7548,7 +7625,7 @@ void GDScriptParser::_check_class_level_types(ClassNode *p_class) {
if (v.data_type.infer_type) {
if (!expr_type.has_type) {
- _set_error("Assigned value does not have a set type, variable type cannot be inferred.", v.line);
+ _set_error("The assigned value doesn't have a set type; the variable type can't be inferred.", v.line);
return;
}
v.data_type = expr_type;
@@ -7560,7 +7637,7 @@ void GDScriptParser::_check_class_level_types(ClassNode *p_class) {
if (v.data_type.has_type && v._export.type != Variant::NIL) {
DataType export_type = _type_from_property(v._export);
if (!_is_type_compatible(v.data_type, export_type, true)) {
- _set_error("Export hint type (" + export_type.to_string() + ") doesn't match the variable's type (" +
+ _set_error("The export hint's type (" + export_type.to_string() + ") doesn't match the variable's type (" +
v.data_type.to_string() + ").",
v.line);
return;
@@ -7579,15 +7656,15 @@ void GDScriptParser::_check_class_level_types(ClassNode *p_class) {
if (setter->get_required_argument_count() != 1 &&
!(setter->get_required_argument_count() == 0 && setter->default_values.size() > 0)) {
- _set_error("Setter function needs to receive exactly 1 argument. See '" + setter->name +
- "()' definition at line " + itos(setter->line) + ".",
+ _set_error("The setter function needs to receive exactly 1 argument. See \"" + setter->name +
+ "()\" definition at line " + itos(setter->line) + ".",
v.line);
return;
}
if (!_is_type_compatible(v.data_type, setter->argument_types[0])) {
- _set_error("Setter argument type (" + setter->argument_types[0].to_string() +
- ") doesn't match the variable's type (" + v.data_type.to_string() + "). See '" +
- setter->name + "()' definition at line " + itos(setter->line) + ".",
+ _set_error("The setter argument's type (" + setter->argument_types[0].to_string() +
+ ") doesn't match the variable's type (" + v.data_type.to_string() + "). See \"" +
+ setter->name + "()\" definition at line " + itos(setter->line) + ".",
v.line);
return;
}
@@ -7598,15 +7675,15 @@ void GDScriptParser::_check_class_level_types(ClassNode *p_class) {
FunctionNode *getter = p_class->functions[j];
if (getter->get_required_argument_count() != 0) {
- _set_error("Getter function can't receive arguments. See '" + getter->name +
- "()' definition at line " + itos(getter->line) + ".",
+ _set_error("The getter function can't receive arguments. See \"" + getter->name +
+ "()\" definition at line " + itos(getter->line) + ".",
v.line);
return;
}
if (!_is_type_compatible(v.data_type, getter->get_datatype())) {
- _set_error("Getter return type (" + getter->get_datatype().to_string() +
+ _set_error("The getter return type (" + getter->get_datatype().to_string() +
") doesn't match the variable's type (" + v.data_type.to_string() +
- "). See '" + getter->name + "()' definition at line " + itos(getter->line) + ".",
+ "). See \"" + getter->name + "()\" definition at line " + itos(getter->line) + ".",
v.line);
return;
}
@@ -7620,23 +7697,23 @@ void GDScriptParser::_check_class_level_types(ClassNode *p_class) {
for (int j = 0; j < p_class->static_functions.size(); j++) {
if (v.setter == p_class->static_functions[j]->name) {
FunctionNode *setter = p_class->static_functions[j];
- _set_error("Setter can't be a static function. See '" + setter->name + "()' definition at line " + itos(setter->line) + ".", v.line);
+ _set_error("The setter can't be a static function. See \"" + setter->name + "()\" definition at line " + itos(setter->line) + ".", v.line);
return;
}
if (v.getter == p_class->static_functions[j]->name) {
FunctionNode *getter = p_class->static_functions[j];
- _set_error("Getter can't be a static function. See '" + getter->name + "()' definition at line " + itos(getter->line) + ".", v.line);
+ _set_error("The getter can't be a static function. See \"" + getter->name + "()\" definition at line " + itos(getter->line) + ".", v.line);
return;
}
}
if (!found_setter && v.setter != StringName()) {
- _set_error("Setter function is not defined.", v.line);
+ _set_error("The setter function isn't defined.", v.line);
return;
}
if (!found_getter && v.getter != StringName()) {
- _set_error("Getter function is not defined.", v.line);
+ _set_error("The getter function isn't defined.", v.line);
return;
}
}
@@ -7683,7 +7760,7 @@ void GDScriptParser::_check_function_types(FunctionNode *p_function) {
if (!_is_type_compatible(p_function->argument_types[i], def_type, true)) {
String arg_name = p_function->arguments[i];
_set_error("Value type (" + def_type.to_string() + ") doesn't match the type of argument '" +
- arg_name + "' (" + p_function->arguments[i] + ")",
+ arg_name + "' (" + p_function->arguments[i] + ").",
p_function->line);
}
}
@@ -7746,21 +7823,21 @@ void GDScriptParser::_check_function_types(FunctionNode *p_function) {
}
}
parent_signature += ")";
- _set_error("Function signature doesn't match the parent. Parent signature is: '" + parent_signature + "'.", p_function->line);
+ _set_error("The function signature doesn't match the parent. Parent signature is: \"" + parent_signature + "\".", p_function->line);
return;
}
}
#endif // DEBUG_ENABLED
} else {
if (p_function->return_type.has_type && (p_function->return_type.kind != DataType::BUILTIN || p_function->return_type.builtin_type != Variant::NIL)) {
- _set_error("Constructor cannot return a value.", p_function->line);
+ _set_error("The constructor can't return a value.", p_function->line);
return;
}
}
if (p_function->return_type.has_type && (p_function->return_type.kind != DataType::BUILTIN || p_function->return_type.builtin_type != Variant::NIL)) {
if (!p_function->body->has_return) {
- _set_error("Non-void function must return a value in all possible paths.", p_function->line);
+ _set_error("A non-void function must return a value in all possible paths.", p_function->line);
return;
}
}
@@ -7891,7 +7968,7 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
} else {
// Try implicit conversion
if (lv->datatype.kind != DataType::BUILTIN || !_is_type_compatible(lv->datatype, assign_type, true)) {
- _set_error("Assigned value type (" + assign_type.to_string() + ") doesn't match the variable's type (" +
+ _set_error("The assigned value type (" + assign_type.to_string() + ") doesn't match the variable's type (" +
lv->datatype.to_string() + ").",
lv->line);
return;
@@ -7923,7 +8000,7 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
}
if (lv->datatype.infer_type) {
if (!assign_type.has_type) {
- _set_error("Assigned value does not have a set type, variable type cannot be inferred.", lv->line);
+ _set_error("The assigned value doesn't have a set type; the variable type can't be inferred.", lv->line);
return;
}
lv->datatype = assign_type;
@@ -7974,7 +8051,7 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
}
}
if (lh_type.is_constant) {
- _set_error("Cannot assign a new value to a constant.", op->line);
+ _set_error("Can't assign a new value to a constant.", op->line);
return;
}
}
@@ -7993,8 +8070,8 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
rh_type = _get_operation_type(oper, lh_type, arg_type, valid);
if (check_types && !valid) {
- _set_error("Invalid operand types ('" + lh_type.to_string() + "' and '" + arg_type.to_string() +
- "') to assignment operator '" + Variant::get_operator_name(oper) + "'.",
+ _set_error("Invalid operand types (\"" + lh_type.to_string() + "\" and \"" + arg_type.to_string() +
+ "\") to assignment operator \"" + Variant::get_operator_name(oper) + "\".",
op->line);
return;
}
@@ -8022,7 +8099,7 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
} else {
// Try implicit conversion
if (lh_type.kind != DataType::BUILTIN || !_is_type_compatible(lh_type, rh_type, true)) {
- _set_error("Assigned value type (" + rh_type.to_string() + ") doesn't match the variable's type (" +
+ _set_error("The assigned value's type (" + rh_type.to_string() + ") doesn't match the variable's type (" +
lh_type.to_string() + ").",
op->line);
return;
@@ -8107,18 +8184,18 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
if (function_type.kind == DataType::BUILTIN && function_type.builtin_type == Variant::NIL) {
// Return void, should not have arguments
if (cf->arguments.size() > 0) {
- _set_error("Void function cannot return a value.", cf->line, cf->column);
+ _set_error("A void function cannot return a value.", cf->line, cf->column);
return;
}
} else {
// Return something, cannot be empty
if (cf->arguments.size() == 0) {
- _set_error("Non-void function must return a value.", cf->line, cf->column);
+ _set_error("A non-void function must return a value.", cf->line, cf->column);
return;
}
if (!_is_type_compatible(function_type, ret_type)) {
- _set_error("Returned value type (" + ret_type.to_string() + ") doesn't match the function return type (" +
+ _set_error("The returned value type (" + ret_type.to_string() + ") doesn't match the function return type (" +
function_type.to_string() + ").",
cf->line, cf->column);
return;
@@ -8255,6 +8332,10 @@ int GDScriptParser::get_error_column() const {
return error_column;
}
+bool GDScriptParser::has_error() const {
+ return error_set;
+}
+
Error GDScriptParser::_parse(const String &p_base_path) {
base_path = p_base_path;
@@ -8271,7 +8352,7 @@ Error GDScriptParser::_parse(const String &p_base_path) {
if (tokenizer->get_token() == GDScriptTokenizer::TK_ERROR) {
error_set = false;
- _set_error("Parse Error: " + tokenizer->get_token_error());
+ _set_error("Parse error: " + tokenizer->get_token_error());
}
if (error_set && !for_completion) {
diff --git a/modules/gdscript/gdscript_parser.h b/modules/gdscript/gdscript_parser.h
index 62d7bdb393..72aa819a8c 100644
--- a/modules/gdscript/gdscript_parser.h
+++ b/modules/gdscript/gdscript_parser.h
@@ -632,6 +632,7 @@ private:
Error _parse(const String &p_base_path);
public:
+ bool has_error() const;
String get_error() const;
int get_error_line() const;
int get_error_column() const;
diff --git a/modules/gdscript/language_server/gdscript_extend_parser.cpp b/modules/gdscript/language_server/gdscript_extend_parser.cpp
new file mode 100644
index 0000000000..45f9ec9c6a
--- /dev/null
+++ b/modules/gdscript/language_server/gdscript_extend_parser.cpp
@@ -0,0 +1,759 @@
+/*************************************************************************/
+/* gdscript_extend_parser.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "gdscript_extend_parser.h"
+#include "../gdscript.h"
+#include "core/io/json.h"
+#include "gdscript_language_protocol.h"
+#include "gdscript_workspace.h"
+
+void ExtendGDScriptParser::update_diagnostics() {
+
+ diagnostics.clear();
+
+ if (has_error()) {
+ lsp::Diagnostic diagnostic;
+ diagnostic.severity = lsp::DiagnosticSeverity::Error;
+ diagnostic.message = get_error();
+ diagnostic.source = "gdscript";
+ diagnostic.code = -1;
+ lsp::Range range;
+ lsp::Position pos;
+ int line = LINE_NUMBER_TO_INDEX(get_error_line());
+ const String &line_text = get_lines()[line];
+ pos.line = line;
+ pos.character = line_text.length() - line_text.strip_edges(true, false).length();
+ range.start = pos;
+ range.end = range.start;
+ range.end.character = line_text.strip_edges(false).length();
+ diagnostic.range = range;
+ diagnostics.push_back(diagnostic);
+ }
+
+ const List<GDScriptWarning> &warnings = get_warnings();
+ for (const List<GDScriptWarning>::Element *E = warnings.front(); E; E = E->next()) {
+ const GDScriptWarning &warning = E->get();
+ lsp::Diagnostic diagnostic;
+ diagnostic.severity = lsp::DiagnosticSeverity::Warning;
+ diagnostic.message = warning.get_message();
+ diagnostic.source = "gdscript";
+ diagnostic.code = warning.code;
+ lsp::Range range;
+ lsp::Position pos;
+ int line = LINE_NUMBER_TO_INDEX(warning.line);
+ const String &line_text = get_lines()[line];
+ pos.line = line;
+ pos.character = line_text.length() - line_text.strip_edges(true, false).length();
+ range.start = pos;
+ range.end = pos;
+ range.end.character = line_text.strip_edges(false).length();
+ diagnostic.range = range;
+ diagnostics.push_back(diagnostic);
+ }
+}
+
+void ExtendGDScriptParser::update_symbols() {
+
+ members.clear();
+
+ const GDScriptParser::Node *head = get_parse_tree();
+ if (const GDScriptParser::ClassNode *gdclass = dynamic_cast<const GDScriptParser::ClassNode *>(head)) {
+
+ parse_class_symbol(gdclass, class_symbol);
+
+ for (int i = 0; i < class_symbol.children.size(); i++) {
+ const lsp::DocumentSymbol &symbol = class_symbol.children[i];
+ members.set(symbol.name, &symbol);
+
+ // cache level one inner classes
+ if (symbol.kind == lsp::SymbolKind::Class) {
+ ClassMembers inner_class;
+ for (int j = 0; j < symbol.children.size(); j++) {
+ const lsp::DocumentSymbol &s = symbol.children[j];
+ inner_class.set(s.name, &s);
+ }
+ inner_classes.set(symbol.name, inner_class);
+ }
+ }
+ }
+}
+
+void ExtendGDScriptParser::parse_class_symbol(const GDScriptParser::ClassNode *p_class, lsp::DocumentSymbol &r_symbol) {
+
+ const String uri = get_uri();
+
+ r_symbol.uri = uri;
+ r_symbol.script_path = path;
+ r_symbol.children.clear();
+ r_symbol.name = p_class->name;
+ if (r_symbol.name.empty())
+ r_symbol.name = path.get_file();
+ r_symbol.kind = lsp::SymbolKind::Class;
+ r_symbol.deprecated = false;
+ r_symbol.range.start.line = LINE_NUMBER_TO_INDEX(p_class->line);
+ r_symbol.range.start.character = p_class->column;
+ r_symbol.range.end.line = LINE_NUMBER_TO_INDEX(p_class->end_line);
+ r_symbol.selectionRange.start.line = r_symbol.range.start.line;
+ r_symbol.detail = "class " + r_symbol.name;
+ bool is_root_class = &r_symbol == &class_symbol;
+ r_symbol.documentation = parse_documentation_as_markdown(is_root_class ? 0 : LINE_NUMBER_TO_INDEX(p_class->line), is_root_class);
+
+ for (int i = 0; i < p_class->variables.size(); ++i) {
+
+ const GDScriptParser::ClassNode::Member &m = p_class->variables[i];
+
+ lsp::DocumentSymbol symbol;
+ symbol.name = m.identifier;
+ symbol.kind = lsp::SymbolKind::Variable;
+ symbol.deprecated = false;
+ const int line = LINE_NUMBER_TO_INDEX(m.line);
+ symbol.range.start.line = line;
+ symbol.range.start.character = lines[line].length() - lines[line].strip_edges(true, false).length();
+ symbol.range.end.line = line;
+ symbol.range.end.character = lines[line].length();
+ symbol.selectionRange.start.line = symbol.range.start.line;
+ if (m._export.type != Variant::NIL) {
+ symbol.detail += "export ";
+ }
+ symbol.detail += "var " + m.identifier;
+ if (m.data_type.kind != GDScriptParser::DataType::UNRESOLVED) {
+ symbol.detail += ": " + m.data_type.to_string();
+ }
+ if (m.default_value.get_type() != Variant::NIL) {
+ symbol.detail += " = " + JSON::print(m.default_value);
+ }
+
+ symbol.documentation = parse_documentation_as_markdown(line);
+ symbol.uri = uri;
+ symbol.script_path = path;
+
+ r_symbol.children.push_back(symbol);
+ }
+
+ for (int i = 0; i < p_class->_signals.size(); ++i) {
+ const GDScriptParser::ClassNode::Signal &signal = p_class->_signals[i];
+
+ lsp::DocumentSymbol symbol;
+ symbol.name = signal.name;
+ symbol.kind = lsp::SymbolKind::Event;
+ symbol.deprecated = false;
+ const int line = LINE_NUMBER_TO_INDEX(signal.line);
+ symbol.range.start.line = line;
+ symbol.range.start.character = lines[line].length() - lines[line].strip_edges(true, false).length();
+ symbol.range.end.line = symbol.range.start.line;
+ symbol.range.end.character = lines[line].length();
+ symbol.selectionRange.start.line = symbol.range.start.line;
+ symbol.documentation = parse_documentation_as_markdown(line);
+ symbol.uri = uri;
+ symbol.script_path = path;
+ symbol.detail = "signal " + signal.name + "(";
+ for (int j = 0; j < signal.arguments.size(); j++) {
+ if (j > 0) {
+ symbol.detail += ", ";
+ }
+ symbol.detail += signal.arguments[j];
+ }
+ symbol.detail += ")";
+
+ r_symbol.children.push_back(symbol);
+ }
+
+ for (Map<StringName, GDScriptParser::ClassNode::Constant>::Element *E = p_class->constant_expressions.front(); E; E = E->next()) {
+ lsp::DocumentSymbol symbol;
+ const GDScriptParser::ClassNode::Constant &c = E->value();
+ const GDScriptParser::ConstantNode *node = dynamic_cast<const GDScriptParser::ConstantNode *>(c.expression);
+ symbol.name = E->key();
+ symbol.kind = lsp::SymbolKind::Constant;
+ symbol.deprecated = false;
+ const int line = LINE_NUMBER_TO_INDEX(E->get().expression->line);
+ symbol.range.start.line = line;
+ symbol.range.start.character = E->get().expression->column;
+ symbol.range.end.line = symbol.range.start.line;
+ symbol.range.end.character = lines[line].length();
+ symbol.selectionRange.start.line = symbol.range.start.line;
+ symbol.documentation = parse_documentation_as_markdown(line);
+ symbol.uri = uri;
+ symbol.script_path = path;
+
+ symbol.detail = "const " + symbol.name;
+ if (c.type.kind != GDScriptParser::DataType::UNRESOLVED) {
+ symbol.detail += ": " + c.type.to_string();
+ }
+
+ String value_text;
+ if (node->value.get_type() == Variant::OBJECT) {
+ RES res = node->value;
+ if (res.is_valid() && !res->get_path().empty()) {
+ value_text = "preload(\"" + res->get_path() + "\")";
+ if (symbol.documentation.empty()) {
+ if (Map<String, ExtendGDScriptParser *>::Element *S = GDScriptLanguageProtocol::get_singleton()->get_workspace()->scripts.find(res->get_path())) {
+ symbol.documentation = S->get()->class_symbol.documentation;
+ }
+ }
+ } else {
+ value_text = JSON::print(node->value);
+ }
+ } else {
+ value_text = JSON::print(node->value);
+ }
+ if (!value_text.empty()) {
+ symbol.detail += " = " + value_text;
+ }
+
+ r_symbol.children.push_back(symbol);
+ }
+
+ for (int i = 0; i < p_class->functions.size(); ++i) {
+ const GDScriptParser::FunctionNode *func = p_class->functions[i];
+ lsp::DocumentSymbol symbol;
+ parse_function_symbol(func, symbol);
+ r_symbol.children.push_back(symbol);
+ }
+
+ for (int i = 0; i < p_class->static_functions.size(); ++i) {
+ const GDScriptParser::FunctionNode *func = p_class->static_functions[i];
+ lsp::DocumentSymbol symbol;
+ parse_function_symbol(func, symbol);
+ r_symbol.children.push_back(symbol);
+ }
+
+ for (int i = 0; i < p_class->subclasses.size(); ++i) {
+ const GDScriptParser::ClassNode *subclass = p_class->subclasses[i];
+ lsp::DocumentSymbol symbol;
+ parse_class_symbol(subclass, symbol);
+ r_symbol.children.push_back(symbol);
+ }
+}
+
+void ExtendGDScriptParser::parse_function_symbol(const GDScriptParser::FunctionNode *p_func, lsp::DocumentSymbol &r_symbol) {
+
+ const String uri = get_uri();
+
+ r_symbol.name = p_func->name;
+ r_symbol.kind = lsp::SymbolKind::Function;
+ r_symbol.detail = "func " + p_func->name + "(";
+ r_symbol.deprecated = false;
+ const int line = LINE_NUMBER_TO_INDEX(p_func->line);
+ r_symbol.range.start.line = line;
+ r_symbol.range.start.character = p_func->column;
+ r_symbol.range.end.line = MAX(p_func->body->end_line - 2, p_func->body->line);
+ r_symbol.range.end.character = lines[r_symbol.range.end.line].length();
+ r_symbol.selectionRange.start.line = r_symbol.range.start.line;
+ r_symbol.documentation = parse_documentation_as_markdown(line);
+ r_symbol.uri = uri;
+ r_symbol.script_path = path;
+
+ String arguments;
+ for (int i = 0; i < p_func->arguments.size(); i++) {
+ lsp::DocumentSymbol symbol;
+ symbol.kind = lsp::SymbolKind::Variable;
+ symbol.name = p_func->arguments[i];
+ symbol.range.start.line = LINE_NUMBER_TO_INDEX(p_func->body->line);
+ symbol.range.start.character = p_func->body->column;
+ symbol.range.end = symbol.range.start;
+ symbol.uri = uri;
+ symbol.script_path = path;
+ r_symbol.children.push_back(symbol);
+ if (i > 0) {
+ arguments += ", ";
+ }
+ arguments += String(p_func->arguments[i]);
+ if (p_func->argument_types[i].kind != GDScriptParser::DataType::UNRESOLVED) {
+ arguments += ": " + p_func->argument_types[i].to_string();
+ }
+ int default_value_idx = i - (p_func->arguments.size() - p_func->default_values.size());
+ if (default_value_idx >= 0) {
+ const GDScriptParser::ConstantNode *const_node = dynamic_cast<const GDScriptParser::ConstantNode *>(p_func->default_values[default_value_idx]);
+ if (const_node == NULL) {
+ const GDScriptParser::OperatorNode *operator_node = dynamic_cast<const GDScriptParser::OperatorNode *>(p_func->default_values[default_value_idx]);
+ if (operator_node) {
+ const_node = dynamic_cast<const GDScriptParser::ConstantNode *>(operator_node->next);
+ }
+ }
+
+ if (const_node) {
+ String value = JSON::print(const_node->value);
+ arguments += " = " + value;
+ }
+ }
+ }
+ r_symbol.detail += arguments + ")";
+ if (p_func->return_type.kind != GDScriptParser::DataType::UNRESOLVED) {
+ r_symbol.detail += " -> " + p_func->return_type.to_string();
+ }
+
+ for (const Map<StringName, LocalVarNode *>::Element *E = p_func->body->variables.front(); E; E = E->next()) {
+ lsp::DocumentSymbol symbol;
+ const GDScriptParser::LocalVarNode *var = E->value();
+ symbol.name = E->key();
+ symbol.kind = lsp::SymbolKind::Variable;
+ symbol.range.start.line = LINE_NUMBER_TO_INDEX(E->get()->line);
+ symbol.range.start.character = E->get()->column;
+ symbol.range.end.line = symbol.range.start.line;
+ symbol.range.end.character = lines[symbol.range.end.line].length();
+ symbol.uri = uri;
+ symbol.script_path = path;
+ symbol.detail = "var " + symbol.name;
+ if (var->datatype.kind != GDScriptParser::DataType::UNRESOLVED) {
+ symbol.detail += ": " + var->datatype.to_string();
+ }
+ symbol.documentation = parse_documentation_as_markdown(line);
+ r_symbol.children.push_back(symbol);
+ }
+}
+
+String ExtendGDScriptParser::marked_documentation(const String &p_bbcode) {
+
+ String markdown = p_bbcode.strip_edges();
+
+ Vector<String> lines = markdown.split("\n");
+ bool in_code_block = false;
+ int code_block_indent = -1;
+
+ markdown = "";
+ for (int i = 0; i < lines.size(); i++) {
+ String line = lines[i];
+ int block_start = line.find("[codeblock]");
+ if (block_start != -1) {
+ code_block_indent = block_start;
+ in_code_block = true;
+ line = "'''gdscript";
+ line = "\n";
+ } else if (in_code_block) {
+ line = "\t" + line.substr(code_block_indent, line.length());
+ }
+
+ if (in_code_block && line.find("[/codeblock]") != -1) {
+ line = "'''\n";
+ line = "\n";
+ in_code_block = false;
+ }
+
+ if (!in_code_block) {
+ line = line.strip_edges();
+ line = line.replace("[code]", "`");
+ line = line.replace("[/code]", "`");
+ line = line.replace("[i]", "*");
+ line = line.replace("[/i]", "*");
+ line = line.replace("[b]", "**");
+ line = line.replace("[/b]", "**");
+ line = line.replace("[u]", "__");
+ line = line.replace("[/u]", "__");
+ line = line.replace("[method ", "`");
+ line = line.replace("[member ", "`");
+ line = line.replace("[signal ", "`");
+ line = line.replace("[enum ", "`");
+ line = line.replace("[constant ", "`");
+ line = line.replace("[", "`");
+ line = line.replace("]", "`");
+ }
+
+ if (!in_code_block && i < lines.size() - 1) {
+ line += "\n\n";
+ } else if (i < lines.size() - 1) {
+ line += "\n";
+ }
+ markdown += line;
+ }
+ return markdown;
+}
+
+String ExtendGDScriptParser::parse_documentation(int p_line, bool p_docs_down) {
+ ERR_FAIL_INDEX_V(p_line, lines.size(), String());
+
+ List<String> doc_lines;
+
+ if (!p_docs_down) { // inline comment
+ String inline_comment = lines[p_line];
+ int comment_start = inline_comment.find("#");
+ if (comment_start != -1) {
+ inline_comment = inline_comment.substr(comment_start, inline_comment.length()).strip_edges();
+ if (inline_comment.length() > 1) {
+ doc_lines.push_back(inline_comment.substr(1, inline_comment.length()));
+ }
+ }
+ }
+
+ int step = p_docs_down ? 1 : -1;
+ int start_line = p_docs_down ? p_line : p_line - 1;
+ for (int i = start_line; true; i += step) {
+
+ if (i < 0 || i >= lines.size()) break;
+
+ String line_comment = lines[i].strip_edges(true, false);
+ if (line_comment.begins_with("#")) {
+ line_comment = line_comment.substr(1, line_comment.length());
+ if (p_docs_down) {
+ doc_lines.push_back(line_comment);
+ } else {
+ doc_lines.push_front(line_comment);
+ }
+ } else {
+ break;
+ }
+ }
+
+ String doc;
+ for (List<String>::Element *E = doc_lines.front(); E; E = E->next()) {
+ doc += E->get() + "\n";
+ }
+ return doc;
+}
+
+String ExtendGDScriptParser::get_text_for_completion(const lsp::Position &p_cursor) const {
+
+ String longthing;
+ int len = lines.size();
+ for (int i = 0; i < len; i++) {
+
+ if (i == p_cursor.line) {
+ longthing += lines[i].substr(0, p_cursor.character);
+ longthing += String::chr(0xFFFF); //not unicode, represents the cursor
+ longthing += lines[i].substr(p_cursor.character, lines[i].size());
+ } else {
+
+ longthing += lines[i];
+ }
+
+ if (i != len - 1)
+ longthing += "\n";
+ }
+
+ return longthing;
+}
+
+String ExtendGDScriptParser::get_text_for_lookup_symbol(const lsp::Position &p_cursor, const String &p_symbol, bool p_func_requred) const {
+ String longthing;
+ int len = lines.size();
+ for (int i = 0; i < len; i++) {
+
+ if (i == p_cursor.line) {
+ String line = lines[i];
+ String first_part = line.substr(0, p_cursor.character);
+ String last_part = line.substr(p_cursor.character + 1, lines[i].length());
+ if (!p_symbol.empty()) {
+ String left_cursor_text;
+ for (int c = p_cursor.character - 1; c >= 0; c--) {
+ left_cursor_text = line.substr(c, p_cursor.character - c);
+ if (p_symbol.begins_with(left_cursor_text)) {
+ first_part = line.substr(0, c);
+ first_part += p_symbol;
+ break;
+ }
+ }
+ }
+
+ longthing += first_part;
+ longthing += String::chr(0xFFFF); //not unicode, represents the cursor
+ if (p_func_requred) {
+ longthing += "("; // tell the parser this is a function call
+ }
+ longthing += last_part;
+ } else {
+
+ longthing += lines[i];
+ }
+
+ if (i != len - 1)
+ longthing += "\n";
+ }
+
+ return longthing;
+}
+
+String ExtendGDScriptParser::get_identifier_under_position(const lsp::Position &p_position, Vector2i &p_offset) const {
+
+ ERR_FAIL_INDEX_V(p_position.line, lines.size(), "");
+ String line = lines[p_position.line];
+ ERR_FAIL_INDEX_V(p_position.character, line.size(), "");
+
+ int start_pos = p_position.character;
+ for (int c = p_position.character; c >= 0; c--) {
+ start_pos = c;
+ CharType ch = line[c];
+ bool valid_char = (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch == '_';
+ if (!valid_char) {
+ break;
+ }
+ }
+
+ int end_pos = p_position.character;
+ for (int c = p_position.character; c < line.length(); c++) {
+ CharType ch = line[c];
+ bool valid_char = (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch == '_';
+ if (!valid_char) {
+ break;
+ }
+ end_pos = c;
+ }
+ if (start_pos < end_pos) {
+ p_offset.x = start_pos - p_position.character;
+ p_offset.y = end_pos - p_position.character;
+ return line.substr(start_pos + 1, end_pos - start_pos);
+ }
+
+ return "";
+}
+
+String ExtendGDScriptParser::get_uri() const {
+ return GDScriptLanguageProtocol::get_singleton()->get_workspace()->get_file_uri(path);
+}
+
+const lsp::DocumentSymbol *ExtendGDScriptParser::search_symbol_defined_at_line(int p_line, const lsp::DocumentSymbol &p_parent) const {
+ const lsp::DocumentSymbol *ret = NULL;
+ if (p_line < p_parent.range.start.line) {
+ return ret;
+ } else if (p_parent.range.start.line == p_line) {
+ return &p_parent;
+ } else {
+ for (int i = 0; i < p_parent.children.size(); i++) {
+ ret = search_symbol_defined_at_line(p_line, p_parent.children[i]);
+ if (ret) {
+ break;
+ }
+ }
+ }
+ return ret;
+}
+
+String ExtendGDScriptParser::parse_documentation_as_markdown(int p_line, bool p_docs_down) {
+ return marked_documentation(parse_documentation(p_line, p_docs_down));
+}
+
+const lsp::DocumentSymbol *ExtendGDScriptParser::get_symbol_defined_at_line(int p_line) const {
+ if (p_line <= 0) {
+ return &class_symbol;
+ }
+ return search_symbol_defined_at_line(p_line, class_symbol);
+}
+
+const lsp::DocumentSymbol *ExtendGDScriptParser::get_member_symbol(const String &p_name, const String &p_subclass) const {
+
+ if (p_subclass.empty()) {
+ const lsp::DocumentSymbol *const *ptr = members.getptr(p_name);
+ if (ptr) {
+ return *ptr;
+ }
+ } else {
+ if (const ClassMembers *_class = inner_classes.getptr(p_subclass)) {
+ const lsp::DocumentSymbol *const *ptr = _class->getptr(p_name);
+ if (ptr) {
+ return *ptr;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+const Array &ExtendGDScriptParser::get_member_completions() {
+
+ if (member_completions.empty()) {
+
+ const String *name = members.next(NULL);
+ while (name) {
+
+ const lsp::DocumentSymbol *symbol = members.get(*name);
+ lsp::CompletionItem item = symbol->make_completion_item();
+ item.data = JOIN_SYMBOLS(path, *name);
+ member_completions.push_back(item.to_json());
+
+ name = members.next(name);
+ }
+
+ const String *_class = inner_classes.next(NULL);
+ while (_class) {
+
+ const ClassMembers *inner_class = inner_classes.getptr(*_class);
+ const String *member_name = inner_class->next(NULL);
+ while (member_name) {
+ const lsp::DocumentSymbol *symbol = inner_class->get(*member_name);
+ lsp::CompletionItem item = symbol->make_completion_item();
+ item.data = JOIN_SYMBOLS(path, JOIN_SYMBOLS(*_class, *member_name));
+ member_completions.push_back(item.to_json());
+
+ member_name = inner_class->next(member_name);
+ }
+
+ _class = inner_classes.next(_class);
+ }
+ }
+
+ return member_completions;
+}
+
+Dictionary ExtendGDScriptParser::dump_function_api(const GDScriptParser::FunctionNode *p_func) const {
+ Dictionary func;
+ ERR_FAIL_NULL_V(p_func, func);
+ func["name"] = p_func->name;
+ func["return_type"] = p_func->return_type.to_string();
+ func["rpc_mode"] = p_func->rpc_mode;
+ Array arguments;
+ for (int i = 0; i < p_func->arguments.size(); i++) {
+ Dictionary arg;
+ arg["name"] = p_func->arguments[i];
+ arg["type"] = p_func->argument_types[i].to_string();
+ int default_value_idx = i - (p_func->arguments.size() - p_func->default_values.size());
+ if (default_value_idx >= 0) {
+ const GDScriptParser::ConstantNode *const_node = dynamic_cast<const GDScriptParser::ConstantNode *>(p_func->default_values[default_value_idx]);
+ if (const_node == NULL) {
+ const GDScriptParser::OperatorNode *operator_node = dynamic_cast<const GDScriptParser::OperatorNode *>(p_func->default_values[default_value_idx]);
+ if (operator_node) {
+ const_node = dynamic_cast<const GDScriptParser::ConstantNode *>(operator_node->next);
+ }
+ }
+ if (const_node) {
+ arg["default_value"] = const_node->value;
+ }
+ }
+ arguments.push_back(arg);
+ }
+ if (const lsp::DocumentSymbol *symbol = get_symbol_defined_at_line(LINE_NUMBER_TO_INDEX(p_func->line))) {
+ func["signature"] = symbol->detail;
+ func["description"] = symbol->documentation;
+ }
+ func["arguments"] = arguments;
+ return func;
+}
+
+Dictionary ExtendGDScriptParser::dump_class_api(const GDScriptParser::ClassNode *p_class) const {
+ Dictionary class_api;
+
+ ERR_FAIL_NULL_V(p_class, class_api);
+
+ class_api["name"] = String(p_class->name);
+ class_api["path"] = path;
+ Array extends_class;
+ for (int i = 0; i < p_class->extends_class.size(); i++) {
+ extends_class.append(String(p_class->extends_class[i]));
+ }
+ class_api["extends_class"] = extends_class;
+ class_api["extends_file"] = String(p_class->extends_file);
+ class_api["icon"] = String(p_class->icon_path);
+
+ if (const lsp::DocumentSymbol *symbol = get_symbol_defined_at_line(LINE_NUMBER_TO_INDEX(p_class->line))) {
+ class_api["signature"] = symbol->detail;
+ class_api["description"] = symbol->documentation;
+ }
+
+ Array subclasses;
+ for (int i = 0; i < p_class->subclasses.size(); i++) {
+ subclasses.push_back(dump_class_api(p_class->subclasses[i]));
+ }
+ class_api["sub_classes"] = subclasses;
+
+ Array constants;
+ for (Map<StringName, GDScriptParser::ClassNode::Constant>::Element *E = p_class->constant_expressions.front(); E; E = E->next()) {
+
+ const GDScriptParser::ClassNode::Constant &c = E->value();
+ const GDScriptParser::ConstantNode *node = dynamic_cast<const GDScriptParser::ConstantNode *>(c.expression);
+
+ Dictionary api;
+ api["name"] = E->key();
+ api["value"] = node->value;
+ api["data_type"] = node->datatype.to_string();
+ if (const lsp::DocumentSymbol *symbol = get_symbol_defined_at_line(LINE_NUMBER_TO_INDEX(node->line))) {
+ api["signature"] = symbol->detail;
+ api["description"] = symbol->documentation;
+ }
+ constants.push_back(api);
+ }
+ class_api["constants"] = constants;
+
+ Array members;
+ for (int i = 0; i < p_class->variables.size(); ++i) {
+ const GDScriptParser::ClassNode::Member &m = p_class->variables[i];
+ Dictionary api;
+ api["name"] = m.identifier;
+ api["data_type"] = m.data_type.to_string();
+ api["default_value"] = m.default_value;
+ api["setter"] = String(m.setter);
+ api["getter"] = String(m.getter);
+ api["export"] = m._export.type != Variant::NIL;
+ if (const lsp::DocumentSymbol *symbol = get_symbol_defined_at_line(LINE_NUMBER_TO_INDEX(m.line))) {
+ api["signature"] = symbol->detail;
+ api["description"] = symbol->documentation;
+ }
+ members.push_back(api);
+ }
+ class_api["members"] = members;
+
+ Array signals;
+ for (int i = 0; i < p_class->_signals.size(); ++i) {
+ const GDScriptParser::ClassNode::Signal &signal = p_class->_signals[i];
+ Dictionary api;
+ api["name"] = signal.name;
+ Array args;
+ for (int j = 0; j < signal.arguments.size(); j++) {
+ args.append(signal.arguments[j]);
+ }
+ api["arguments"] = args;
+ if (const lsp::DocumentSymbol *symbol = get_symbol_defined_at_line(LINE_NUMBER_TO_INDEX(signal.line))) {
+ api["signature"] = symbol->detail;
+ api["description"] = symbol->documentation;
+ }
+ signals.push_back(api);
+ }
+ class_api["signals"] = signals;
+
+ Array methods;
+ for (int i = 0; i < p_class->functions.size(); ++i) {
+ methods.append(dump_function_api(p_class->functions[i]));
+ }
+ class_api["methods"] = methods;
+
+ Array static_functions;
+ for (int i = 0; i < p_class->static_functions.size(); ++i) {
+ static_functions.append(dump_function_api(p_class->functions[i]));
+ }
+ class_api["static_functions"] = static_functions;
+
+ return class_api;
+}
+
+Dictionary ExtendGDScriptParser::generate_api() const {
+
+ Dictionary api;
+ const GDScriptParser::Node *head = get_parse_tree();
+ if (const GDScriptParser::ClassNode *gdclass = dynamic_cast<const GDScriptParser::ClassNode *>(head)) {
+ api = dump_class_api(gdclass);
+ }
+ return api;
+}
+
+Error ExtendGDScriptParser::parse(const String &p_code, const String &p_path) {
+ path = p_path;
+ lines = p_code.split("\n");
+
+ Error err = GDScriptParser::parse(p_code, p_path.get_base_dir(), false, p_path, false, NULL, false);
+ update_diagnostics();
+ update_symbols();
+ return err;
+}
diff --git a/modules/gdscript/language_server/gdscript_extend_parser.h b/modules/gdscript/language_server/gdscript_extend_parser.h
new file mode 100644
index 0000000000..dd0453d3ff
--- /dev/null
+++ b/modules/gdscript/language_server/gdscript_extend_parser.h
@@ -0,0 +1,103 @@
+/*************************************************************************/
+/* gdscript_extend_parser.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef GDSCRIPT_EXTEND_PARSER_H
+#define GDSCRIPT_EXTEND_PARSER_H
+
+#include "../gdscript_parser.h"
+#include "core/variant.h"
+#include "lsp.hpp"
+
+#ifndef LINE_NUMBER_TO_INDEX
+#define LINE_NUMBER_TO_INDEX(p_line) ((p_line)-1)
+#endif
+
+#ifndef SYMBOL_SEPERATOR
+#define SYMBOL_SEPERATOR "::"
+#endif
+
+#ifndef JOIN_SYMBOLS
+#define JOIN_SYMBOLS(p_path, name) ((p_path) + SYMBOL_SEPERATOR + (name))
+#endif
+
+typedef HashMap<String, const lsp::DocumentSymbol *> ClassMembers;
+
+class ExtendGDScriptParser : public GDScriptParser {
+
+ String path;
+ Vector<String> lines;
+
+ lsp::DocumentSymbol class_symbol;
+ Vector<lsp::Diagnostic> diagnostics;
+ ClassMembers members;
+ HashMap<String, ClassMembers> inner_classes;
+
+ void update_diagnostics();
+
+ void update_symbols();
+ void parse_class_symbol(const GDScriptParser::ClassNode *p_class, lsp::DocumentSymbol &r_symbol);
+ void parse_function_symbol(const GDScriptParser::FunctionNode *p_func, lsp::DocumentSymbol &r_symbol);
+
+ Dictionary dump_function_api(const GDScriptParser::FunctionNode *p_func) const;
+ Dictionary dump_class_api(const GDScriptParser::ClassNode *p_class) const;
+
+ String parse_documentation(int p_line, bool p_docs_down = false);
+ const lsp::DocumentSymbol *search_symbol_defined_at_line(int p_line, const lsp::DocumentSymbol &p_parent) const;
+
+ Array member_completions;
+
+ String parse_documentation_as_markdown(int p_line, bool p_docs_down = false);
+
+public:
+ static String marked_documentation(const String &p_bbcode);
+
+public:
+ _FORCE_INLINE_ const String &get_path() const { return path; }
+ _FORCE_INLINE_ const Vector<String> &get_lines() const { return lines; }
+ _FORCE_INLINE_ const lsp::DocumentSymbol &get_symbols() const { return class_symbol; }
+ _FORCE_INLINE_ const Vector<lsp::Diagnostic> &get_diagnostics() const { return diagnostics; }
+ _FORCE_INLINE_ const ClassMembers &get_members() const { return members; }
+ _FORCE_INLINE_ const HashMap<String, ClassMembers> &get_inner_classes() const { return inner_classes; }
+
+ String get_text_for_completion(const lsp::Position &p_cursor) const;
+ String get_text_for_lookup_symbol(const lsp::Position &p_cursor, const String &p_symbol = "", bool p_func_requred = false) const;
+ String get_identifier_under_position(const lsp::Position &p_position, Vector2i &p_offset) const;
+ String get_uri() const;
+
+ const lsp::DocumentSymbol *get_symbol_defined_at_line(int p_line) const;
+ const lsp::DocumentSymbol *get_member_symbol(const String &p_name, const String &p_subclass = "") const;
+
+ const Array &get_member_completions();
+ Dictionary generate_api() const;
+
+ Error parse(const String &p_code, const String &p_path);
+};
+
+#endif
diff --git a/modules/gdscript/language_server/gdscript_language_protocol.cpp b/modules/gdscript/language_server/gdscript_language_protocol.cpp
new file mode 100644
index 0000000000..afe461b68e
--- /dev/null
+++ b/modules/gdscript/language_server/gdscript_language_protocol.cpp
@@ -0,0 +1,211 @@
+/*************************************************************************/
+/* gdscript_language_protocol.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "gdscript_language_protocol.h"
+#include "core/io/json.h"
+#include "core/os/copymem.h"
+#include "core/project_settings.h"
+#include "editor/editor_node.h"
+
+GDScriptLanguageProtocol *GDScriptLanguageProtocol::singleton = NULL;
+
+void GDScriptLanguageProtocol::on_data_received(int p_id) {
+ lastest_client_id = p_id;
+ Ref<WebSocketPeer> peer = server->get_peer(p_id);
+ PoolByteArray data;
+ if (OK == peer->get_packet_buffer(data)) {
+ String message;
+ message.parse_utf8((const char *)data.read().ptr(), data.size());
+ if (message.begins_with("Content-Length:")) return;
+ String output = process_message(message);
+ if (!output.empty()) {
+ CharString charstr = output.utf8();
+ peer->put_packet((const uint8_t *)charstr.ptr(), charstr.length());
+ }
+ }
+}
+
+void GDScriptLanguageProtocol::on_client_connected(int p_id, const String &p_protocal) {
+ clients.set(p_id, server->get_peer(p_id));
+}
+
+void GDScriptLanguageProtocol::on_client_disconnected(int p_id, bool p_was_clean_close) {
+ clients.erase(p_id);
+}
+
+String GDScriptLanguageProtocol::process_message(const String &p_text) {
+ String ret = process_string(p_text);
+ if (ret.empty()) {
+ return ret;
+ } else {
+ return format_output(ret);
+ }
+}
+
+String GDScriptLanguageProtocol::format_output(const String &p_text) {
+
+ String header = "Content-Length: ";
+ CharString charstr = p_text.utf8();
+ size_t len = charstr.length();
+ header += itos(len);
+ header += "\r\n\r\n";
+
+ return header + p_text;
+}
+
+void GDScriptLanguageProtocol::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("initialize", "params"), &GDScriptLanguageProtocol::initialize);
+ ClassDB::bind_method(D_METHOD("initialized", "params"), &GDScriptLanguageProtocol::initialized);
+ ClassDB::bind_method(D_METHOD("on_data_received"), &GDScriptLanguageProtocol::on_data_received);
+ ClassDB::bind_method(D_METHOD("on_client_connected"), &GDScriptLanguageProtocol::on_client_connected);
+ ClassDB::bind_method(D_METHOD("on_client_disconnected"), &GDScriptLanguageProtocol::on_client_disconnected);
+ ClassDB::bind_method(D_METHOD("notify_all_clients", "p_method", "p_params"), &GDScriptLanguageProtocol::notify_all_clients, DEFVAL(Variant()));
+ ClassDB::bind_method(D_METHOD("notify_client", "p_method", "p_params", "p_client"), &GDScriptLanguageProtocol::notify_client, DEFVAL(Variant()), DEFVAL(-1));
+ ClassDB::bind_method(D_METHOD("is_smart_resolve_enabled"), &GDScriptLanguageProtocol::is_smart_resolve_enabled);
+ ClassDB::bind_method(D_METHOD("get_text_document"), &GDScriptLanguageProtocol::get_text_document);
+ ClassDB::bind_method(D_METHOD("get_workspace"), &GDScriptLanguageProtocol::get_workspace);
+ ClassDB::bind_method(D_METHOD("is_initialized"), &GDScriptLanguageProtocol::is_initialized);
+}
+
+Dictionary GDScriptLanguageProtocol::initialize(const Dictionary &p_params) {
+
+ lsp::InitializeResult ret;
+
+ String root_uri = p_params["rootUri"];
+ String root = p_params["rootPath"];
+ bool is_same_workspace = root == workspace->root;
+ is_same_workspace = root.to_lower() == workspace->root.to_lower();
+#ifdef WINDOWS_ENABLED
+ is_same_workspace = root.replace("\\", "/").to_lower() == workspace->root.to_lower();
+#endif
+
+ if (root_uri.length() && is_same_workspace) {
+ workspace->root_uri = root_uri;
+ } else {
+
+ workspace->root_uri = "file://" + workspace->root;
+
+ Dictionary params;
+ params["path"] = workspace->root;
+ Dictionary request = make_notification("gdscrip_client/changeWorkspace", params);
+ if (Ref<WebSocketPeer> *peer = clients.getptr(lastest_client_id)) {
+ String msg = JSON::print(request);
+ msg = format_output(msg);
+ CharString charstr = msg.utf8();
+ (*peer)->put_packet((const uint8_t *)charstr.ptr(), charstr.length());
+ }
+ }
+
+ if (!_initialized) {
+ workspace->initialize();
+ text_document->initialize();
+ _initialized = true;
+ }
+
+ return ret.to_json();
+}
+
+void GDScriptLanguageProtocol::initialized(const Variant &p_params) {
+}
+
+void GDScriptLanguageProtocol::poll() {
+ server->poll();
+}
+
+Error GDScriptLanguageProtocol::start(int p_port) {
+ if (server == NULL) {
+ server = dynamic_cast<WebSocketServer *>(ClassDB::instance("WebSocketServer"));
+ server->set_buffers(8192, 1024, 8192, 1024); // 8mb should be way more than enough
+ server->connect("data_received", this, "on_data_received");
+ server->connect("client_connected", this, "on_client_connected");
+ server->connect("client_disconnected", this, "on_client_disconnected");
+ }
+ return server->listen(p_port);
+}
+
+void GDScriptLanguageProtocol::stop() {
+ server->stop();
+}
+
+void GDScriptLanguageProtocol::notify_all_clients(const String &p_method, const Variant &p_params) {
+
+ Dictionary message = make_notification(p_method, p_params);
+ String msg = JSON::print(message);
+ msg = format_output(msg);
+ CharString charstr = msg.utf8();
+ const int *p_id = clients.next(NULL);
+ while (p_id != NULL) {
+ Ref<WebSocketPeer> peer = clients.get(*p_id);
+ (*peer)->put_packet((const uint8_t *)charstr.ptr(), charstr.length());
+ p_id = clients.next(p_id);
+ }
+}
+
+void GDScriptLanguageProtocol::notify_client(const String &p_method, const Variant &p_params, int p_client) {
+
+ if (p_client == -1) {
+ p_client = lastest_client_id;
+ }
+
+ Ref<WebSocketPeer> *peer = clients.getptr(p_client);
+ ERR_FAIL_COND(peer == NULL);
+
+ Dictionary message = make_notification(p_method, p_params);
+ String msg = JSON::print(message);
+ msg = format_output(msg);
+ CharString charstr = msg.utf8();
+
+ (*peer)->put_packet((const uint8_t *)charstr.ptr(), charstr.length());
+}
+
+bool GDScriptLanguageProtocol::is_smart_resolve_enabled() const {
+ return bool(_EDITOR_GET("network/language_server/enable_smart_resolve"));
+}
+
+bool GDScriptLanguageProtocol::is_goto_native_symbols_enabled() const {
+ return bool(_EDITOR_GET("network/language_server/show_native_symbols_in_editor"));
+}
+
+GDScriptLanguageProtocol::GDScriptLanguageProtocol() {
+ server = NULL;
+ singleton = this;
+ _initialized = false;
+ workspace.instance();
+ text_document.instance();
+ set_scope("textDocument", text_document.ptr());
+ set_scope("completionItem", text_document.ptr());
+ set_scope("workspace", workspace.ptr());
+ workspace->root = ProjectSettings::get_singleton()->get_resource_path();
+}
+
+GDScriptLanguageProtocol::~GDScriptLanguageProtocol() {
+ memdelete(server);
+ server = NULL;
+}
diff --git a/modules/gdscript/language_server/gdscript_language_protocol.h b/modules/gdscript/language_server/gdscript_language_protocol.h
new file mode 100644
index 0000000000..136b45fd78
--- /dev/null
+++ b/modules/gdscript/language_server/gdscript_language_protocol.h
@@ -0,0 +1,93 @@
+/*************************************************************************/
+/* gdscript_language_protocol.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef GDSCRIPT_PROTOCAL_SERVER_H
+#define GDSCRIPT_PROTOCAL_SERVER_H
+
+#include "gdscript_text_document.h"
+#include "gdscript_workspace.h"
+#include "lsp.hpp"
+#include "modules/jsonrpc/jsonrpc.h"
+#include "modules/websocket/websocket_peer.h"
+#include "modules/websocket/websocket_server.h"
+
+class GDScriptLanguageProtocol : public JSONRPC {
+ GDCLASS(GDScriptLanguageProtocol, JSONRPC)
+
+ enum LSPErrorCode {
+ RequestCancelled = -32800,
+ ContentModified = -32801,
+ };
+
+ static GDScriptLanguageProtocol *singleton;
+
+ HashMap<int, Ref<WebSocketPeer> > clients;
+ WebSocketServer *server;
+ int lastest_client_id;
+
+ Ref<GDScriptTextDocument> text_document;
+ Ref<GDScriptWorkspace> workspace;
+
+ void on_data_received(int p_id);
+ void on_client_connected(int p_id, const String &p_protocal);
+ void on_client_disconnected(int p_id, bool p_was_clean_close);
+
+ String process_message(const String &p_text);
+ String format_output(const String &p_text);
+
+ bool _initialized;
+
+protected:
+ static void _bind_methods();
+
+ Dictionary initialize(const Dictionary &p_params);
+ void initialized(const Variant &p_params);
+
+public:
+ _FORCE_INLINE_ static GDScriptLanguageProtocol *get_singleton() { return singleton; }
+ _FORCE_INLINE_ Ref<GDScriptWorkspace> get_workspace() { return workspace; }
+ _FORCE_INLINE_ Ref<GDScriptTextDocument> get_text_document() { return text_document; }
+ _FORCE_INLINE_ bool is_initialized() const { return _initialized; }
+
+ void poll();
+ Error start(int p_port);
+ void stop();
+
+ void notify_all_clients(const String &p_method, const Variant &p_params = Variant());
+ void notify_client(const String &p_method, const Variant &p_params = Variant(), int p_client = -1);
+
+ bool is_smart_resolve_enabled() const;
+ bool is_goto_native_symbols_enabled() const;
+
+ GDScriptLanguageProtocol();
+ ~GDScriptLanguageProtocol();
+};
+
+#endif
diff --git a/modules/gdscript/language_server/gdscript_language_server.cpp b/modules/gdscript/language_server/gdscript_language_server.cpp
new file mode 100644
index 0000000000..9bea4557ac
--- /dev/null
+++ b/modules/gdscript/language_server/gdscript_language_server.cpp
@@ -0,0 +1,88 @@
+/*************************************************************************/
+/* gdscript_language_server.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "gdscript_language_server.h"
+#include "core/os/file_access.h"
+#include "core/os/os.h"
+#include "editor/editor_node.h"
+
+GDScriptLanguageServer::GDScriptLanguageServer() {
+ thread = NULL;
+ thread_exit = false;
+ _EDITOR_DEF("network/language_server/remote_port", 6008);
+ _EDITOR_DEF("network/language_server/enable_smart_resolve", false);
+ _EDITOR_DEF("network/language_server/show_native_symbols_in_editor", false);
+}
+
+void GDScriptLanguageServer::_notification(int p_what) {
+
+ switch (p_what) {
+ case NOTIFICATION_ENTER_TREE:
+ start();
+ break;
+ case NOTIFICATION_EXIT_TREE:
+ stop();
+ break;
+ }
+}
+
+void GDScriptLanguageServer::thread_main(void *p_userdata) {
+ GDScriptLanguageServer *self = static_cast<GDScriptLanguageServer *>(p_userdata);
+ while (!self->thread_exit) {
+ self->protocol.poll();
+ OS::get_singleton()->delay_usec(10);
+ }
+}
+
+void GDScriptLanguageServer::start() {
+ int port = (int)_EDITOR_GET("network/language_server/remote_port");
+ if (protocol.start(port) == OK) {
+ EditorNode::get_log()->add_message("** GDScript Language Server Started **");
+ ERR_FAIL_COND(thread != NULL || thread_exit);
+ thread_exit = false;
+ thread = Thread::create(GDScriptLanguageServer::thread_main, this);
+ }
+}
+
+void GDScriptLanguageServer::stop() {
+ ERR_FAIL_COND(NULL == thread || thread_exit);
+ thread_exit = true;
+ Thread::wait_to_finish(thread);
+ memdelete(thread);
+ thread = NULL;
+ protocol.stop();
+ EditorNode::get_log()->add_message("** GDScript Language Server Stopped **");
+}
+
+void register_lsp_types() {
+ ClassDB::register_class<GDScriptLanguageProtocol>();
+ ClassDB::register_class<GDScriptTextDocument>();
+ ClassDB::register_class<GDScriptWorkspace>();
+}
diff --git a/modules/gdscript/language_server/gdscript_language_server.h b/modules/gdscript/language_server/gdscript_language_server.h
new file mode 100644
index 0000000000..83c2320d98
--- /dev/null
+++ b/modules/gdscript/language_server/gdscript_language_server.h
@@ -0,0 +1,60 @@
+/*************************************************************************/
+/* gdscript_language_server.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef GDSCRIPT_LANGUAGE_SERVER_H
+#define GDSCRIPT_LANGUAGE_SERVER_H
+
+#include "../gdscript_parser.h"
+#include "editor/editor_plugin.h"
+#include "gdscript_language_protocol.h"
+
+class GDScriptLanguageServer : public EditorPlugin {
+ GDCLASS(GDScriptLanguageServer, EditorPlugin);
+
+ GDScriptLanguageProtocol protocol;
+
+ Thread *thread;
+ bool thread_exit;
+ static void thread_main(void *p_userdata);
+
+private:
+ void _notification(int p_what);
+ void _iteration();
+
+public:
+ Error parse_script_file(const String &p_path);
+ GDScriptLanguageServer();
+ void start();
+ void stop();
+};
+
+void register_lsp_types();
+
+#endif // GDSCRIPT_LANGUAGE_SERVER_H
diff --git a/modules/gdscript/language_server/gdscript_text_document.cpp b/modules/gdscript/language_server/gdscript_text_document.cpp
new file mode 100644
index 0000000000..f211fae526
--- /dev/null
+++ b/modules/gdscript/language_server/gdscript_text_document.cpp
@@ -0,0 +1,391 @@
+/*************************************************************************/
+/* gdscript_text_document.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "gdscript_text_document.h"
+#include "../gdscript.h"
+#include "core/os/os.h"
+#include "editor/editor_settings.h"
+#include "editor/plugins/script_text_editor.h"
+#include "gdscript_extend_parser.h"
+#include "gdscript_language_protocol.h"
+
+void GDScriptTextDocument::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("didOpen"), &GDScriptTextDocument::didOpen);
+ ClassDB::bind_method(D_METHOD("didChange"), &GDScriptTextDocument::didChange);
+ ClassDB::bind_method(D_METHOD("documentSymbol"), &GDScriptTextDocument::documentSymbol);
+ ClassDB::bind_method(D_METHOD("completion"), &GDScriptTextDocument::completion);
+ ClassDB::bind_method(D_METHOD("resolve"), &GDScriptTextDocument::resolve);
+ ClassDB::bind_method(D_METHOD("foldingRange"), &GDScriptTextDocument::foldingRange);
+ ClassDB::bind_method(D_METHOD("codeLens"), &GDScriptTextDocument::codeLens);
+ ClassDB::bind_method(D_METHOD("documentLink"), &GDScriptTextDocument::documentLink);
+ ClassDB::bind_method(D_METHOD("colorPresentation"), &GDScriptTextDocument::colorPresentation);
+ ClassDB::bind_method(D_METHOD("hover"), &GDScriptTextDocument::hover);
+ ClassDB::bind_method(D_METHOD("definition"), &GDScriptTextDocument::definition);
+ ClassDB::bind_method(D_METHOD("show_native_symbol_in_editor"), &GDScriptTextDocument::show_native_symbol_in_editor);
+}
+
+void GDScriptTextDocument::didOpen(const Variant &p_param) {
+ lsp::TextDocumentItem doc = load_document_item(p_param);
+ sync_script_content(doc.uri, doc.text);
+}
+
+void GDScriptTextDocument::didChange(const Variant &p_param) {
+ lsp::TextDocumentItem doc = load_document_item(p_param);
+ Dictionary dict = p_param;
+ Array contentChanges = dict["contentChanges"];
+ for (int i = 0; i < contentChanges.size(); ++i) {
+ lsp::TextDocumentContentChangeEvent evt;
+ evt.load(contentChanges[i]);
+ doc.text = evt.text;
+ }
+ sync_script_content(doc.uri, doc.text);
+}
+
+lsp::TextDocumentItem GDScriptTextDocument::load_document_item(const Variant &p_param) {
+ lsp::TextDocumentItem doc;
+ Dictionary params = p_param;
+ doc.load(params["textDocument"]);
+ return doc;
+}
+
+void GDScriptTextDocument::initialize() {
+
+ if (GDScriptLanguageProtocol::get_singleton()->is_smart_resolve_enabled()) {
+
+ const HashMap<StringName, ClassMembers> &native_members = GDScriptLanguageProtocol::get_singleton()->get_workspace()->native_members;
+
+ const StringName *class_ptr = native_members.next(NULL);
+ while (class_ptr) {
+
+ const ClassMembers &members = native_members.get(*class_ptr);
+
+ const String *name = members.next(NULL);
+ while (name) {
+
+ const lsp::DocumentSymbol *symbol = members.get(*name);
+ lsp::CompletionItem item = symbol->make_completion_item();
+ item.data = JOIN_SYMBOLS(String(*class_ptr), *name);
+ native_member_completions.push_back(item.to_json());
+
+ name = members.next(name);
+ }
+
+ class_ptr = native_members.next(class_ptr);
+ }
+ }
+}
+
+Array GDScriptTextDocument::documentSymbol(const Dictionary &p_params) {
+ Dictionary params = p_params["textDocument"];
+ String uri = params["uri"];
+ String path = GDScriptLanguageProtocol::get_singleton()->get_workspace()->get_file_path(uri);
+ Array arr;
+ if (const Map<String, ExtendGDScriptParser *>::Element *parser = GDScriptLanguageProtocol::get_singleton()->get_workspace()->scripts.find(path)) {
+ Vector<lsp::DocumentedSymbolInformation> list;
+ parser->get()->get_symbols().symbol_tree_as_list(uri, list);
+ for (int i = 0; i < list.size(); i++) {
+ arr.push_back(list[i].to_json());
+ }
+ }
+ return arr;
+}
+
+Array GDScriptTextDocument::completion(const Dictionary &p_params) {
+
+ Array arr;
+
+ lsp::CompletionParams params;
+ params.load(p_params);
+ Dictionary request_data = params.to_json();
+
+ List<ScriptCodeCompletionOption> options;
+ GDScriptLanguageProtocol::get_singleton()->get_workspace()->completion(params, &options);
+
+ if (!options.empty()) {
+
+ int i = 0;
+ arr.resize(options.size());
+
+ for (const List<ScriptCodeCompletionOption>::Element *E = options.front(); E; E = E->next()) {
+
+ const ScriptCodeCompletionOption &option = E->get();
+ lsp::CompletionItem item;
+ item.label = option.display;
+ item.data = request_data;
+
+ switch (option.kind) {
+ case ScriptCodeCompletionOption::KIND_ENUM:
+ item.kind = lsp::CompletionItemKind::Enum;
+ break;
+ case ScriptCodeCompletionOption::KIND_CLASS:
+ item.kind = lsp::CompletionItemKind::Class;
+ break;
+ case ScriptCodeCompletionOption::KIND_MEMBER:
+ item.kind = lsp::CompletionItemKind::Property;
+ break;
+ case ScriptCodeCompletionOption::KIND_FUNCTION:
+ item.kind = lsp::CompletionItemKind::Method;
+ break;
+ case ScriptCodeCompletionOption::KIND_SIGNAL:
+ item.kind = lsp::CompletionItemKind::Event;
+ break;
+ case ScriptCodeCompletionOption::KIND_CONSTANT:
+ item.kind = lsp::CompletionItemKind::Constant;
+ break;
+ case ScriptCodeCompletionOption::KIND_VARIABLE:
+ item.kind = lsp::CompletionItemKind::Variable;
+ break;
+ case ScriptCodeCompletionOption::KIND_FILE_PATH:
+ item.kind = lsp::CompletionItemKind::File;
+ break;
+ case ScriptCodeCompletionOption::KIND_NODE_PATH:
+ item.kind = lsp::CompletionItemKind::Snippet;
+ break;
+ case ScriptCodeCompletionOption::KIND_PLAIN_TEXT:
+ item.kind = lsp::CompletionItemKind::Text;
+ break;
+ }
+
+ arr[i] = item.to_json();
+ i++;
+ }
+ } else if (GDScriptLanguageProtocol::get_singleton()->is_smart_resolve_enabled()) {
+
+ arr = native_member_completions.duplicate();
+
+ for (Map<String, ExtendGDScriptParser *>::Element *E = GDScriptLanguageProtocol::get_singleton()->get_workspace()->scripts.front(); E; E = E->next()) {
+
+ ExtendGDScriptParser *script = E->get();
+ const Array &items = script->get_member_completions();
+
+ const int start_size = arr.size();
+ arr.resize(start_size + items.size());
+ for (int i = start_size; i < arr.size(); i++) {
+ arr[i] = items[i - start_size];
+ }
+ }
+ }
+ return arr;
+}
+
+Dictionary GDScriptTextDocument::resolve(const Dictionary &p_params) {
+
+ lsp::CompletionItem item;
+ item.load(p_params);
+
+ lsp::CompletionParams params;
+ Variant data = p_params["data"];
+
+ const lsp::DocumentSymbol *symbol = NULL;
+
+ if (data.get_type() == Variant::DICTIONARY) {
+
+ params.load(p_params["data"]);
+ symbol = GDScriptLanguageProtocol::get_singleton()->get_workspace()->resolve_symbol(params, item.label, item.kind == lsp::CompletionItemKind::Method || item.kind == lsp::CompletionItemKind::Function);
+
+ } else if (data.get_type() == Variant::STRING) {
+
+ String query = data;
+
+ Vector<String> param_symbols = query.split(SYMBOL_SEPERATOR, false);
+
+ if (param_symbols.size() >= 2) {
+
+ String class_ = param_symbols[0];
+ StringName class_name = class_;
+ String member_name = param_symbols[param_symbols.size() - 1];
+ String inner_class_name;
+ if (param_symbols.size() >= 3) {
+ inner_class_name = param_symbols[1];
+ }
+
+ if (const ClassMembers *members = GDScriptLanguageProtocol::get_singleton()->get_workspace()->native_members.getptr(class_name)) {
+ if (const lsp::DocumentSymbol *const *member = members->getptr(member_name)) {
+ symbol = *member;
+ }
+ }
+
+ if (!symbol) {
+ if (const Map<String, ExtendGDScriptParser *>::Element *E = GDScriptLanguageProtocol::get_singleton()->get_workspace()->scripts.find(class_name)) {
+ symbol = E->get()->get_member_symbol(member_name, inner_class_name);
+ }
+ }
+ }
+ }
+
+ if (symbol) {
+ item.documentation = symbol->render();
+ }
+
+ if ((item.kind == lsp::CompletionItemKind::Method || item.kind == lsp::CompletionItemKind::Function) && !item.label.ends_with("):")) {
+ item.insertText = item.label + "(";
+ if (symbol && symbol->detail.find(",") == -1) {
+ item.insertText += ")";
+ }
+ } else if (item.kind == lsp::CompletionItemKind::Event) {
+ if (params.context.triggerKind == lsp::CompletionTriggerKind::TriggerCharacter && (params.context.triggerCharacter == "(")) {
+ const String quote_style = EDITOR_DEF("text_editor/completion/use_single_quotes", false) ? "'" : "\"";
+ item.insertText = quote_style + item.label + quote_style;
+ }
+ }
+
+ return item.to_json(true);
+}
+
+Array GDScriptTextDocument::foldingRange(const Dictionary &p_params) {
+ Dictionary params = p_params["textDocument"];
+ String path = params["uri"];
+ Array arr;
+ return arr;
+}
+
+Array GDScriptTextDocument::codeLens(const Dictionary &p_params) {
+ Array arr;
+ return arr;
+}
+
+Variant GDScriptTextDocument::documentLink(const Dictionary &p_params) {
+ Variant ret;
+ return ret;
+}
+
+Array GDScriptTextDocument::colorPresentation(const Dictionary &p_params) {
+ Array arr;
+ return arr;
+}
+
+Variant GDScriptTextDocument::hover(const Dictionary &p_params) {
+
+ lsp::TextDocumentPositionParams params;
+ params.load(p_params);
+
+ const lsp::DocumentSymbol *symbol = GDScriptLanguageProtocol::get_singleton()->get_workspace()->resolve_symbol(params);
+ if (symbol) {
+
+ lsp::Hover hover;
+ hover.contents = symbol->render();
+ return hover.to_json();
+
+ } else if (GDScriptLanguageProtocol::get_singleton()->is_smart_resolve_enabled()) {
+
+ Dictionary ret;
+ Array contents;
+ List<const lsp::DocumentSymbol *> list;
+ GDScriptLanguageProtocol::get_singleton()->get_workspace()->resolve_related_symbols(params, list);
+ for (List<const lsp::DocumentSymbol *>::Element *E = list.front(); E; E = E->next()) {
+ if (const lsp::DocumentSymbol *s = E->get()) {
+ contents.push_back(s->render().value);
+ }
+ }
+ ret["contents"] = contents;
+ return ret;
+ }
+
+ return Variant();
+}
+
+Array GDScriptTextDocument::definition(const Dictionary &p_params) {
+ Array arr;
+
+ lsp::TextDocumentPositionParams params;
+ params.load(p_params);
+
+ const lsp::DocumentSymbol *symbol = GDScriptLanguageProtocol::get_singleton()->get_workspace()->resolve_symbol(params);
+ if (symbol) {
+ lsp::Location location;
+ location.uri = symbol->uri;
+ location.range = symbol->range;
+
+ const String &path = GDScriptLanguageProtocol::get_singleton()->get_workspace()->get_file_path(symbol->uri);
+ if (file_checker->file_exists(path)) {
+ arr.push_back(location.to_json());
+ } else if (!symbol->native_class.empty() && GDScriptLanguageProtocol::get_singleton()->is_goto_native_symbols_enabled()) {
+ String id;
+ switch (symbol->kind) {
+ case lsp::SymbolKind::Class:
+ id = "class_name:" + symbol->name;
+ break;
+ case lsp::SymbolKind::Constant:
+ id = "class_constant:" + symbol->native_class + ":" + symbol->name;
+ break;
+ case lsp::SymbolKind::Property:
+ case lsp::SymbolKind::Variable:
+ id = "class_property:" + symbol->native_class + ":" + symbol->name;
+ break;
+ case lsp::SymbolKind::Enum:
+ id = "class_enum:" + symbol->native_class + ":" + symbol->name;
+ break;
+ case lsp::SymbolKind::Method:
+ case lsp::SymbolKind::Function:
+ id = "class_method:" + symbol->native_class + ":" + symbol->name;
+ break;
+ default:
+ id = "class_global:" + symbol->native_class + ":" + symbol->name;
+ break;
+ }
+ call_deferred("show_native_symbol_in_editor", id);
+ }
+ } else if (GDScriptLanguageProtocol::get_singleton()->is_smart_resolve_enabled()) {
+
+ List<const lsp::DocumentSymbol *> list;
+ GDScriptLanguageProtocol::get_singleton()->get_workspace()->resolve_related_symbols(params, list);
+ for (List<const lsp::DocumentSymbol *>::Element *E = list.front(); E; E = E->next()) {
+
+ if (const lsp::DocumentSymbol *s = E->get()) {
+ if (!s->uri.empty()) {
+ lsp::Location location;
+ location.uri = s->uri;
+ location.range = s->range;
+ arr.push_back(location.to_json());
+ }
+ }
+ }
+ }
+
+ return arr;
+}
+
+GDScriptTextDocument::GDScriptTextDocument() {
+ file_checker = FileAccess::create(FileAccess::ACCESS_RESOURCES);
+}
+
+GDScriptTextDocument::~GDScriptTextDocument() {
+ memdelete(file_checker);
+}
+
+void GDScriptTextDocument::sync_script_content(const String &p_uri, const String &p_content) {
+ String path = GDScriptLanguageProtocol::get_singleton()->get_workspace()->get_file_path(p_uri);
+ GDScriptLanguageProtocol::get_singleton()->get_workspace()->parse_script(path, p_content);
+}
+
+void GDScriptTextDocument::show_native_symbol_in_editor(const String &p_symbol_id) {
+ ScriptEditor::get_singleton()->call_deferred("_help_class_goto", p_symbol_id);
+ OS::get_singleton()->move_window_to_foreground();
+}
diff --git a/modules/gdscript/language_server/gdscript_text_document.h b/modules/gdscript/language_server/gdscript_text_document.h
new file mode 100644
index 0000000000..d15022d2c4
--- /dev/null
+++ b/modules/gdscript/language_server/gdscript_text_document.h
@@ -0,0 +1,73 @@
+/*************************************************************************/
+/* gdscript_text_document.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef GDSCRIPT_TEXT_DOCUMENT_H
+#define GDSCRIPT_TEXT_DOCUMENT_H
+
+#include "core/os/file_access.h"
+#include "core/reference.h"
+#include "lsp.hpp"
+
+class GDScriptTextDocument : public Reference {
+ GDCLASS(GDScriptTextDocument, Reference)
+protected:
+ static void _bind_methods();
+
+ FileAccess *file_checker;
+
+ void didOpen(const Variant &p_param);
+ void didChange(const Variant &p_param);
+
+ void sync_script_content(const String &p_path, const String &p_content);
+ void show_native_symbol_in_editor(const String &p_symbol_id);
+
+ Array native_member_completions;
+
+private:
+ lsp::TextDocumentItem load_document_item(const Variant &p_param);
+
+public:
+ Array documentSymbol(const Dictionary &p_params);
+ Array completion(const Dictionary &p_params);
+ Dictionary resolve(const Dictionary &p_params);
+ Array foldingRange(const Dictionary &p_params);
+ Array codeLens(const Dictionary &p_params);
+ Variant documentLink(const Dictionary &p_params);
+ Array colorPresentation(const Dictionary &p_params);
+ Variant hover(const Dictionary &p_params);
+ Array definition(const Dictionary &p_params);
+
+ void initialize();
+
+ GDScriptTextDocument();
+ virtual ~GDScriptTextDocument();
+};
+
+#endif
diff --git a/modules/gdscript/language_server/gdscript_workspace.cpp b/modules/gdscript/language_server/gdscript_workspace.cpp
new file mode 100644
index 0000000000..1901daacff
--- /dev/null
+++ b/modules/gdscript/language_server/gdscript_workspace.cpp
@@ -0,0 +1,504 @@
+/*************************************************************************/
+/* gdscript_workspace.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "gdscript_workspace.h"
+#include "../gdscript.h"
+#include "../gdscript_parser.h"
+#include "core/project_settings.h"
+#include "core/script_language.h"
+#include "editor/editor_help.h"
+#include "gdscript_language_protocol.h"
+
+void GDScriptWorkspace::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("symbol"), &GDScriptWorkspace::symbol);
+ ClassDB::bind_method(D_METHOD("parse_script", "p_path", "p_content"), &GDScriptWorkspace::parse_script);
+ ClassDB::bind_method(D_METHOD("parse_local_script", "p_path"), &GDScriptWorkspace::parse_local_script);
+ ClassDB::bind_method(D_METHOD("get_file_path", "p_uri"), &GDScriptWorkspace::get_file_path);
+ ClassDB::bind_method(D_METHOD("get_file_uri", "p_path"), &GDScriptWorkspace::get_file_uri);
+ ClassDB::bind_method(D_METHOD("publish_diagnostics", "p_path"), &GDScriptWorkspace::publish_diagnostics);
+ ClassDB::bind_method(D_METHOD("generate_script_api", "p_path"), &GDScriptWorkspace::generate_script_api);
+}
+
+void GDScriptWorkspace::remove_cache_parser(const String &p_path) {
+ Map<String, ExtendGDScriptParser *>::Element *parser = parse_results.find(p_path);
+ Map<String, ExtendGDScriptParser *>::Element *script = scripts.find(p_path);
+ if (parser && script) {
+ if (script->get() && script->get() == script->get()) {
+ memdelete(script->get());
+ } else {
+ memdelete(script->get());
+ memdelete(parser->get());
+ }
+ parse_results.erase(p_path);
+ scripts.erase(p_path);
+ } else if (parser) {
+ memdelete(parser->get());
+ parse_results.erase(p_path);
+ } else if (script) {
+ memdelete(script->get());
+ scripts.erase(p_path);
+ }
+}
+
+const lsp::DocumentSymbol *GDScriptWorkspace::get_native_symbol(const String &p_class, const String &p_member) const {
+
+ StringName class_name = p_class;
+ StringName empty;
+
+ while (class_name != empty) {
+ if (const Map<StringName, lsp::DocumentSymbol>::Element *E = native_symbols.find(class_name)) {
+ const lsp::DocumentSymbol &class_symbol = E->value();
+
+ if (p_member.empty()) {
+ return &class_symbol;
+ } else {
+ for (int i = 0; i < class_symbol.children.size(); i++) {
+ const lsp::DocumentSymbol &symbol = class_symbol.children[i];
+ if (symbol.name == p_member) {
+ return &symbol;
+ }
+ }
+ }
+ }
+ class_name = ClassDB::get_parent_class(class_name);
+ }
+
+ return NULL;
+}
+
+const lsp::DocumentSymbol *GDScriptWorkspace::get_script_symbol(const String &p_path) const {
+ const Map<String, ExtendGDScriptParser *>::Element *S = scripts.find(p_path);
+ if (S) {
+ return &(S->get()->get_symbols());
+ }
+ return NULL;
+}
+
+void GDScriptWorkspace::reload_all_workspace_scripts() {
+ List<String> pathes;
+ list_script_files("res://", pathes);
+ for (List<String>::Element *E = pathes.front(); E; E = E->next()) {
+ const String &path = E->get();
+ Error err;
+ String content = FileAccess::get_file_as_string(path, &err);
+ ERR_CONTINUE(err != OK);
+ err = parse_script(path, content);
+
+ if (err != OK) {
+ Map<String, ExtendGDScriptParser *>::Element *S = parse_results.find(path);
+ String err_msg = "Failed parse script " + path;
+ if (S) {
+ err_msg += "\n" + S->get()->get_error();
+ }
+ ERR_EXPLAIN(err_msg);
+ ERR_CONTINUE(err != OK);
+ }
+ }
+}
+
+void GDScriptWorkspace::list_script_files(const String &p_root_dir, List<String> &r_files) {
+ Error err;
+ DirAccessRef dir = DirAccess::open(p_root_dir, &err);
+ if (OK == err) {
+ dir->list_dir_begin();
+ String file_name = dir->get_next();
+ while (file_name.length()) {
+ if (dir->current_is_dir() && file_name != "." && file_name != ".." && file_name != "./") {
+ list_script_files(p_root_dir.plus_file(file_name), r_files);
+ } else if (file_name.ends_with(".gd")) {
+ String script_file = p_root_dir.plus_file(file_name);
+ r_files.push_back(script_file);
+ }
+ file_name = dir->get_next();
+ }
+ }
+}
+
+ExtendGDScriptParser *GDScriptWorkspace::get_parse_successed_script(const String &p_path) {
+ const Map<String, ExtendGDScriptParser *>::Element *S = scripts.find(p_path);
+ if (!S) {
+ parse_local_script(p_path);
+ S = scripts.find(p_path);
+ }
+ if (S) {
+ return S->get();
+ }
+ return NULL;
+}
+
+ExtendGDScriptParser *GDScriptWorkspace::get_parse_result(const String &p_path) {
+ const Map<String, ExtendGDScriptParser *>::Element *S = parse_results.find(p_path);
+ if (!S) {
+ parse_local_script(p_path);
+ S = parse_results.find(p_path);
+ }
+ if (S) {
+ return S->get();
+ }
+ return NULL;
+}
+
+Array GDScriptWorkspace::symbol(const Dictionary &p_params) {
+ String query = p_params["query"];
+ Array arr;
+ if (!query.empty()) {
+ for (Map<String, ExtendGDScriptParser *>::Element *E = scripts.front(); E; E = E->next()) {
+ Vector<lsp::DocumentedSymbolInformation> script_symbols;
+ E->get()->get_symbols().symbol_tree_as_list(E->key(), script_symbols);
+ for (int i = 0; i < script_symbols.size(); ++i) {
+ if (query.is_subsequence_ofi(script_symbols[i].name)) {
+ arr.push_back(script_symbols[i].to_json());
+ }
+ }
+ }
+ }
+ return arr;
+}
+
+Error GDScriptWorkspace::initialize() {
+ if (initialized) return OK;
+
+ DocData *doc = EditorHelp::get_doc_data();
+ for (Map<String, DocData::ClassDoc>::Element *E = doc->class_list.front(); E; E = E->next()) {
+
+ const DocData::ClassDoc &class_data = E->value();
+ lsp::DocumentSymbol class_symbol;
+ String class_name = E->key();
+ class_symbol.name = class_name;
+ class_symbol.native_class = class_name;
+ class_symbol.kind = lsp::SymbolKind::Class;
+ class_symbol.detail = String("<Native> class ") + class_name;
+ if (!class_data.inherits.empty()) {
+ class_symbol.detail += " extends " + class_data.inherits;
+ }
+ class_symbol.documentation = ExtendGDScriptParser::marked_documentation(class_data.brief_description) + "\n" + ExtendGDScriptParser::marked_documentation(class_data.description);
+
+ for (int i = 0; i < class_data.constants.size(); i++) {
+ const DocData::ConstantDoc &const_data = class_data.constants[i];
+ lsp::DocumentSymbol symbol;
+ symbol.name = const_data.name;
+ symbol.native_class = class_name;
+ symbol.kind = lsp::SymbolKind::Constant;
+ symbol.detail = "const " + class_name + "." + const_data.name;
+ if (const_data.enumeration.length()) {
+ symbol.detail += ": " + const_data.enumeration;
+ }
+ symbol.detail += " = " + const_data.value;
+ symbol.documentation = ExtendGDScriptParser::marked_documentation(const_data.description);
+ class_symbol.children.push_back(symbol);
+ }
+
+ Vector<DocData::PropertyDoc> properties;
+ properties.append_array(class_data.properties);
+ const int theme_prop_start_idx = properties.size();
+ properties.append_array(class_data.theme_properties);
+
+ for (int i = 0; i < class_data.properties.size(); i++) {
+ const DocData::PropertyDoc &data = class_data.properties[i];
+ lsp::DocumentSymbol symbol;
+ symbol.name = data.name;
+ symbol.native_class = class_name;
+ symbol.kind = lsp::SymbolKind::Property;
+ symbol.detail = String(i >= theme_prop_start_idx ? "<Theme> var" : "var") + " " + class_name + "." + data.name;
+ if (data.enumeration.length()) {
+ symbol.detail += ": " + data.enumeration;
+ } else {
+ symbol.detail += ": " + data.type;
+ }
+ symbol.documentation = ExtendGDScriptParser::marked_documentation(data.description);
+ class_symbol.children.push_back(symbol);
+ }
+
+ Vector<DocData::MethodDoc> methods_signals;
+ methods_signals.append_array(class_data.methods);
+ const int signal_start_idx = methods_signals.size();
+ methods_signals.append_array(class_data.signals);
+
+ for (int i = 0; i < methods_signals.size(); i++) {
+ const DocData::MethodDoc &data = methods_signals[i];
+
+ lsp::DocumentSymbol symbol;
+ symbol.name = data.name;
+ symbol.native_class = class_name;
+ symbol.kind = i >= signal_start_idx ? lsp::SymbolKind::Event : lsp::SymbolKind::Method;
+
+ String params = "";
+ bool arg_default_value_started = false;
+ for (int j = 0; j < data.arguments.size(); j++) {
+ const DocData::ArgumentDoc &arg = data.arguments[j];
+ if (!arg_default_value_started && !arg.default_value.empty()) {
+ arg_default_value_started = true;
+ }
+ String arg_str = arg.name + ": " + arg.type;
+ if (arg_default_value_started) {
+ arg_str += " = " + arg.default_value;
+ }
+ if (j < data.arguments.size() - 1) {
+ arg_str += ", ";
+ }
+ params += arg_str;
+ }
+ if (data.qualifiers.find("vararg") != -1) {
+ params += params.empty() ? "..." : ", ...";
+ }
+
+ symbol.detail = "func " + class_name + "." + data.name + "(" + params + ") -> " + data.return_type;
+ symbol.documentation = ExtendGDScriptParser::marked_documentation(data.description);
+ class_symbol.children.push_back(symbol);
+ }
+
+ native_symbols.insert(class_name, class_symbol);
+ }
+
+ reload_all_workspace_scripts();
+
+ if (GDScriptLanguageProtocol::get_singleton()->is_smart_resolve_enabled()) {
+ for (Map<StringName, lsp::DocumentSymbol>::Element *E = native_symbols.front(); E; E = E->next()) {
+ ClassMembers members;
+ const lsp::DocumentSymbol &class_symbol = E->get();
+ for (int i = 0; i < class_symbol.children.size(); i++) {
+ const lsp::DocumentSymbol &symbol = class_symbol.children[i];
+ members.set(symbol.name, &symbol);
+ }
+ native_members.set(E->key(), members);
+ }
+
+ // cache member completions
+ for (Map<String, ExtendGDScriptParser *>::Element *S = scripts.front(); S; S = S->next()) {
+ S->get()->get_member_completions();
+ }
+ }
+
+ return OK;
+}
+
+Error GDScriptWorkspace::parse_script(const String &p_path, const String &p_content) {
+
+ ExtendGDScriptParser *parser = memnew(ExtendGDScriptParser);
+ Error err = parser->parse(p_content, p_path);
+ Map<String, ExtendGDScriptParser *>::Element *last_parser = parse_results.find(p_path);
+ Map<String, ExtendGDScriptParser *>::Element *last_script = scripts.find(p_path);
+
+ if (err == OK) {
+
+ remove_cache_parser(p_path);
+ parse_results[p_path] = parser;
+ scripts[p_path] = parser;
+
+ } else {
+ if (last_parser && last_script && last_parser->get() != last_script->get()) {
+ memdelete(last_parser->get());
+ }
+ parse_results[p_path] = parser;
+ }
+
+ publish_diagnostics(p_path);
+
+ return err;
+}
+
+Error GDScriptWorkspace::parse_local_script(const String &p_path) {
+ Error err;
+ String content = FileAccess::get_file_as_string(p_path, &err);
+ if (err == OK) {
+ err = parse_script(p_path, content);
+ }
+ return err;
+}
+
+String GDScriptWorkspace::get_file_path(const String &p_uri) const {
+ String path = p_uri;
+ path = path.replace(root_uri + "/", "res://");
+ path = path.http_unescape();
+ return path;
+}
+
+String GDScriptWorkspace::get_file_uri(const String &p_path) const {
+ String uri = p_path;
+ uri = uri.replace("res://", root_uri + "/");
+ return uri;
+}
+
+void GDScriptWorkspace::publish_diagnostics(const String &p_path) {
+ Dictionary params;
+ Array errors;
+ const Map<String, ExtendGDScriptParser *>::Element *ele = parse_results.find(p_path);
+ if (ele) {
+ const Vector<lsp::Diagnostic> &list = ele->get()->get_diagnostics();
+ errors.resize(list.size());
+ for (int i = 0; i < list.size(); ++i) {
+ errors[i] = list[i].to_json();
+ }
+ }
+ params["diagnostics"] = errors;
+ params["uri"] = get_file_uri(p_path);
+ GDScriptLanguageProtocol::get_singleton()->notify_client("textDocument/publishDiagnostics", params);
+}
+
+void GDScriptWorkspace::completion(const lsp::CompletionParams &p_params, List<ScriptCodeCompletionOption> *r_options) {
+
+ String path = get_file_path(p_params.textDocument.uri);
+ String call_hint;
+ bool forced = false;
+
+ if (const ExtendGDScriptParser *parser = get_parse_result(path)) {
+ String code = parser->get_text_for_completion(p_params.position);
+ GDScriptLanguage::get_singleton()->complete_code(code, path, NULL, r_options, forced, call_hint);
+ }
+}
+
+const lsp::DocumentSymbol *GDScriptWorkspace::resolve_symbol(const lsp::TextDocumentPositionParams &p_doc_pos, const String &p_symbol_name, bool p_func_requred) {
+
+ const lsp::DocumentSymbol *symbol = NULL;
+
+ String path = get_file_path(p_doc_pos.textDocument.uri);
+ if (const ExtendGDScriptParser *parser = get_parse_result(path)) {
+
+ String symbol_identifier = p_symbol_name;
+ Vector<String> identifier_parts = symbol_identifier.split("(");
+ if (identifier_parts.size()) {
+ symbol_identifier = identifier_parts[0];
+ }
+
+ lsp::Position pos = p_doc_pos.position;
+ if (symbol_identifier.empty()) {
+ Vector2i offset;
+ symbol_identifier = parser->get_identifier_under_position(p_doc_pos.position, offset);
+ pos.character += offset.y;
+ }
+
+ if (!symbol_identifier.empty()) {
+
+ if (ScriptServer::is_global_class(symbol_identifier)) {
+
+ String class_path = ScriptServer::get_global_class_path(symbol_identifier);
+ symbol = get_script_symbol(class_path);
+
+ } else {
+
+ ScriptLanguage::LookupResult ret;
+ if (OK == GDScriptLanguage::get_singleton()->lookup_code(parser->get_text_for_lookup_symbol(pos, symbol_identifier, p_func_requred), symbol_identifier, path, NULL, ret)) {
+
+ if (ret.type == ScriptLanguage::LookupResult::RESULT_SCRIPT_LOCATION) {
+
+ String target_script_path = path;
+ if (!ret.script.is_null()) {
+ target_script_path = ret.script->get_path();
+ }
+
+ if (const ExtendGDScriptParser *target_parser = get_parse_result(target_script_path)) {
+ symbol = target_parser->get_symbol_defined_at_line(LINE_NUMBER_TO_INDEX(ret.location));
+ }
+
+ } else {
+
+ String member = ret.class_member;
+ if (member.empty() && symbol_identifier != ret.class_name) {
+ member = symbol_identifier;
+ }
+ symbol = get_native_symbol(ret.class_name, member);
+ }
+ } else {
+ symbol = parser->get_member_symbol(symbol_identifier);
+ }
+ }
+ }
+ }
+
+ return symbol;
+}
+
+void GDScriptWorkspace::resolve_related_symbols(const lsp::TextDocumentPositionParams &p_doc_pos, List<const lsp::DocumentSymbol *> &r_list) {
+
+ String path = get_file_path(p_doc_pos.textDocument.uri);
+ if (const ExtendGDScriptParser *parser = get_parse_result(path)) {
+
+ String symbol_identifier;
+ Vector2i offset;
+ symbol_identifier = parser->get_identifier_under_position(p_doc_pos.position, offset);
+
+ const StringName *class_ptr = native_members.next(NULL);
+ while (class_ptr) {
+ const ClassMembers &members = native_members.get(*class_ptr);
+ if (const lsp::DocumentSymbol *const *symbol = members.getptr(symbol_identifier)) {
+ r_list.push_back(*symbol);
+ }
+ class_ptr = native_members.next(class_ptr);
+ }
+
+ for (Map<String, ExtendGDScriptParser *>::Element *E = scripts.front(); E; E = E->next()) {
+ const ExtendGDScriptParser *script = E->get();
+ const ClassMembers &members = script->get_members();
+ if (const lsp::DocumentSymbol *const *symbol = members.getptr(symbol_identifier)) {
+ r_list.push_back(*symbol);
+ }
+
+ const HashMap<String, ClassMembers> &inner_classes = script->get_inner_classes();
+ const String *_class = inner_classes.next(NULL);
+ while (_class) {
+
+ const ClassMembers *inner_class = inner_classes.getptr(*_class);
+ if (const lsp::DocumentSymbol *const *symbol = inner_class->getptr(symbol_identifier)) {
+ r_list.push_back(*symbol);
+ }
+
+ _class = inner_classes.next(_class);
+ }
+ }
+ }
+}
+
+Dictionary GDScriptWorkspace::generate_script_api(const String &p_path) {
+ Dictionary api;
+ if (const ExtendGDScriptParser *parser = get_parse_successed_script(p_path)) {
+ api = parser->generate_api();
+ }
+ return api;
+}
+
+GDScriptWorkspace::GDScriptWorkspace() {
+ ProjectSettings::get_singleton()->get_resource_path();
+}
+
+GDScriptWorkspace::~GDScriptWorkspace() {
+ Set<String> cached_parsers;
+
+ for (Map<String, ExtendGDScriptParser *>::Element *E = parse_results.front(); E; E = E->next()) {
+ cached_parsers.insert(E->key());
+ }
+
+ for (Map<String, ExtendGDScriptParser *>::Element *E = scripts.front(); E; E = E->next()) {
+ cached_parsers.insert(E->key());
+ }
+
+ for (Set<String>::Element *E = cached_parsers.front(); E; E = E->next()) {
+ remove_cache_parser(E->get());
+ }
+}
diff --git a/modules/gdscript/language_server/gdscript_workspace.h b/modules/gdscript/language_server/gdscript_workspace.h
new file mode 100644
index 0000000000..adce169d4b
--- /dev/null
+++ b/modules/gdscript/language_server/gdscript_workspace.h
@@ -0,0 +1,91 @@
+/*************************************************************************/
+/* gdscript_workspace.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef GDSCRIPT_WORKSPACE_H
+#define GDSCRIPT_WORKSPACE_H
+
+#include "../gdscript_parser.h"
+#include "core/variant.h"
+#include "gdscript_extend_parser.h"
+#include "lsp.hpp"
+
+class GDScriptWorkspace : public Reference {
+ GDCLASS(GDScriptWorkspace, Reference);
+
+protected:
+ static void _bind_methods();
+ void remove_cache_parser(const String &p_path);
+ bool initialized = false;
+ Map<StringName, lsp::DocumentSymbol> native_symbols;
+
+ const lsp::DocumentSymbol *get_native_symbol(const String &p_class, const String &p_member = "") const;
+ const lsp::DocumentSymbol *get_script_symbol(const String &p_path) const;
+
+ void reload_all_workspace_scripts();
+
+ ExtendGDScriptParser *get_parse_successed_script(const String &p_path);
+ ExtendGDScriptParser *get_parse_result(const String &p_path);
+
+ void strip_flat_symbols(const String &p_branch);
+ void list_script_files(const String &p_root_dir, List<String> &r_files);
+
+public:
+ String root;
+ String root_uri;
+
+ Map<String, ExtendGDScriptParser *> scripts;
+ Map<String, ExtendGDScriptParser *> parse_results;
+ HashMap<StringName, ClassMembers> native_members;
+
+public:
+ Array symbol(const Dictionary &p_params);
+
+public:
+ Error initialize();
+
+ Error parse_script(const String &p_path, const String &p_content);
+ Error parse_local_script(const String &p_path);
+
+ String get_file_path(const String &p_uri) const;
+ String get_file_uri(const String &p_path) const;
+
+ void publish_diagnostics(const String &p_path);
+ void completion(const lsp::CompletionParams &p_params, List<ScriptCodeCompletionOption> *r_options);
+
+ const lsp::DocumentSymbol *resolve_symbol(const lsp::TextDocumentPositionParams &p_doc_pos, const String &p_symbol_name = "", bool p_func_requred = false);
+ void resolve_related_symbols(const lsp::TextDocumentPositionParams &p_doc_pos, List<const lsp::DocumentSymbol *> &r_list);
+
+ Dictionary generate_script_api(const String &p_path);
+
+ GDScriptWorkspace();
+ ~GDScriptWorkspace();
+};
+
+#endif
diff --git a/modules/gdscript/language_server/lsp.hpp b/modules/gdscript/language_server/lsp.hpp
new file mode 100644
index 0000000000..3e57b6ee7e
--- /dev/null
+++ b/modules/gdscript/language_server/lsp.hpp
@@ -0,0 +1,1506 @@
+/*************************************************************************/
+/* lsp.hpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef GODOT_LSP_H
+#define GODOT_LSP_H
+
+#include "core/variant.h"
+
+namespace lsp {
+
+typedef String DocumentUri;
+
+/**
+ * Text documents are identified using a URI. On the protocol level, URIs are passed as strings.
+ */
+struct TextDocumentIdentifier {
+ /**
+ * The text document's URI.
+ */
+ DocumentUri uri;
+
+ _FORCE_INLINE_ void load(const Dictionary &p_params) {
+ uri = p_params["uri"];
+ }
+
+ _FORCE_INLINE_ Dictionary to_json() const {
+ Dictionary dict;
+ dict["uri"] = uri;
+ return dict;
+ }
+};
+
+/**
+ * Position in a text document expressed as zero-based line and zero-based character offset.
+ * A position is between two characters like an ‘insert’ cursor in a editor.
+ * Special values like for example -1 to denote the end of a line are not supported.
+ */
+struct Position {
+ /**
+ * Line position in a document (zero-based).
+ */
+ int line = 0;
+
+ /**
+ * Character offset on a line in a document (zero-based). Assuming that the line is
+ * represented as a string, the `character` value represents the gap between the
+ * `character` and `character + 1`.
+ *
+ * If the character value is greater than the line length it defaults back to the
+ * line length.
+ */
+ int character = 0;
+
+ _FORCE_INLINE_ void load(const Dictionary &p_params) {
+ line = p_params["line"];
+ character = p_params["character"];
+ }
+
+ _FORCE_INLINE_ Dictionary to_json() const {
+ Dictionary dict;
+ dict["line"] = line;
+ dict["character"] = character;
+ return dict;
+ }
+};
+
+/**
+ * A range in a text document expressed as (zero-based) start and end positions.
+ * A range is comparable to a selection in an editor. Therefore the end position is exclusive.
+ * If you want to specify a range that contains a line including the line ending character(s) then use an end position denoting the start of the next line.
+ */
+struct Range {
+ /**
+ * The range's start position.
+ */
+ Position start;
+
+ /**
+ * The range's end position.
+ */
+ Position end;
+
+ _FORCE_INLINE_ void load(const Dictionary &p_params) {
+ start.load(p_params["start"]);
+ end.load(p_params["end"]);
+ }
+
+ _FORCE_INLINE_ Dictionary to_json() const {
+ Dictionary dict;
+ dict["start"] = start.to_json();
+ dict["end"] = end.to_json();
+ return dict;
+ }
+};
+
+/**
+ * Represents a location inside a resource, such as a line inside a text file.
+ */
+struct Location {
+ DocumentUri uri;
+ Range range;
+
+ _FORCE_INLINE_ void load(const Dictionary &p_params) {
+ uri = p_params["uri"];
+ range.load(p_params["range"]);
+ }
+
+ _FORCE_INLINE_ Dictionary to_json() const {
+ Dictionary dict;
+ dict["uri"] = uri;
+ dict["range"] = range.to_json();
+ return dict;
+ }
+};
+
+/**
+ * Represents a link between a source and a target location.
+ */
+struct LocationLink {
+
+ /**
+ * Span of the origin of this link.
+ *
+ * Used as the underlined span for mouse interaction. Defaults to the word range at
+ * the mouse position.
+ */
+ Range *originSelectionRange = NULL;
+
+ /**
+ * The target resource identifier of this link.
+ */
+ String targetUri;
+
+ /**
+ * The full target range of this link. If the target for example is a symbol then target range is the
+ * range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to highlight the range in the editor.
+ */
+ Range targetRange;
+
+ /**
+ * The range that should be selected and revealed when this link is being followed, e.g the name of a function.
+ * Must be contained by the the `targetRange`. See also `DocumentSymbol#range`
+ */
+ Range targetSelectionRange;
+};
+
+/**
+ * A parameter literal used in requests to pass a text document and a position inside that document.
+ */
+struct TextDocumentPositionParams {
+ /**
+ * The text document.
+ */
+ TextDocumentIdentifier textDocument;
+
+ /**
+ * The position inside the text document.
+ */
+ Position position;
+
+ _FORCE_INLINE_ void load(const Dictionary &p_params) {
+ textDocument.load(p_params["textDocument"]);
+ position.load(p_params["position"]);
+ }
+
+ _FORCE_INLINE_ Dictionary to_json() const {
+ Dictionary dict;
+ dict["textDocument"] = textDocument.to_json();
+ dict["position"] = position.to_json();
+ return dict;
+ }
+};
+
+/**
+ * A textual edit applicable to a text document.
+ */
+struct TextEdit {
+ /**
+ * The range of the text document to be manipulated. To insert
+ * text into a document create a range where start === end.
+ */
+ Range range;
+
+ /**
+ * The string to be inserted. For delete operations use an
+ * empty string.
+ */
+ String newText;
+};
+
+/**
+ * Represents a reference to a command.
+ * Provides a title which will be used to represent a command in the UI.
+ * Commands are identified by a string identifier.
+ * The recommended way to handle commands is to implement their execution on the server side if the client and server provides the corresponding capabilities.
+ * Alternatively the tool extension code could handle the command. The protocol currently doesn’t specify a set of well-known commands.
+ */
+struct Command {
+ /**
+ * Title of the command, like `save`.
+ */
+ String title;
+ /**
+ * The identifier of the actual command handler.
+ */
+ String command;
+ /**
+ * Arguments that the command handler should be
+ * invoked with.
+ */
+ Array arguments;
+
+ Dictionary to_json() const {
+ Dictionary dict;
+ dict["title"] = title;
+ dict["command"] = command;
+ if (arguments.size()) dict["arguments"] = arguments;
+ return dict;
+ }
+};
+
+namespace TextDocumentSyncKind {
+/**
+ * Documents should not be synced at all.
+ */
+static const int None = 0;
+
+/**
+ * Documents are synced by always sending the full content
+ * of the document.
+ */
+static const int Full = 1;
+
+/**
+ * Documents are synced by sending the full content on open.
+ * After that only incremental updates to the document are
+ * send.
+ */
+static const int Incremental = 2;
+}; // namespace TextDocumentSyncKind
+
+/**
+ * Completion options.
+ */
+struct CompletionOptions {
+ /**
+ * The server provides support to resolve additional
+ * information for a completion item.
+ */
+ bool resolveProvider = true;
+
+ /**
+ * The characters that trigger completion automatically.
+ */
+ Vector<String> triggerCharacters;
+
+ CompletionOptions() {
+ triggerCharacters.push_back(".");
+ triggerCharacters.push_back("$");
+ triggerCharacters.push_back("'");
+ triggerCharacters.push_back("\"");
+ triggerCharacters.push_back("(");
+ triggerCharacters.push_back(",");
+ }
+
+ Dictionary to_json() const {
+ Dictionary dict;
+ dict["resolveProvider"] = resolveProvider;
+ dict["triggerCharacters"] = triggerCharacters;
+ return dict;
+ }
+};
+
+/**
+ * Signature help options.
+ */
+struct SignatureHelpOptions {
+ /**
+ * The characters that trigger signature help
+ * automatically.
+ */
+ Vector<String> triggerCharacters;
+
+ Dictionary to_json() {
+ Dictionary dict;
+ dict["triggerCharacters"] = triggerCharacters;
+ return dict;
+ }
+};
+
+/**
+ * Code Lens options.
+ */
+struct CodeLensOptions {
+ /**
+ * Code lens has a resolve provider as well.
+ */
+ bool resolveProvider = false;
+
+ Dictionary to_json() {
+ Dictionary dict;
+ dict["resolveProvider"] = resolveProvider;
+ return dict;
+ }
+};
+
+/**
+ * Rename options
+ */
+struct RenameOptions {
+ /**
+ * Renames should be checked and tested before being executed.
+ */
+ bool prepareProvider = false;
+
+ Dictionary to_json() {
+ Dictionary dict;
+ dict["prepareProvider"] = prepareProvider;
+ return dict;
+ }
+};
+
+/**
+ * Document link options.
+ */
+struct DocumentLinkOptions {
+ /**
+ * Document links have a resolve provider as well.
+ */
+ bool resolveProvider = false;
+
+ Dictionary to_json() {
+ Dictionary dict;
+ dict["resolveProvider"] = resolveProvider;
+ return dict;
+ }
+};
+
+/**
+ * Execute command options.
+ */
+struct ExecuteCommandOptions {
+ /**
+ * The commands to be executed on the server
+ */
+ Vector<String> commands;
+
+ Dictionary to_json() {
+ Dictionary dict;
+ dict["commands"] = commands;
+ return dict;
+ }
+};
+
+/**
+ * Save options.
+ */
+struct SaveOptions {
+ /**
+ * The client is supposed to include the content on save.
+ */
+ bool includeText = true;
+
+ Dictionary to_json() {
+ Dictionary dict;
+ dict["includeText"] = includeText;
+ return dict;
+ }
+};
+
+/**
+ * Color provider options.
+ */
+struct ColorProviderOptions {
+ Dictionary to_json() {
+ Dictionary dict;
+ return dict;
+ }
+};
+
+/**
+ * Folding range provider options.
+ */
+struct FoldingRangeProviderOptions {
+ Dictionary to_json() {
+ Dictionary dict;
+ return dict;
+ }
+};
+
+struct TextDocumentSyncOptions {
+ /**
+ * Open and close notifications are sent to the server. If omitted open close notification should not
+ * be sent.
+ */
+ bool openClose = true;
+
+ /**
+ * Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full
+ * and TextDocumentSyncKind.Incremental. If omitted it defaults to TextDocumentSyncKind.None.
+ */
+ int change = TextDocumentSyncKind::Full;
+
+ /**
+ * If present will save notifications are sent to the server. If omitted the notification should not be
+ * sent.
+ */
+ bool willSave = false;
+
+ /**
+ * If present will save wait until requests are sent to the server. If omitted the request should not be
+ * sent.
+ */
+ bool willSaveWaitUntil = false;
+
+ /**
+ * If present save notifications are sent to the server. If omitted the notification should not be
+ * sent.
+ */
+ SaveOptions save;
+
+ Dictionary to_json() {
+ Dictionary dict;
+ dict["willSaveWaitUntil"] = willSaveWaitUntil;
+ dict["willSave"] = willSave;
+ dict["openClose"] = openClose;
+ dict["change"] = change;
+ dict["change"] = save.to_json();
+ return dict;
+ }
+};
+
+/**
+ * Static registration options to be returned in the initialize request.
+ */
+struct StaticRegistrationOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ String id;
+};
+
+/**
+ * Format document on type options.
+ */
+struct DocumentOnTypeFormattingOptions {
+ /**
+ * A character on which formatting should be triggered, like `}`.
+ */
+ String firstTriggerCharacter;
+
+ /**
+ * More trigger characters.
+ */
+ Vector<String> moreTriggerCharacter;
+
+ Dictionary to_json() {
+ Dictionary dict;
+ dict["firstTriggerCharacter"] = firstTriggerCharacter;
+ dict["moreTriggerCharacter"] = moreTriggerCharacter;
+ return dict;
+ }
+};
+
+struct TextDocumentItem {
+ /**
+ * The text document's URI.
+ */
+ DocumentUri uri;
+
+ /**
+ * The text document's language identifier.
+ */
+ String languageId;
+
+ /**
+ * The version number of this document (it will increase after each
+ * change, including undo/redo).
+ */
+ int version;
+
+ /**
+ * The content of the opened text document.
+ */
+ String text;
+
+ void load(const Dictionary &p_dict) {
+ uri = p_dict["uri"];
+ languageId = p_dict["languageId"];
+ version = p_dict["version"];
+ text = p_dict["text"];
+ }
+
+ Dictionary to_json() const {
+ Dictionary dict;
+ dict["uri"] = uri;
+ dict["languageId"] = languageId;
+ dict["version"] = version;
+ dict["text"] = text;
+ return dict;
+ }
+};
+
+/**
+ * An event describing a change to a text document. If range and rangeLength are omitted
+ * the new text is considered to be the full content of the document.
+ */
+struct TextDocumentContentChangeEvent {
+ /**
+ * The range of the document that changed.
+ */
+ Range range;
+
+ /**
+ * The length of the range that got replaced.
+ */
+ int rangeLength;
+
+ /**
+ * The new text of the range/document.
+ */
+ String text;
+
+ void load(const Dictionary &p_params) {
+ text = p_params["text"];
+ rangeLength = p_params["rangeLength"];
+ range.load(p_params["range"]);
+ }
+};
+
+namespace DiagnosticSeverity {
+/**
+ * Reports an error.
+ */
+static const int Error = 1;
+/**
+ * Reports a warning.
+ */
+static const int Warning = 2;
+/**
+ * Reports an information.
+ */
+static const int Information = 3;
+/**
+ * Reports a hint.
+ */
+static const int Hint = 4;
+}; // namespace DiagnosticSeverity
+
+/**
+ * Represents a related message and source code location for a diagnostic. This should be
+ * used to point to code locations that cause or related to a diagnostics, e.g when duplicating
+ * a symbol in a scope.
+ */
+struct DiagnosticRelatedInformation {
+ /**
+ * The location of this related diagnostic information.
+ */
+ Location location;
+
+ /**
+ * The message of this related diagnostic information.
+ */
+ String message;
+
+ Dictionary to_json() const {
+ Dictionary dict;
+ dict["location"] = location.to_json(),
+ dict["message"] = message;
+ return dict;
+ }
+};
+
+/**
+ * Represents a diagnostic, such as a compiler error or warning.
+ * Diagnostic objects are only valid in the scope of a resource.
+ */
+struct Diagnostic {
+ /**
+ * The range at which the message applies.
+ */
+ Range range;
+
+ /**
+ * The diagnostic's severity. Can be omitted. If omitted it is up to the
+ * client to interpret diagnostics as error, warning, info or hint.
+ */
+ int severity;
+
+ /**
+ * The diagnostic's code, which might appear in the user interface.
+ */
+ int code;
+
+ /**
+ * A human-readable string describing the source of this
+ * diagnostic, e.g. 'typescript' or 'super lint'.
+ */
+ String source;
+
+ /**
+ * The diagnostic's message.
+ */
+ String message;
+
+ /**
+ * An array of related diagnostic information, e.g. when symbol-names within
+ * a scope collide all definitions can be marked via this property.
+ */
+ Vector<DiagnosticRelatedInformation> relatedInformation;
+
+ Dictionary to_json() const {
+ Dictionary dict;
+ dict["range"] = range.to_json();
+ dict["code"] = code;
+ dict["severity"] = severity;
+ dict["message"] = message;
+ dict["source"] = source;
+ if (!relatedInformation.empty()) {
+ Array arr;
+ arr.resize(relatedInformation.size());
+ for (int i = 0; i < relatedInformation.size(); i++) {
+ arr[i] = relatedInformation[i].to_json();
+ }
+ dict["relatedInformation"] = arr;
+ }
+ return dict;
+ }
+};
+
+/**
+ * Describes the content type that a client supports in various
+ * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.
+ *
+ * Please note that `MarkupKinds` must not start with a `$`. This kinds
+ * are reserved for internal usage.
+ */
+namespace MarkupKind {
+static const String PlainText = "plaintext";
+static const String Markdown = "markdown";
+}; // namespace MarkupKind
+
+/**
+ * A `MarkupContent` literal represents a string value which content is interpreted base on its
+ * kind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds.
+ *
+ * If the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues.
+ * See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
+ *
+ * Here is an example how such a string can be constructed using JavaScript / TypeScript:
+ * ```typescript
+ * let markdown: MarkdownContent = {
+ * kind: MarkupKind.Markdown,
+ * value: [
+ * '# Header',
+ * 'Some text',
+ * '```typescript',
+ * 'someCode();',
+ * '```'
+ * ].join('\n')
+ * };
+ * ```
+ *
+ * *Please Note* that clients might sanitize the return markdown. A client could decide to
+ * remove HTML from the markdown to avoid script execution.
+ */
+struct MarkupContent {
+ /**
+ * The type of the Markup
+ */
+ String kind;
+
+ /**
+ * The content itself
+ */
+ String value;
+
+ MarkupContent() {
+ kind = MarkupKind::Markdown;
+ }
+
+ MarkupContent(const String &p_value) {
+ value = p_value;
+ kind = MarkupKind::Markdown;
+ }
+
+ Dictionary to_json() const {
+ Dictionary dict;
+ dict["kind"] = kind;
+ dict["value"] = value;
+ return dict;
+ }
+};
+
+/**
+ * The kind of a completion entry.
+ */
+namespace CompletionItemKind {
+static const int Text = 1;
+static const int Method = 2;
+static const int Function = 3;
+static const int Constructor = 4;
+static const int Field = 5;
+static const int Variable = 6;
+static const int Class = 7;
+static const int Interface = 8;
+static const int Module = 9;
+static const int Property = 10;
+static const int Unit = 11;
+static const int Value = 12;
+static const int Enum = 13;
+static const int Keyword = 14;
+static const int Snippet = 15;
+static const int Color = 16;
+static const int File = 17;
+static const int Reference = 18;
+static const int Folder = 19;
+static const int EnumMember = 20;
+static const int Constant = 21;
+static const int Struct = 22;
+static const int Event = 23;
+static const int Operator = 24;
+static const int TypeParameter = 25;
+}; // namespace CompletionItemKind
+
+/**
+ * Defines whether the insert text in a completion item should be interpreted as
+ * plain text or a snippet.
+ */
+namespace InsertTextFormat {
+/**
+ * The primary text to be inserted is treated as a plain string.
+ */
+static const int PlainText = 1;
+
+/**
+ * The primary text to be inserted is treated as a snippet.
+ *
+ * A snippet can define tab stops and placeholders with `$1`, `$2`
+ * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+ * the end of the snippet. Placeholders with equal identifiers are linked,
+ * that is typing in one will update others too.
+ */
+static const int Snippet = 2;
+}; // namespace InsertTextFormat
+
+struct CompletionItem {
+ /**
+ * The label of this completion item. By default
+ * also the text that is inserted when selecting
+ * this completion.
+ */
+ String label;
+
+ /**
+ * The kind of this completion item. Based of the kind
+ * an icon is chosen by the editor. The standardized set
+ * of available values is defined in `CompletionItemKind`.
+ */
+ int kind;
+
+ /**
+ * A human-readable string with additional information
+ * about this item, like type or symbol information.
+ */
+ String detail;
+
+ /**
+ * A human-readable string that represents a doc-comment.
+ */
+ MarkupContent documentation;
+
+ /**
+ * Indicates if this item is deprecated.
+ */
+ bool deprecated = false;
+
+ /**
+ * Select this item when showing.
+ *
+ * *Note* that only one completion item can be selected and that the
+ * tool / client decides which item that is. The rule is that the *first*
+ * item of those that match best is selected.
+ */
+ bool preselect = false;
+
+ /**
+ * A string that should be used when comparing this item
+ * with other items. When `falsy` the label is used.
+ */
+ String sortText;
+
+ /**
+ * A string that should be used when filtering a set of
+ * completion items. When `falsy` the label is used.
+ */
+ String filterText;
+
+ /**
+ * A string that should be inserted into a document when selecting
+ * this completion. When `falsy` the label is used.
+ *
+ * The `insertText` is subject to interpretation by the client side.
+ * Some tools might not take the string literally. For example
+ * VS Code when code complete is requested in this example `con<cursor position>`
+ * and a completion item with an `insertText` of `console` is provided it
+ * will only insert `sole`. Therefore it is recommended to use `textEdit` instead
+ * since it avoids additional client side interpretation.
+ *
+ * @deprecated Use textEdit instead.
+ */
+ String insertText;
+
+ /**
+ * The format of the insert text. The format applies to both the `insertText` property
+ * and the `newText` property of a provided `textEdit`.
+ */
+ int insertTextFormat;
+
+ /**
+ * An edit which is applied to a document when selecting this completion. When an edit is provided the value of
+ * `insertText` is ignored.
+ *
+ * *Note:* The range of the edit must be a single line range and it must contain the position at which completion
+ * has been requested.
+ */
+ TextEdit textEdit;
+
+ /**
+ * An optional array of additional text edits that are applied when
+ * selecting this completion. Edits must not overlap (including the same insert position)
+ * with the main edit nor with themselves.
+ *
+ * Additional text edits should be used to change text unrelated to the current cursor position
+ * (for example adding an import statement at the top of the file if the completion item will
+ * insert an unqualified type).
+ */
+ Vector<TextEdit> additionalTextEdits;
+
+ /**
+ * An optional set of characters that when pressed while this completion is active will accept it first and
+ * then type that character. *Note* that all commit characters should have `length=1` and that superfluous
+ * characters will be ignored.
+ */
+ Vector<String> commitCharacters;
+
+ /**
+ * An optional command that is executed *after* inserting this completion. *Note* that
+ * additional modifications to the current document should be described with the
+ * additionalTextEdits-property.
+ */
+ Command command;
+
+ /**
+ * A data entry field that is preserved on a completion item between
+ * a completion and a completion resolve request.
+ */
+ Variant data;
+
+ _FORCE_INLINE_ Dictionary to_json(bool resolved = false) const {
+ Dictionary dict;
+ dict["label"] = label;
+ dict["kind"] = kind;
+ dict["data"] = data;
+ if (resolved) {
+ dict["insertText"] = insertText;
+ dict["detail"] = detail;
+ dict["documentation"] = documentation.to_json();
+ dict["deprecated"] = deprecated;
+ dict["preselect"] = preselect;
+ dict["sortText"] = sortText;
+ dict["filterText"] = filterText;
+ if (commitCharacters.size()) dict["commitCharacters"] = commitCharacters;
+ dict["command"] = command.to_json();
+ }
+ return dict;
+ }
+
+ void load(const Dictionary &p_dict) {
+ if (p_dict.has("label")) label = p_dict["label"];
+ if (p_dict.has("kind")) kind = p_dict["kind"];
+ if (p_dict.has("detail")) detail = p_dict["detail"];
+ if (p_dict.has("documentation")) {
+ Variant doc = p_dict["documentation"];
+ if (doc.get_type() == Variant::STRING) {
+ documentation.value = doc;
+ } else if (doc.get_type() == Variant::DICTIONARY) {
+ Dictionary v = doc;
+ documentation.value = v["value"];
+ }
+ }
+ if (p_dict.has("deprecated")) deprecated = p_dict["deprecated"];
+ if (p_dict.has("preselect")) preselect = p_dict["preselect"];
+ if (p_dict.has("sortText")) sortText = p_dict["sortText"];
+ if (p_dict.has("filterText")) filterText = p_dict["filterText"];
+ if (p_dict.has("insertText")) insertText = p_dict["insertText"];
+ if (p_dict.has("data")) data = p_dict["data"];
+ }
+};
+
+/**
+ * Represents a collection of [completion items](#CompletionItem) to be presented
+ * in the editor.
+ */
+struct CompletionList {
+ /**
+ * This list it not complete. Further typing should result in recomputing
+ * this list.
+ */
+ bool isIncomplete;
+
+ /**
+ * The completion items.
+ */
+ Vector<CompletionItem> items;
+};
+
+/**
+ * A symbol kind.
+ */
+namespace SymbolKind {
+static const int File = 1;
+static const int Module = 2;
+static const int Namespace = 3;
+static const int Package = 4;
+static const int Class = 5;
+static const int Method = 6;
+static const int Property = 7;
+static const int Field = 8;
+static const int Constructor = 9;
+static const int Enum = 10;
+static const int Interface = 11;
+static const int Function = 12;
+static const int Variable = 13;
+static const int Constant = 14;
+static const int String = 15;
+static const int Number = 16;
+static const int Boolean = 17;
+static const int Array = 18;
+static const int Object = 19;
+static const int Key = 20;
+static const int Null = 21;
+static const int EnumMember = 22;
+static const int Struct = 23;
+static const int Event = 24;
+static const int Operator = 25;
+static const int TypeParameter = 26;
+}; // namespace SymbolKind
+
+/**
+ * Represents information about programming constructs like variables, classes,
+ * interfaces etc.
+ */
+struct SymbolInformation {
+ /**
+ * The name of this symbol.
+ */
+ String name;
+
+ /**
+ * The kind of this symbol.
+ */
+ int kind = SymbolKind::File;
+
+ /**
+ * Indicates if this symbol is deprecated.
+ */
+ bool deprecated = false;
+
+ /**
+ * The location of this symbol. The location's range is used by a tool
+ * to reveal the location in the editor. If the symbol is selected in the
+ * tool the range's start information is used to position the cursor. So
+ * the range usually spans more then the actual symbol's name and does
+ * normally include things like visibility modifiers.
+ *
+ * The range doesn't have to denote a node range in the sense of a abstract
+ * syntax tree. It can therefore not be used to re-construct a hierarchy of
+ * the symbols.
+ */
+ Location location;
+
+ /**
+ * The name of the symbol containing this symbol. This information is for
+ * user interface purposes (e.g. to render a qualifier in the user interface
+ * if necessary). It can't be used to re-infer a hierarchy for the document
+ * symbols.
+ */
+ String containerName;
+
+ _FORCE_INLINE_ Dictionary to_json() const {
+ Dictionary dict;
+ dict["name"] = name;
+ dict["kind"] = kind;
+ dict["deprecated"] = deprecated;
+ dict["location"] = location.to_json();
+ dict["containerName"] = containerName;
+ return dict;
+ }
+};
+
+struct DocumentedSymbolInformation : public SymbolInformation {
+ /**
+ * A human-readable string with additional information
+ */
+ String detail;
+
+ /**
+ * A human-readable string that represents a doc-comment.
+ */
+ String documentation;
+};
+
+/**
+ * Represents programming constructs like variables, classes, interfaces etc. that appear in a document. Document symbols can be
+ * hierarchical and they have two ranges: one that encloses its definition and one that points to its most interesting range,
+ * e.g. the range of an identifier.
+ */
+struct DocumentSymbol {
+
+ /**
+ * The name of this symbol. Will be displayed in the user interface and therefore must not be
+ * an empty string or a string only consisting of white spaces.
+ */
+ String name;
+
+ /**
+ * More detail for this symbol, e.g the signature of a function.
+ */
+ String detail;
+
+ /**
+ * Documentation for this symbol
+ */
+ String documentation;
+
+ /**
+ * Class name for the native symbols
+ */
+ String native_class;
+
+ /**
+ * The kind of this symbol.
+ */
+ int kind = SymbolKind::File;
+
+ /**
+ * Indicates if this symbol is deprecated.
+ */
+ bool deprecated = false;
+
+ /**
+ * The range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to determine if the clients cursor is
+ * inside the symbol to reveal in the symbol in the UI.
+ */
+ Range range;
+
+ /**
+ * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
+ * Must be contained by the `range`.
+ */
+ Range selectionRange;
+
+ DocumentUri uri;
+ String script_path;
+
+ /**
+ * Children of this symbol, e.g. properties of a class.
+ */
+ Vector<DocumentSymbol> children;
+
+ _FORCE_INLINE_ Dictionary to_json() const {
+ Dictionary dict;
+ dict["name"] = name;
+ dict["detail"] = detail;
+ dict["kind"] = kind;
+ dict["deprecated"] = deprecated;
+ dict["range"] = range.to_json();
+ dict["selectionRange"] = selectionRange.to_json();
+ Array arr;
+ arr.resize(children.size());
+ for (int i = 0; i < children.size(); i++) {
+ arr[i] = children[i].to_json();
+ }
+ dict["children"] = arr;
+ return dict;
+ }
+
+ void symbol_tree_as_list(const String &p_uri, Vector<DocumentedSymbolInformation> &r_list, const String &p_container = "", bool p_join_name = false) const {
+ DocumentedSymbolInformation si;
+ if (p_join_name && !p_container.empty()) {
+ si.name = p_container + ">" + name;
+ } else {
+ si.name = name;
+ }
+ si.kind = kind;
+ si.containerName = p_container;
+ si.deprecated = deprecated;
+ si.location.uri = p_uri;
+ si.location.range = range;
+ si.detail = detail;
+ si.documentation = documentation;
+ r_list.push_back(si);
+ for (int i = 0; i < children.size(); i++) {
+ children[i].symbol_tree_as_list(p_uri, r_list, si.name, p_join_name);
+ }
+ }
+
+ _FORCE_INLINE_ MarkupContent render() const {
+ MarkupContent markdown;
+ if (detail.length()) {
+ markdown.value = "\t" + detail + "\n\n";
+ }
+ if (documentation.length()) {
+ markdown.value += documentation + "\n\n";
+ }
+ if (script_path.length()) {
+ markdown.value += "Defined in [" + script_path + "](" + uri + ")";
+ }
+ return markdown;
+ }
+
+ _FORCE_INLINE_ CompletionItem make_completion_item(bool resolved = false) const {
+
+ lsp::CompletionItem item;
+ item.label = name;
+
+ if (resolved) {
+ item.documentation = render();
+ }
+
+ switch (kind) {
+ case lsp::SymbolKind::Enum:
+ item.kind = lsp::CompletionItemKind::Enum;
+ break;
+ case lsp::SymbolKind::Class:
+ item.kind = lsp::CompletionItemKind::Class;
+ break;
+ case lsp::SymbolKind::Property:
+ item.kind = lsp::CompletionItemKind::Property;
+ break;
+ case lsp::SymbolKind::Method:
+ case lsp::SymbolKind::Function:
+ item.kind = lsp::CompletionItemKind::Method;
+ break;
+ case lsp::SymbolKind::Event:
+ item.kind = lsp::CompletionItemKind::Event;
+ break;
+ case lsp::SymbolKind::Constant:
+ item.kind = lsp::CompletionItemKind::Constant;
+ break;
+ case lsp::SymbolKind::Variable:
+ item.kind = lsp::CompletionItemKind::Variable;
+ break;
+ case lsp::SymbolKind::File:
+ item.kind = lsp::CompletionItemKind::File;
+ break;
+ default:
+ item.kind = lsp::CompletionItemKind::Text;
+ break;
+ }
+
+ return item;
+ }
+};
+
+/**
+ * Enum of known range kinds
+ */
+namespace FoldingRangeKind {
+/**
+ * Folding range for a comment
+ */
+static const String Comment = "comment";
+/**
+ * Folding range for a imports or includes
+ */
+static const String Imports = "imports";
+/**
+ * Folding range for a region (e.g. `#region`)
+ */
+static const String Region = "region";
+} // namespace FoldingRangeKind
+
+/**
+ * Represents a folding range.
+ */
+struct FoldingRange {
+
+ /**
+ * The zero-based line number from where the folded range starts.
+ */
+ int startLine = 0;
+
+ /**
+ * The zero-based character offset from where the folded range starts. If not defined, defaults to the length of the start line.
+ */
+ int startCharacter = 0;
+
+ /**
+ * The zero-based line number where the folded range ends.
+ */
+ int endLine = 0;
+
+ /**
+ * The zero-based character offset before the folded range ends. If not defined, defaults to the length of the end line.
+ */
+ int endCharacter = 0;
+
+ /**
+ * Describes the kind of the folding range such as `comment' or 'region'. The kind
+ * is used to categorize folding ranges and used by commands like 'Fold all comments'. See
+ * [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds.
+ */
+ String kind = FoldingRangeKind::Region;
+
+ _FORCE_INLINE_ Dictionary to_json() const {
+ Dictionary dict;
+ dict["startLine"] = startLine;
+ dict["startCharacter"] = startCharacter;
+ dict["endLine"] = endLine;
+ dict["endCharacter"] = endCharacter;
+ return dict;
+ }
+};
+
+/**
+ * How a completion was triggered
+ */
+namespace CompletionTriggerKind {
+/**
+ * Completion was triggered by typing an identifier (24x7 code
+ * complete), manual invocation (e.g Ctrl+Space) or via API.
+ */
+static const int Invoked = 1;
+
+/**
+ * Completion was triggered by a trigger character specified by
+ * the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
+ */
+static const int TriggerCharacter = 2;
+
+/**
+ * Completion was re-triggered as the current completion list is incomplete.
+ */
+static const int TriggerForIncompleteCompletions = 3;
+} // namespace CompletionTriggerKind
+
+/**
+ * Contains additional information about the context in which a completion request is triggered.
+ */
+struct CompletionContext {
+ /**
+ * How the completion was triggered.
+ */
+ int triggerKind = CompletionTriggerKind::TriggerCharacter;
+
+ /**
+ * The trigger character (a single character) that has trigger code complete.
+ * Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`
+ */
+ String triggerCharacter;
+
+ void load(const Dictionary &p_params) {
+ triggerKind = int(p_params["triggerKind"]);
+ triggerCharacter = p_params["triggerCharacter"];
+ }
+};
+
+struct CompletionParams : public TextDocumentPositionParams {
+
+ /**
+ * The completion context. This is only available if the client specifies
+ * to send this using `ClientCapabilities.textDocument.completion.contextSupport === true`
+ */
+ CompletionContext context;
+
+ void load(const Dictionary &p_params) {
+ TextDocumentPositionParams::load(p_params);
+ context.load(p_params["context"]);
+ }
+};
+
+/**
+ * The result of a hover request.
+ */
+struct Hover {
+ /**
+ * The hover's content
+ */
+ MarkupContent contents;
+
+ /**
+ * An optional range is a range inside a text document
+ * that is used to visualize a hover, e.g. by changing the background color.
+ */
+ Range range;
+
+ _FORCE_INLINE_ Dictionary to_json() const {
+ Dictionary dict;
+ dict["range"] = range.to_json();
+ dict["contents"] = contents.to_json();
+ return dict;
+ }
+};
+
+struct ServerCapabilities {
+ /**
+ * Defines how text documents are synced. Is either a detailed structure defining each notification or
+ * for backwards compatibility the TextDocumentSyncKind number. If omitted it defaults to `TextDocumentSyncKind.None`.
+ */
+ TextDocumentSyncOptions textDocumentSync;
+
+ /**
+ * The server provides hover support.
+ */
+ bool hoverProvider = true;
+
+ /**
+ * The server provides completion support.
+ */
+ CompletionOptions completionProvider;
+
+ /**
+ * The server provides signature help support.
+ */
+ SignatureHelpOptions signatureHelpProvider;
+
+ /**
+ * The server provides goto definition support.
+ */
+ bool definitionProvider = true;
+
+ /**
+ * The server provides Goto Type Definition support.
+ *
+ * Since 3.6.0
+ */
+ bool typeDefinitionProvider = false;
+
+ /**
+ * The server provides Goto Implementation support.
+ *
+ * Since 3.6.0
+ */
+ bool implementationProvider = false;
+
+ /**
+ * The server provides find references support.
+ */
+ bool referencesProvider = false;
+
+ /**
+ * The server provides document highlight support.
+ */
+ bool documentHighlightProvider = false;
+
+ /**
+ * The server provides document symbol support.
+ */
+ bool documentSymbolProvider = true;
+
+ /**
+ * The server provides workspace symbol support.
+ */
+ bool workspaceSymbolProvider = true;
+
+ /**
+ * The server provides code actions. The `CodeActionOptions` return type is only
+ * valid if the client signals code action literal support via the property
+ * `textDocument.codeAction.codeActionLiteralSupport`.
+ */
+ bool codeActionProvider = false;
+
+ /**
+ * The server provides code lens.
+ */
+ CodeLensOptions codeLensProvider;
+
+ /**
+ * The server provides document formatting.
+ */
+ bool documentFormattingProvider = false;
+
+ /**
+ * The server provides document range formatting.
+ */
+ bool documentRangeFormattingProvider = false;
+
+ /**
+ * The server provides document formatting on typing.
+ */
+ DocumentOnTypeFormattingOptions documentOnTypeFormattingProvider;
+
+ /**
+ * The server provides rename support. RenameOptions may only be
+ * specified if the client states that it supports
+ * `prepareSupport` in its initial `initialize` request.
+ */
+ RenameOptions renameProvider;
+
+ /**
+ * The server provides document link support.
+ */
+ DocumentLinkOptions documentLinkProvider;
+
+ /**
+ * The server provides color provider support.
+ *
+ * Since 3.6.0
+ */
+ ColorProviderOptions colorProvider;
+
+ /**
+ * The server provides folding provider support.
+ *
+ * Since 3.10.0
+ */
+ FoldingRangeProviderOptions foldingRangeProvider;
+
+ /**
+ * The server provides go to declaration support.
+ *
+ * Since 3.14.0
+ */
+ bool declarationProvider = true;
+
+ /**
+ * The server provides execute command support.
+ */
+ ExecuteCommandOptions executeCommandProvider;
+
+ _FORCE_INLINE_ Dictionary to_json() {
+ Dictionary dict;
+ dict["textDocumentSync"] = (int)textDocumentSync.change;
+ dict["completionProvider"] = completionProvider.to_json();
+ dict["signatureHelpProvider"] = signatureHelpProvider.to_json();
+ dict["codeLensProvider"] = false; // codeLensProvider.to_json();
+ dict["documentOnTypeFormattingProvider"] = documentOnTypeFormattingProvider.to_json();
+ dict["renameProvider"] = renameProvider.to_json();
+ dict["documentLinkProvider"] = documentLinkProvider.to_json();
+ dict["colorProvider"] = false; // colorProvider.to_json();
+ dict["foldingRangeProvider"] = false; //foldingRangeProvider.to_json();
+ dict["executeCommandProvider"] = executeCommandProvider.to_json();
+ dict["hoverProvider"] = hoverProvider;
+ dict["definitionProvider"] = definitionProvider;
+ dict["typeDefinitionProvider"] = typeDefinitionProvider;
+ dict["implementationProvider"] = implementationProvider;
+ dict["referencesProvider"] = referencesProvider;
+ dict["documentHighlightProvider"] = documentHighlightProvider;
+ dict["documentSymbolProvider"] = documentSymbolProvider;
+ dict["workspaceSymbolProvider"] = workspaceSymbolProvider;
+ dict["codeActionProvider"] = codeActionProvider;
+ dict["documentFormattingProvider"] = documentFormattingProvider;
+ dict["documentRangeFormattingProvider"] = documentRangeFormattingProvider;
+ dict["declarationProvider"] = declarationProvider;
+ return dict;
+ }
+};
+
+struct InitializeResult {
+ /**
+ * The capabilities the language server provides.
+ */
+ ServerCapabilities capabilities;
+
+ _FORCE_INLINE_ Dictionary to_json() {
+ Dictionary dict;
+ dict["capabilities"] = capabilities.to_json();
+ return dict;
+ }
+};
+
+} // namespace lsp
+
+#endif
diff --git a/modules/gdscript/register_types.cpp b/modules/gdscript/register_types.cpp
index 62117dcaf3..94b9e8c2d9 100644
--- a/modules/gdscript/register_types.cpp
+++ b/modules/gdscript/register_types.cpp
@@ -34,7 +34,6 @@
#include "core/io/resource_loader.h"
#include "core/os/dir_access.h"
#include "core/os/file_access.h"
-#include "editor/gdscript_highlighter.h"
#include "gdscript.h"
#include "gdscript_tokenizer.h"
@@ -47,6 +46,12 @@ Ref<ResourceFormatSaverGDScript> resource_saver_gd;
#include "editor/editor_export.h"
#include "editor/editor_node.h"
#include "editor/editor_settings.h"
+#include "editor/gdscript_highlighter.h"
+
+#ifndef GDSCRIPT_NO_LSP
+#include "core/engine.h"
+#include "language_server/gdscript_language_server.h"
+#endif // !GDSCRIPT_NO_LSP
class EditorExportGDScript : public EditorExportPlugin {
@@ -134,9 +139,16 @@ static void _editor_init() {
Ref<EditorExportGDScript> gd_export;
gd_export.instance();
EditorExport::get_singleton()->add_export_plugin(gd_export);
+
+#ifndef GDSCRIPT_NO_LSP
+ register_lsp_types();
+ GDScriptLanguageServer *lsp_plugin = memnew(GDScriptLanguageServer);
+ EditorNode::get_singleton()->add_editor_plugin(lsp_plugin);
+ Engine::get_singleton()->add_singleton(Engine::Singleton("GDScriptLanguageProtocol", GDScriptLanguageProtocol::get_singleton()));
+#endif // !GDSCRIPT_NO_LSP
}
-#endif
+#endif // TOOLS_ENABLED
void register_gdscript_types() {
@@ -155,7 +167,7 @@ void register_gdscript_types() {
#ifdef TOOLS_ENABLED
ScriptEditor::register_create_syntax_highlighter_function(GDScriptSyntaxHighlighter::create);
EditorNode::add_init_callback(_editor_init);
-#endif
+#endif // TOOLS_ENABLED
}
void unregister_gdscript_types() {
diff --git a/modules/gridmap/grid_map_editor_plugin.cpp b/modules/gridmap/grid_map_editor_plugin.cpp
index 9712f2b5e7..07b4f7f596 100644
--- a/modules/gridmap/grid_map_editor_plugin.cpp
+++ b/modules/gridmap/grid_map_editor_plugin.cpp
@@ -1271,7 +1271,7 @@ GridMapEditor::GridMapEditor(EditorNode *p_editor) {
options->get_popup()->add_item(TTR("Fill Selection"), MENU_OPTION_SELECTION_FILL, KEY_MASK_CTRL + KEY_F);
options->get_popup()->add_separator();
- options->get_popup()->add_item(TTR("Settings"), MENU_OPTION_GRIDMAP_SETTINGS);
+ options->get_popup()->add_item(TTR("Settings..."), MENU_OPTION_GRIDMAP_SETTINGS);
settings_dialog = memnew(ConfirmationDialog);
settings_dialog->set_title(TTR("GridMap Settings"));
diff --git a/modules/gridmap/grid_map_editor_plugin.h b/modules/gridmap/grid_map_editor_plugin.h
index b9be925ff7..d174ac1035 100644
--- a/modules/gridmap/grid_map_editor_plugin.h
+++ b/modules/gridmap/grid_map_editor_plugin.h
@@ -35,9 +35,6 @@
#include "editor/editor_plugin.h"
#include "editor/pane_drag.h"
#include "grid_map.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class SpatialEditorPlugin;
diff --git a/modules/hdr/image_loader_hdr.cpp b/modules/hdr/image_loader_hdr.cpp
index e610619b54..1abf26bfee 100644
--- a/modules/hdr/image_loader_hdr.cpp
+++ b/modules/hdr/image_loader_hdr.cpp
@@ -37,7 +37,7 @@ Error ImageLoaderHDR::load_image(Ref<Image> p_image, FileAccess *f, bool p_force
String header = f->get_token();
- ERR_FAIL_COND_V(header != "#?RADIANCE" && header != "#?RGBE", ERR_FILE_UNRECOGNIZED);
+ ERR_FAIL_COND_V_MSG(header != "#?RADIANCE" && header != "#?RGBE", ERR_FILE_UNRECOGNIZED, "Unsupported header information in HDR: " + header + ".");
while (true) {
String line = f->get_line();
@@ -45,12 +45,9 @@ Error ImageLoaderHDR::load_image(Ref<Image> p_image, FileAccess *f, bool p_force
if (line == "") // empty line indicates end of header
break;
if (line.begins_with("FORMAT=")) { // leave option to implement other commands
- if (line != "FORMAT=32-bit_rle_rgbe") {
- ERR_EXPLAIN("Only 32-bit_rle_rgbe is supported for HDR files.");
- return ERR_FILE_UNRECOGNIZED;
- }
+ ERR_FAIL_COND_V_MSG(line != "FORMAT=32-bit_rle_rgbe", ERR_FILE_UNRECOGNIZED, "Only 32-bit_rle_rgbe is supported for HDR files.");
} else if (!line.begins_with("#")) { // not comment
- WARN_PRINTS("Ignoring unsupported header information in HDR : " + line);
+ WARN_PRINTS("Ignoring unsupported header information in HDR: " + line + ".");
}
}
diff --git a/modules/hdr/image_loader_hdr.h b/modules/hdr/image_loader_hdr.h
index 8ebf52def7..e9575ee4fb 100644
--- a/modules/hdr/image_loader_hdr.h
+++ b/modules/hdr/image_loader_hdr.h
@@ -33,9 +33,6 @@
#include "core/io/image_loader.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class ImageLoaderHDR : public ImageFormatLoader {
public:
diff --git a/modules/jpg/image_loader_jpegd.h b/modules/jpg/image_loader_jpegd.h
index 9a96fe008d..e9016ce43e 100644
--- a/modules/jpg/image_loader_jpegd.h
+++ b/modules/jpg/image_loader_jpegd.h
@@ -33,9 +33,6 @@
#include "core/io/image_loader.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class ImageLoaderJPG : public ImageFormatLoader {
public:
diff --git a/modules/jsonrpc/SCsub b/modules/jsonrpc/SCsub
new file mode 100644
index 0000000000..13c9ffb253
--- /dev/null
+++ b/modules/jsonrpc/SCsub
@@ -0,0 +1,7 @@
+#!/usr/bin/env python
+
+Import('env')
+Import('env_modules')
+
+env_jsonrpc = env_modules.Clone()
+env_jsonrpc.add_source_files(env.modules_sources, "*.cpp")
diff --git a/modules/jsonrpc/config.py b/modules/jsonrpc/config.py
new file mode 100644
index 0000000000..53bc827027
--- /dev/null
+++ b/modules/jsonrpc/config.py
@@ -0,0 +1,5 @@
+def can_build(env, platform):
+ return True
+
+def configure(env):
+ pass
diff --git a/modules/jsonrpc/jsonrpc.cpp b/modules/jsonrpc/jsonrpc.cpp
new file mode 100644
index 0000000000..e1bba60f2f
--- /dev/null
+++ b/modules/jsonrpc/jsonrpc.cpp
@@ -0,0 +1,171 @@
+/*************************************************************************/
+/* jsonrpc.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "jsonrpc.h"
+#include "core/io/json.h"
+
+JSONRPC::JSONRPC() {
+}
+
+JSONRPC::~JSONRPC() {
+}
+
+void JSONRPC::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("set_scope", "scope", "target"), &JSONRPC::set_scope);
+ ClassDB::bind_method(D_METHOD("process_action", "action", "recurse"), &JSONRPC::process_action, DEFVAL(false));
+ ClassDB::bind_method(D_METHOD("process_string", "action"), &JSONRPC::process_string);
+
+ ClassDB::bind_method(D_METHOD("make_request", "method", "params", "id"), &JSONRPC::make_request);
+ ClassDB::bind_method(D_METHOD("make_response", "result", "id"), &JSONRPC::make_response);
+ ClassDB::bind_method(D_METHOD("make_notification", "method", "params"), &JSONRPC::make_notification);
+ ClassDB::bind_method(D_METHOD("make_response_error", "code", "message", "id"), &JSONRPC::make_response_error, DEFVAL(Variant()));
+
+ BIND_ENUM_CONSTANT(PARSE_ERROR)
+ BIND_ENUM_CONSTANT(INVALID_REQUEST)
+ BIND_ENUM_CONSTANT(METHOD_NOT_FOUND)
+ BIND_ENUM_CONSTANT(INVALID_PARAMS)
+ BIND_ENUM_CONSTANT(INTERNAL_ERROR)
+}
+
+Dictionary JSONRPC::make_response_error(int p_code, const String &p_message, const Variant &p_id) const {
+ Dictionary dict;
+ dict["jsonrpc"] = "2.0";
+
+ Dictionary err;
+ err["code"] = p_code;
+ err["message"] = p_message;
+
+ dict["error"] = err;
+ dict["id"] = p_id;
+
+ return dict;
+}
+
+Dictionary JSONRPC::make_response(const Variant &p_value, const Variant &p_id) {
+ Dictionary dict;
+ dict["jsonrpc"] = "2.0";
+ dict["id"] = p_id;
+ dict["result"] = p_value;
+ return dict;
+}
+
+Dictionary JSONRPC::make_notification(const String &p_method, const Variant &p_params) {
+ Dictionary dict;
+ dict["jsonrpc"] = "2.0";
+ dict["method"] = p_method;
+ dict["params"] = p_params;
+ return dict;
+}
+
+Dictionary JSONRPC::make_request(const String &p_method, const Variant &p_params, const Variant &p_id) {
+ Dictionary dict;
+ dict["jsonrpc"] = "2.0";
+ dict["method"] = p_method;
+ dict["params"] = p_params;
+ dict["id"] = p_id;
+ return dict;
+}
+
+Variant JSONRPC::process_action(const Variant &p_action, bool p_process_arr_elements) {
+ Variant ret;
+ if (p_action.get_type() == Variant::DICTIONARY) {
+ Dictionary dict = p_action;
+ String method = dict.get("method", "");
+ Array args;
+ if (dict.has("params")) {
+ Variant params = dict.get("params", Variant());
+ if (params.get_type() == Variant::ARRAY) {
+ args = params;
+ } else {
+ args.push_back(params);
+ }
+ }
+
+ Object *object = this;
+ if (method_scopes.has(method.get_base_dir())) {
+ object = method_scopes[method.get_base_dir()];
+ method = method.get_file();
+ }
+
+ Variant id;
+ if (dict.has("id")) {
+ id = dict["id"];
+ }
+
+ if (object == NULL || !object->has_method(method)) {
+ ret = make_response_error(JSONRPC::METHOD_NOT_FOUND, "Method not found", id);
+ } else {
+ Variant call_ret = object->callv(method, args);
+ if (id.get_type() != Variant::NIL) {
+ ret = make_response(call_ret, id);
+ }
+ }
+ } else if (p_action.get_type() == Variant::ARRAY && p_process_arr_elements) {
+ Array arr = p_action;
+ int size = arr.size();
+ if (size) {
+ Array arr_ret;
+ for (int i = 0; i < size; i++) {
+ const Variant &var = arr.get(i);
+ arr_ret.push_back(process_action(var));
+ }
+ ret = arr_ret;
+ } else {
+ ret = make_response_error(JSONRPC::INVALID_REQUEST, "Invalid Request");
+ }
+ } else {
+ ret = make_response_error(JSONRPC::INVALID_REQUEST, "Invalid Request");
+ }
+ return ret;
+}
+
+String JSONRPC::process_string(const String &p_input) {
+
+ if (p_input.empty()) return String();
+
+ Variant ret;
+ Variant input;
+ String err_message;
+ int err_line;
+ if (OK != JSON::parse(p_input, input, err_message, err_line)) {
+ ret = make_response_error(JSONRPC::PARSE_ERROR, "Parse error");
+ } else {
+ ret = process_action(input, true);
+ }
+
+ if (ret.get_type() == Variant::NIL) {
+ return "";
+ }
+ return JSON::print(ret);
+}
+
+void JSONRPC::set_scope(const String &p_scope, Object *p_obj) {
+ method_scopes[p_scope] = p_obj;
+}
diff --git a/modules/jsonrpc/jsonrpc.h b/modules/jsonrpc/jsonrpc.h
new file mode 100644
index 0000000000..91897d0b55
--- /dev/null
+++ b/modules/jsonrpc/jsonrpc.h
@@ -0,0 +1,70 @@
+/*************************************************************************/
+/* jsonrpc.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef GODOT_JSON_RPC_H
+#define GODOT_JSON_RPC_H
+
+#include "core/object.h"
+#include "core/variant.h"
+
+class JSONRPC : public Object {
+ GDCLASS(JSONRPC, Object)
+
+ Map<String, Object *> method_scopes;
+
+protected:
+ static void _bind_methods();
+
+public:
+ JSONRPC();
+ ~JSONRPC();
+
+ enum ErrorCode {
+ PARSE_ERROR = -32700,
+ INVALID_REQUEST = -32600,
+ METHOD_NOT_FOUND = -32601,
+ INVALID_PARAMS = -32602,
+ INTERNAL_ERROR = -32603,
+ };
+
+ Dictionary make_response_error(int p_code, const String &p_message, const Variant &p_id = Variant()) const;
+ Dictionary make_response(const Variant &p_value, const Variant &p_id);
+ Dictionary make_notification(const String &p_method, const Variant &p_params);
+ Dictionary make_request(const String &p_method, const Variant &p_params, const Variant &p_id);
+
+ Variant process_action(const Variant &p_action, bool p_process_arr_elements = false);
+ String process_string(const String &p_input);
+
+ void set_scope(const String &p_scope, Object *p_obj);
+};
+
+VARIANT_ENUM_CAST(JSONRPC::ErrorCode);
+
+#endif
diff --git a/modules/jsonrpc/register_types.cpp b/modules/jsonrpc/register_types.cpp
new file mode 100644
index 0000000000..242b0e9df4
--- /dev/null
+++ b/modules/jsonrpc/register_types.cpp
@@ -0,0 +1,40 @@
+/*************************************************************************/
+/* register_types.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "register_types.h"
+#include "core/class_db.h"
+#include "jsonrpc.h"
+
+void register_jsonrpc_types() {
+ ClassDB::register_class<JSONRPC>();
+}
+
+void unregister_jsonrpc_types() {
+}
diff --git a/modules/jsonrpc/register_types.h b/modules/jsonrpc/register_types.h
new file mode 100644
index 0000000000..e4648b901f
--- /dev/null
+++ b/modules/jsonrpc/register_types.h
@@ -0,0 +1,32 @@
+/*************************************************************************/
+/* register_types.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+void register_jsonrpc_types();
+void unregister_jsonrpc_types();
diff --git a/modules/mbedtls/crypto_mbedtls.cpp b/modules/mbedtls/crypto_mbedtls.cpp
new file mode 100644
index 0000000000..1e02084ae2
--- /dev/null
+++ b/modules/mbedtls/crypto_mbedtls.cpp
@@ -0,0 +1,285 @@
+/*************************************************************************/
+/* crypto_mbedtls.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "crypto_mbedtls.h"
+
+#include "core/os/file_access.h"
+
+#include "core/engine.h"
+#include "core/io/certs_compressed.gen.h"
+#include "core/io/compression.h"
+#include "core/project_settings.h"
+
+#ifdef TOOLS_ENABLED
+#include "editor/editor_settings.h"
+#endif
+#define PEM_BEGIN_CRT "-----BEGIN CERTIFICATE-----\n"
+#define PEM_END_CRT "-----END CERTIFICATE-----\n"
+
+#include "mbedtls/pem.h"
+#include <mbedtls/debug.h>
+
+CryptoKey *CryptoKeyMbedTLS::create() {
+ return memnew(CryptoKeyMbedTLS);
+}
+
+Error CryptoKeyMbedTLS::load(String p_path) {
+ ERR_FAIL_COND_V_MSG(locks, ERR_ALREADY_IN_USE, "Key is in use");
+
+ PoolByteArray out;
+ FileAccess *f = FileAccess::open(p_path, FileAccess::READ);
+ ERR_FAIL_COND_V(!f, ERR_INVALID_PARAMETER);
+
+ int flen = f->get_len();
+ out.resize(flen + 1);
+ {
+ PoolByteArray::Write w = out.write();
+ f->get_buffer(w.ptr(), flen);
+ w[flen] = 0; //end f string
+ }
+ memdelete(f);
+
+ int ret = mbedtls_pk_parse_key(&pkey, out.read().ptr(), out.size(), NULL, 0);
+ // We MUST zeroize the memory for safety!
+ mbedtls_platform_zeroize(out.write().ptr(), out.size());
+ ERR_FAIL_COND_V_MSG(ret, FAILED, "Error parsing private key: " + itos(ret));
+
+ return OK;
+}
+
+Error CryptoKeyMbedTLS::save(String p_path) {
+ FileAccess *f = FileAccess::open(p_path, FileAccess::WRITE);
+ ERR_FAIL_COND_V(!f, ERR_INVALID_PARAMETER);
+
+ unsigned char w[16000];
+ memset(w, 0, sizeof(w));
+
+ int ret = mbedtls_pk_write_key_pem(&pkey, w, sizeof(w));
+ if (ret != 0) {
+ memdelete(f);
+ memset(w, 0, sizeof(w)); // Zeroize anything we might have written.
+ ERR_FAIL_V_MSG(FAILED, "Error writing key: " + itos(ret));
+ }
+
+ size_t len = strlen((char *)w);
+ f->store_buffer(w, len);
+ memdelete(f);
+ memset(w, 0, sizeof(w)); // Zeroize temporary buffer.
+ return OK;
+}
+
+X509Certificate *X509CertificateMbedTLS::create() {
+ return memnew(X509CertificateMbedTLS);
+}
+
+Error X509CertificateMbedTLS::load(String p_path) {
+ ERR_FAIL_COND_V_MSG(locks, ERR_ALREADY_IN_USE, "Certificate is in use");
+
+ PoolByteArray out;
+ FileAccess *f = FileAccess::open(p_path, FileAccess::READ);
+ ERR_FAIL_COND_V(!f, ERR_INVALID_PARAMETER);
+
+ int flen = f->get_len();
+ out.resize(flen + 1);
+ {
+ PoolByteArray::Write w = out.write();
+ f->get_buffer(w.ptr(), flen);
+ w[flen] = 0; //end f string
+ }
+ memdelete(f);
+
+ int ret = mbedtls_x509_crt_parse(&cert, out.read().ptr(), out.size());
+ ERR_FAIL_COND_V_MSG(ret, FAILED, "Error parsing some certificates: " + itos(ret));
+
+ return OK;
+}
+
+Error X509CertificateMbedTLS::load_from_memory(const uint8_t *p_buffer, int p_len) {
+ ERR_FAIL_COND_V_MSG(locks, ERR_ALREADY_IN_USE, "Certificate is in use");
+
+ int ret = mbedtls_x509_crt_parse(&cert, p_buffer, p_len);
+ ERR_FAIL_COND_V_MSG(ret, FAILED, "Error parsing certificates: " + itos(ret));
+ return OK;
+}
+
+Error X509CertificateMbedTLS::save(String p_path) {
+ FileAccess *f = FileAccess::open(p_path, FileAccess::WRITE);
+ ERR_FAIL_COND_V(!f, ERR_INVALID_PARAMETER);
+
+ mbedtls_x509_crt *crt = &cert;
+ while (crt) {
+ unsigned char w[4096];
+ size_t wrote = 0;
+ int ret = mbedtls_pem_write_buffer(PEM_BEGIN_CRT, PEM_END_CRT, cert.raw.p, cert.raw.len, w, sizeof(w), &wrote);
+ if (ret != 0 || wrote == 0) {
+ memdelete(f);
+ ERR_FAIL_V_MSG(FAILED, "Error writing certificate: " + itos(ret));
+ }
+
+ f->store_buffer(w, wrote - 1); // don't write the string terminator
+ crt = crt->next;
+ }
+ memdelete(f);
+ return OK;
+}
+
+Crypto *CryptoMbedTLS::create() {
+ return memnew(CryptoMbedTLS);
+}
+
+void CryptoMbedTLS::initialize_crypto() {
+
+#ifdef DEBUG_ENABLED
+ mbedtls_debug_set_threshold(1);
+#endif
+
+ Crypto::_create = create;
+ Crypto::_load_default_certificates = load_default_certificates;
+ X509CertificateMbedTLS::make_default();
+ CryptoKeyMbedTLS::make_default();
+}
+
+void CryptoMbedTLS::finalize_crypto() {
+ Crypto::_create = NULL;
+ Crypto::_load_default_certificates = NULL;
+ if (default_certs) {
+ memdelete(default_certs);
+ default_certs = NULL;
+ }
+ X509CertificateMbedTLS::finalize();
+ CryptoKeyMbedTLS::finalize();
+}
+
+CryptoMbedTLS::CryptoMbedTLS() {
+ mbedtls_ctr_drbg_init(&ctr_drbg);
+ mbedtls_entropy_init(&entropy);
+ int ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0);
+ if (ret != 0) {
+ ERR_PRINTS(" failed\n ! mbedtls_ctr_drbg_seed returned an error" + itos(ret));
+ }
+}
+
+CryptoMbedTLS::~CryptoMbedTLS() {
+ mbedtls_ctr_drbg_free(&ctr_drbg);
+ mbedtls_entropy_free(&entropy);
+}
+
+X509CertificateMbedTLS *CryptoMbedTLS::default_certs = NULL;
+
+X509CertificateMbedTLS *CryptoMbedTLS::get_default_certificates() {
+ return default_certs;
+}
+
+void CryptoMbedTLS::load_default_certificates(String p_path) {
+ ERR_FAIL_COND(default_certs != NULL);
+
+ default_certs = memnew(X509CertificateMbedTLS);
+ ERR_FAIL_COND(default_certs == NULL);
+
+ String certs_path = GLOBAL_DEF("network/ssl/certificates", "");
+
+ if (p_path != "") {
+ // Use certs defined in project settings.
+ default_certs->load(p_path);
+ }
+#ifdef BUILTIN_CERTS_ENABLED
+ else {
+ // Use builtin certs only if user did not override it in project settings.
+ PoolByteArray out;
+ out.resize(_certs_uncompressed_size + 1);
+ PoolByteArray::Write w = out.write();
+ Compression::decompress(w.ptr(), _certs_uncompressed_size, _certs_compressed, _certs_compressed_size, Compression::MODE_DEFLATE);
+ w[_certs_uncompressed_size] = 0; // Make sure it ends with string terminator
+#ifdef DEBUG_ENABLED
+ print_verbose("Loaded builtin certs");
+#endif
+ default_certs->load_from_memory(out.read().ptr(), out.size());
+ }
+#endif
+}
+
+Ref<CryptoKey> CryptoMbedTLS::generate_rsa(int p_bytes) {
+ Ref<CryptoKeyMbedTLS> out;
+ out.instance();
+ int ret = mbedtls_pk_setup(&(out->pkey), mbedtls_pk_info_from_type(MBEDTLS_PK_RSA));
+ ERR_FAIL_COND_V(ret != 0, NULL);
+ ret = mbedtls_rsa_gen_key(mbedtls_pk_rsa(out->pkey), mbedtls_ctr_drbg_random, &ctr_drbg, p_bytes, 65537);
+ ERR_FAIL_COND_V(ret != 0, NULL);
+ return out;
+}
+
+Ref<X509Certificate> CryptoMbedTLS::generate_self_signed_certificate(Ref<CryptoKey> p_key, String p_issuer_name, String p_not_before, String p_not_after) {
+ Ref<CryptoKeyMbedTLS> key = static_cast<Ref<CryptoKeyMbedTLS> >(p_key);
+ mbedtls_x509write_cert crt;
+ mbedtls_x509write_crt_init(&crt);
+
+ mbedtls_x509write_crt_set_subject_key(&crt, &(key->pkey));
+ mbedtls_x509write_crt_set_issuer_key(&crt, &(key->pkey));
+ mbedtls_x509write_crt_set_subject_name(&crt, p_issuer_name.utf8().get_data());
+ mbedtls_x509write_crt_set_issuer_name(&crt, p_issuer_name.utf8().get_data());
+ mbedtls_x509write_crt_set_version(&crt, MBEDTLS_X509_CRT_VERSION_3);
+ mbedtls_x509write_crt_set_md_alg(&crt, MBEDTLS_MD_SHA256);
+
+ mbedtls_mpi serial;
+ mbedtls_mpi_init(&serial);
+ uint8_t rand_serial[20];
+ mbedtls_ctr_drbg_random(&ctr_drbg, rand_serial, 20);
+ ERR_FAIL_COND_V(mbedtls_mpi_read_binary(&serial, rand_serial, 20), NULL);
+ mbedtls_x509write_crt_set_serial(&crt, &serial);
+
+ mbedtls_x509write_crt_set_validity(&crt, p_not_before.utf8().get_data(), p_not_after.utf8().get_data());
+ mbedtls_x509write_crt_set_basic_constraints(&crt, 1, -1);
+ mbedtls_x509write_crt_set_basic_constraints(&crt, 1, 0);
+
+ unsigned char buf[4096];
+ memset(buf, 0, 4096);
+ Ref<X509CertificateMbedTLS> out;
+ out.instance();
+ mbedtls_x509write_crt_pem(&crt, buf, 4096, mbedtls_ctr_drbg_random, &ctr_drbg);
+
+ int err = mbedtls_x509_crt_parse(&(out->cert), buf, 4096);
+ if (err != 0) {
+ mbedtls_mpi_free(&serial);
+ mbedtls_x509write_crt_free(&crt);
+ ERR_PRINTS("Generated invalid certificate: " + itos(err));
+ return NULL;
+ }
+
+ mbedtls_mpi_free(&serial);
+ mbedtls_x509write_crt_free(&crt);
+ return out;
+}
+
+PoolByteArray CryptoMbedTLS::generate_random_bytes(int p_bytes) {
+ PoolByteArray out;
+ out.resize(p_bytes);
+ mbedtls_ctr_drbg_random(&ctr_drbg, out.write().ptr(), p_bytes);
+ return out;
+}
diff --git a/modules/mbedtls/crypto_mbedtls.h b/modules/mbedtls/crypto_mbedtls.h
new file mode 100644
index 0000000000..06b3ecd234
--- /dev/null
+++ b/modules/mbedtls/crypto_mbedtls.h
@@ -0,0 +1,124 @@
+/*************************************************************************/
+/* crypto_mbedtls.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef CRYPTO_MBEDTLS_H
+#define CRYPTO_MBEDTLS_H
+
+#include "core/crypto/crypto.h"
+#include "core/resource.h"
+
+#include <mbedtls/ctr_drbg.h>
+#include <mbedtls/entropy.h>
+#include <mbedtls/ssl.h>
+
+class CryptoMbedTLS;
+class SSLContextMbedTLS;
+class CryptoKeyMbedTLS : public CryptoKey {
+
+private:
+ mbedtls_pk_context pkey;
+ int locks;
+
+public:
+ static CryptoKey *create();
+ static void make_default() { CryptoKey::_create = create; }
+ static void finalize() { CryptoKey::_create = NULL; }
+
+ virtual Error load(String p_path);
+ virtual Error save(String p_path);
+
+ CryptoKeyMbedTLS() {
+ mbedtls_pk_init(&pkey);
+ locks = 0;
+ }
+ ~CryptoKeyMbedTLS() {
+ mbedtls_pk_free(&pkey);
+ }
+
+ _FORCE_INLINE_ void lock() { locks++; }
+ _FORCE_INLINE_ void unlock() { locks--; }
+
+ friend class CryptoMbedTLS;
+ friend class SSLContextMbedTLS;
+};
+
+class X509CertificateMbedTLS : public X509Certificate {
+
+private:
+ mbedtls_x509_crt cert;
+ int locks;
+
+public:
+ static X509Certificate *create();
+ static void make_default() { X509Certificate::_create = create; }
+ static void finalize() { X509Certificate::_create = NULL; }
+
+ virtual Error load(String p_path);
+ virtual Error load_from_memory(const uint8_t *p_buffer, int p_len);
+ virtual Error save(String p_path);
+
+ X509CertificateMbedTLS() {
+ mbedtls_x509_crt_init(&cert);
+ locks = 0;
+ }
+ ~X509CertificateMbedTLS() {
+ mbedtls_x509_crt_free(&cert);
+ }
+
+ _FORCE_INLINE_ void lock() { locks++; }
+ _FORCE_INLINE_ void unlock() { locks--; }
+
+ friend class CryptoMbedTLS;
+ friend class SSLContextMbedTLS;
+};
+
+class CryptoMbedTLS : public Crypto {
+
+private:
+ mbedtls_entropy_context entropy;
+ mbedtls_ctr_drbg_context ctr_drbg;
+ static X509CertificateMbedTLS *default_certs;
+
+public:
+ static Crypto *create();
+ static void initialize_crypto();
+ static void finalize_crypto();
+ static X509CertificateMbedTLS *get_default_certificates();
+ static void load_default_certificates(String p_path);
+
+ virtual PoolByteArray generate_random_bytes(int p_bytes);
+ virtual Ref<CryptoKey> generate_rsa(int p_bytes);
+ virtual Ref<X509Certificate> generate_self_signed_certificate(Ref<CryptoKey> p_key, String p_issuer_name, String p_not_before, String p_not_after);
+
+ CryptoMbedTLS();
+ ~CryptoMbedTLS();
+};
+
+#endif // CRYPTO_MBEDTLS_H
diff --git a/modules/mbedtls/register_types.cpp b/modules/mbedtls/register_types.cpp
index 121ed5eb02..f7dc6c785f 100755
--- a/modules/mbedtls/register_types.cpp
+++ b/modules/mbedtls/register_types.cpp
@@ -30,15 +30,17 @@
#include "register_types.h"
-#include "stream_peer_mbed_tls.h"
+#include "crypto_mbedtls.h"
+#include "stream_peer_mbedtls.h"
void register_mbedtls_types() {
- ClassDB::register_class<StreamPeerMbedTLS>();
+ CryptoMbedTLS::initialize_crypto();
StreamPeerMbedTLS::initialize_ssl();
}
void unregister_mbedtls_types() {
StreamPeerMbedTLS::finalize_ssl();
+ CryptoMbedTLS::finalize_crypto();
}
diff --git a/modules/mbedtls/ssl_context_mbedtls.cpp b/modules/mbedtls/ssl_context_mbedtls.cpp
new file mode 100644
index 0000000000..eeaf831b4a
--- /dev/null
+++ b/modules/mbedtls/ssl_context_mbedtls.cpp
@@ -0,0 +1,151 @@
+/*************************************************************************/
+/* ssl_context_mbedtls.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "ssl_context_mbedtls.h"
+
+static void my_debug(void *ctx, int level,
+ const char *file, int line,
+ const char *str) {
+
+ printf("%s:%04d: %s", file, line, str);
+ fflush(stdout);
+}
+
+Error SSLContextMbedTLS::_setup(int p_endpoint, int p_transport, int p_authmode) {
+ ERR_FAIL_COND_V_MSG(inited, ERR_ALREADY_IN_USE, "This SSL context is already active");
+
+ mbedtls_ssl_init(&ssl);
+ mbedtls_ssl_config_init(&conf);
+ mbedtls_ctr_drbg_init(&ctr_drbg);
+ mbedtls_entropy_init(&entropy);
+ inited = true;
+
+ int ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0);
+ if (ret != 0) {
+ clear(); // Never leave unusable resources around.
+ ERR_FAIL_V_MSG(FAILED, "mbedtls_ctr_drbg_seed returned an error" + itos(ret));
+ }
+
+ ret = mbedtls_ssl_config_defaults(&conf, p_endpoint, p_transport, MBEDTLS_SSL_PRESET_DEFAULT);
+ if (ret != 0) {
+ clear();
+ ERR_FAIL_V_MSG(FAILED, "mbedtls_ssl_config_defaults returned an error" + itos(ret));
+ }
+ mbedtls_ssl_conf_authmode(&conf, p_authmode);
+ mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);
+ mbedtls_ssl_conf_dbg(&conf, my_debug, stdout);
+ return OK;
+}
+
+Error SSLContextMbedTLS::init_server(int p_transport, int p_authmode, Ref<CryptoKeyMbedTLS> p_pkey, Ref<X509CertificateMbedTLS> p_cert) {
+ ERR_FAIL_COND_V(!p_pkey.is_valid(), ERR_INVALID_PARAMETER);
+ ERR_FAIL_COND_V(!p_cert.is_valid(), ERR_INVALID_PARAMETER);
+
+ Error err = _setup(MBEDTLS_SSL_IS_SERVER, p_transport, p_authmode);
+ ERR_FAIL_COND_V(err != OK, err);
+
+ // Locking key and certificate(s)
+ pkey = p_pkey;
+ certs = p_cert;
+ if (pkey.is_valid())
+ pkey->lock();
+ if (certs.is_valid())
+ certs->lock();
+
+ // Adding key and certificate
+ int ret = mbedtls_ssl_conf_own_cert(&conf, &(certs->cert), &(pkey->pkey));
+ if (ret != 0) {
+ clear();
+ ERR_FAIL_V_MSG(ERR_INVALID_PARAMETER, "Invalid cert/key combination " + itos(ret));
+ }
+ // Adding CA chain if available.
+ if (certs->cert.next) {
+ mbedtls_ssl_conf_ca_chain(&conf, certs->cert.next, NULL);
+ }
+ mbedtls_ssl_setup(&ssl, &conf);
+ return OK;
+}
+
+Error SSLContextMbedTLS::init_client(int p_transport, int p_authmode, Ref<X509CertificateMbedTLS> p_valid_cas) {
+ Error err = _setup(MBEDTLS_SSL_IS_CLIENT, p_transport, p_authmode);
+ ERR_FAIL_COND_V(err != OK, err);
+
+ X509CertificateMbedTLS *cas = NULL;
+
+ if (p_valid_cas.is_valid()) {
+ // Locking CA certificates
+ certs = p_valid_cas;
+ certs->lock();
+ cas = certs.ptr();
+ } else {
+ // Fall back to default certificates (no need to lock those).
+ cas = CryptoMbedTLS::get_default_certificates();
+ if (cas == NULL) {
+ clear();
+ ERR_FAIL_V_MSG(ERR_UNCONFIGURED, "SSL module failed to initialize!");
+ }
+ }
+
+ // Set valid CAs
+ mbedtls_ssl_conf_ca_chain(&conf, &(cas->cert), NULL);
+ mbedtls_ssl_setup(&ssl, &conf);
+ return OK;
+}
+
+void SSLContextMbedTLS::clear() {
+ if (!inited)
+ return;
+ mbedtls_ssl_free(&ssl);
+ mbedtls_ssl_config_free(&conf);
+ mbedtls_ctr_drbg_free(&ctr_drbg);
+ mbedtls_entropy_free(&entropy);
+
+ // Unlock and key and certificates
+ if (certs.is_valid())
+ certs->unlock();
+ certs = Ref<X509Certificate>();
+ if (pkey.is_valid())
+ pkey->unlock();
+ pkey = Ref<CryptoKeyMbedTLS>();
+ inited = false;
+}
+
+mbedtls_ssl_context *SSLContextMbedTLS::get_context() {
+ ERR_FAIL_COND_V(!inited, NULL);
+ return &ssl;
+}
+
+SSLContextMbedTLS::SSLContextMbedTLS() {
+ inited = false;
+}
+
+SSLContextMbedTLS::~SSLContextMbedTLS() {
+ clear();
+}
diff --git a/modules/mbedtls/ssl_context_mbedtls.h b/modules/mbedtls/ssl_context_mbedtls.h
new file mode 100644
index 0000000000..e49d532912
--- /dev/null
+++ b/modules/mbedtls/ssl_context_mbedtls.h
@@ -0,0 +1,73 @@
+/*************************************************************************/
+/* ssl_context_mbedtls.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef SSL_CONTEXT_MBED_TLS_H
+#define SSL_CONTEXT_MBED_TLS_H
+
+#include "crypto_mbedtls.h"
+
+#include "core/os/file_access.h"
+#include "core/pool_vector.h"
+#include "core/reference.h"
+
+#include <mbedtls/config.h>
+#include <mbedtls/ctr_drbg.h>
+#include <mbedtls/debug.h>
+#include <mbedtls/entropy.h>
+#include <mbedtls/ssl.h>
+
+class SSLContextMbedTLS : public Reference {
+
+protected:
+ bool inited;
+
+ static PoolByteArray _read_file(String p_path);
+
+public:
+ Ref<X509CertificateMbedTLS> certs;
+ mbedtls_entropy_context entropy;
+ mbedtls_ctr_drbg_context ctr_drbg;
+ mbedtls_ssl_context ssl;
+ mbedtls_ssl_config conf;
+
+ Ref<CryptoKeyMbedTLS> pkey;
+
+ Error _setup(int p_endpoint, int p_transport, int p_authmode);
+ Error init_server(int p_transport, int p_authmode, Ref<CryptoKeyMbedTLS> p_pkey, Ref<X509CertificateMbedTLS> p_cert);
+ Error init_client(int p_transport, int p_authmode, Ref<X509CertificateMbedTLS> p_valid_cas);
+ void clear();
+
+ mbedtls_ssl_context *get_context();
+
+ SSLContextMbedTLS();
+ ~SSLContextMbedTLS();
+};
+
+#endif // SSL_CONTEXT_MBED_TLS_H
diff --git a/modules/mbedtls/stream_peer_mbed_tls.cpp b/modules/mbedtls/stream_peer_mbedtls.cpp
index 4bb7557150..a2e342e219 100755
--- a/modules/mbedtls/stream_peer_mbed_tls.cpp
+++ b/modules/mbedtls/stream_peer_mbedtls.cpp
@@ -1,5 +1,5 @@
/*************************************************************************/
-/* stream_peer_mbed_tls.cpp */
+/* stream_peer_mbedtls.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
@@ -28,19 +28,11 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#include "stream_peer_mbed_tls.h"
+#include "stream_peer_mbedtls.h"
#include "core/io/stream_peer_tcp.h"
#include "core/os/file_access.h"
-static void my_debug(void *ctx, int level,
- const char *file, int line,
- const char *str) {
-
- printf("%s:%04d: %s", file, line, str);
- fflush(stdout);
-}
-
void _print_error(int ret) {
printf("mbedtls error: returned -0x%x\n\n", -ret);
fflush(stdout);
@@ -86,18 +78,14 @@ int StreamPeerMbedTLS::bio_recv(void *ctx, unsigned char *buf, size_t len) {
void StreamPeerMbedTLS::_cleanup() {
- mbedtls_ssl_free(&ssl);
- mbedtls_ssl_config_free(&conf);
- mbedtls_ctr_drbg_free(&ctr_drbg);
- mbedtls_entropy_free(&entropy);
-
+ ssl_ctx->clear();
base = Ref<StreamPeer>();
status = STATUS_DISCONNECTED;
}
Error StreamPeerMbedTLS::_do_handshake() {
int ret = 0;
- while ((ret = mbedtls_ssl_handshake(&ssl)) != 0) {
+ while ((ret = mbedtls_ssl_handshake(ssl_ctx->get_context())) != 0) {
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
// An error occurred.
ERR_PRINTS("TLS handshake error: " + itos(ret));
@@ -118,7 +106,7 @@ Error StreamPeerMbedTLS::_do_handshake() {
return OK;
}
-Error StreamPeerMbedTLS::connect_to_stream(Ref<StreamPeer> p_base, bool p_validate_certs, const String &p_for_hostname) {
+Error StreamPeerMbedTLS::connect_to_stream(Ref<StreamPeer> p_base, bool p_validate_certs, const String &p_for_hostname, Ref<X509Certificate> p_ca_certs) {
ERR_FAIL_COND_V(p_base.is_null(), ERR_INVALID_PARAMETER);
@@ -126,31 +114,11 @@ Error StreamPeerMbedTLS::connect_to_stream(Ref<StreamPeer> p_base, bool p_valida
int ret = 0;
int authmode = p_validate_certs ? MBEDTLS_SSL_VERIFY_REQUIRED : MBEDTLS_SSL_VERIFY_NONE;
- mbedtls_ssl_init(&ssl);
- mbedtls_ssl_config_init(&conf);
- mbedtls_ctr_drbg_init(&ctr_drbg);
- mbedtls_entropy_init(&entropy);
-
- ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0);
- if (ret != 0) {
- ERR_PRINTS(" failed\n ! mbedtls_ctr_drbg_seed returned an error" + itos(ret));
- _cleanup();
- return FAILED;
- }
+ Error err = ssl_ctx->init_client(MBEDTLS_SSL_TRANSPORT_STREAM, authmode, p_ca_certs);
+ ERR_FAIL_COND_V(err != OK, err);
- mbedtls_ssl_config_defaults(&conf,
- MBEDTLS_SSL_IS_CLIENT,
- MBEDTLS_SSL_TRANSPORT_STREAM,
- MBEDTLS_SSL_PRESET_DEFAULT);
-
- mbedtls_ssl_conf_authmode(&conf, authmode);
- mbedtls_ssl_conf_ca_chain(&conf, &cacert, NULL);
- mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);
- mbedtls_ssl_conf_dbg(&conf, my_debug, stdout);
- mbedtls_ssl_setup(&ssl, &conf);
- mbedtls_ssl_set_hostname(&ssl, p_for_hostname.utf8().get_data());
-
- mbedtls_ssl_set_bio(&ssl, this, bio_send, bio_recv, NULL);
+ mbedtls_ssl_set_hostname(ssl_ctx->get_context(), p_for_hostname.utf8().get_data());
+ mbedtls_ssl_set_bio(ssl_ctx->get_context(), this, bio_send, bio_recv, NULL);
status = STATUS_HANDSHAKING;
@@ -162,11 +130,26 @@ Error StreamPeerMbedTLS::connect_to_stream(Ref<StreamPeer> p_base, bool p_valida
return OK;
}
-Error StreamPeerMbedTLS::accept_stream(Ref<StreamPeer> p_base) {
+Error StreamPeerMbedTLS::accept_stream(Ref<StreamPeer> p_base, Ref<CryptoKey> p_key, Ref<X509Certificate> p_cert, Ref<X509Certificate> p_ca_chain) {
+
+ ERR_FAIL_COND_V(p_base.is_null(), ERR_INVALID_PARAMETER);
+
+ Error err = ssl_ctx->init_server(MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_VERIFY_NONE, p_key, p_cert);
+ ERR_FAIL_COND_V(err != OK, err);
+
+ base = p_base;
+
+ mbedtls_ssl_set_bio(ssl_ctx->get_context(), this, bio_send, bio_recv, NULL);
+
+ status = STATUS_HANDSHAKING;
+
+ if ((err = _do_handshake()) != OK) {
+ return FAILED;
+ }
+ status = STATUS_CONNECTED;
return OK;
}
-
Error StreamPeerMbedTLS::put_data(const uint8_t *p_data, int p_bytes) {
ERR_FAIL_COND_V(status != STATUS_CONNECTED, ERR_UNCONFIGURED);
@@ -197,7 +180,7 @@ Error StreamPeerMbedTLS::put_partial_data(const uint8_t *p_data, int p_bytes, in
if (p_bytes == 0)
return OK;
- int ret = mbedtls_ssl_write(&ssl, p_data, p_bytes);
+ int ret = mbedtls_ssl_write(ssl_ctx->get_context(), p_data, p_bytes);
if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) {
// Non blocking IO
ret = 0;
@@ -243,7 +226,7 @@ Error StreamPeerMbedTLS::get_partial_data(uint8_t *p_buffer, int p_bytes, int &r
r_received = 0;
- int ret = mbedtls_ssl_read(&ssl, p_buffer, p_bytes);
+ int ret = mbedtls_ssl_read(ssl_ctx->get_context(), p_buffer, p_bytes);
if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) {
ret = 0; // non blocking io
} else if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) {
@@ -273,7 +256,7 @@ void StreamPeerMbedTLS::poll() {
// We could pass NULL as second parameter, but some behaviour sanitizers doesn't seem to like that.
// Passing a 1 byte buffer to workaround it.
uint8_t byte;
- int ret = mbedtls_ssl_read(&ssl, &byte, 0);
+ int ret = mbedtls_ssl_read(ssl_ctx->get_context(), &byte, 0);
if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) {
// Nothing to read/write (non blocking IO)
@@ -298,10 +281,11 @@ int StreamPeerMbedTLS::get_available_bytes() const {
ERR_FAIL_COND_V(status != STATUS_CONNECTED, 0);
- return mbedtls_ssl_get_bytes_avail(&ssl);
+ return mbedtls_ssl_get_bytes_avail(&(ssl_ctx->ssl));
}
StreamPeerMbedTLS::StreamPeerMbedTLS() {
+ ssl_ctx.instance();
status = STATUS_DISCONNECTED;
}
@@ -317,7 +301,7 @@ void StreamPeerMbedTLS::disconnect_from_stream() {
Ref<StreamPeerTCP> tcp = base;
if (tcp.is_valid() && tcp->get_status() == StreamPeerTCP::STATUS_CONNECTED) {
// We are still connected on the socket, try to send close notify.
- mbedtls_ssl_close_notify(&ssl);
+ mbedtls_ssl_close_notify(ssl_ctx->get_context());
}
_cleanup();
@@ -333,28 +317,9 @@ StreamPeerSSL *StreamPeerMbedTLS::_create_func() {
return memnew(StreamPeerMbedTLS);
}
-mbedtls_x509_crt StreamPeerMbedTLS::cacert;
-
-void StreamPeerMbedTLS::_load_certs(const PoolByteArray &p_array) {
- int arr_len = p_array.size();
- PoolByteArray::Read r = p_array.read();
- int err = mbedtls_x509_crt_parse(&cacert, &r[0], arr_len);
- if (err != 0) {
- WARN_PRINTS("Error parsing some certificates: " + itos(err));
- }
-}
-
void StreamPeerMbedTLS::initialize_ssl() {
_create = _create_func;
- load_certs_func = _load_certs;
-
- mbedtls_x509_crt_init(&cacert);
-
-#ifdef DEBUG_ENABLED
- mbedtls_debug_set_threshold(1);
-#endif
-
available = true;
}
@@ -362,6 +327,4 @@ void StreamPeerMbedTLS::finalize_ssl() {
available = false;
_create = NULL;
- load_certs_func = NULL;
- mbedtls_x509_crt_free(&cacert);
}
diff --git a/modules/mbedtls/stream_peer_mbed_tls.h b/modules/mbedtls/stream_peer_mbedtls.h
index ab87b779c1..eec7eab631 100755
--- a/modules/mbedtls/stream_peer_mbed_tls.h
+++ b/modules/mbedtls/stream_peer_mbedtls.h
@@ -1,5 +1,5 @@
/*************************************************************************/
-/* stream_peer_mbed_tls.h */
+/* stream_peer_mbedtls.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
@@ -32,15 +32,7 @@
#define STREAM_PEER_OPEN_SSL_H
#include "core/io/stream_peer_ssl.h"
-
-#include <mbedtls/config.h>
-#include <mbedtls/ctr_drbg.h>
-#include <mbedtls/debug.h>
-#include <mbedtls/entropy.h>
-#include <mbedtls/ssl.h>
-
-#include <stdio.h>
-#include <stdlib.h>
+#include "ssl_context_mbedtls.h"
class StreamPeerMbedTLS : public StreamPeerSSL {
private:
@@ -50,19 +42,13 @@ private:
Ref<StreamPeer> base;
static StreamPeerSSL *_create_func();
- static void _load_certs(const PoolByteArray &p_array);
static int bio_recv(void *ctx, unsigned char *buf, size_t len);
static int bio_send(void *ctx, const unsigned char *buf, size_t len);
void _cleanup();
protected:
- static mbedtls_x509_crt cacert;
-
- mbedtls_entropy_context entropy;
- mbedtls_ctr_drbg_context ctr_drbg;
- mbedtls_ssl_context ssl;
- mbedtls_ssl_config conf;
+ Ref<SSLContextMbedTLS> ssl_ctx;
static void _bind_methods();
@@ -70,8 +56,8 @@ protected:
public:
virtual void poll();
- virtual Error accept_stream(Ref<StreamPeer> p_base);
- virtual Error connect_to_stream(Ref<StreamPeer> p_base, bool p_validate_certs = false, const String &p_for_hostname = String());
+ virtual Error accept_stream(Ref<StreamPeer> p_base, Ref<CryptoKey> p_key, Ref<X509Certificate> p_cert, Ref<X509Certificate> p_ca_chain = Ref<X509Certificate>());
+ virtual Error connect_to_stream(Ref<StreamPeer> p_base, bool p_validate_certs = false, const String &p_for_hostname = String(), Ref<X509Certificate> p_valid_cert = Ref<X509Certificate>());
virtual Status get_status() const;
virtual void disconnect_from_stream();
diff --git a/modules/mono/SCsub b/modules/mono/SCsub
index cc60e64a11..a9afa7ccf6 100644
--- a/modules/mono/SCsub
+++ b/modules/mono/SCsub
@@ -8,13 +8,7 @@ Import('env_modules')
env_mono = env_modules.Clone()
-env_mono.add_source_files(env.modules_sources, '*.cpp')
-env_mono.add_source_files(env.modules_sources, 'glue/*.cpp')
-env_mono.add_source_files(env.modules_sources, 'mono_gd/*.cpp')
-env_mono.add_source_files(env.modules_sources, 'utils/*.cpp')
-
if env['tools']:
- env_mono.add_source_files(env.modules_sources, 'editor/*.cpp')
# NOTE: It is safe to generate this file here, since this is still executed serially
import build_scripts.make_cs_compressed_header as make_cs_compressed_header
make_cs_compressed_header.generate_header(
@@ -62,3 +56,13 @@ if env_mono['tools']:
# GodotTools.ProjectEditor which doesn't depend on the Godot API solution and
# is required by the bindings generator in order to be able to generated it.
godot_tools_build.build_project_editor_only(env_mono)
+
+# Add sources
+
+env_mono.add_source_files(env.modules_sources, '*.cpp')
+env_mono.add_source_files(env.modules_sources, 'glue/*.cpp')
+env_mono.add_source_files(env.modules_sources, 'mono_gd/*.cpp')
+env_mono.add_source_files(env.modules_sources, 'utils/*.cpp')
+
+if env['tools']:
+ env_mono.add_source_files(env.modules_sources, 'editor/*.cpp')
diff --git a/modules/mono/build_scripts/godot_tools_build.py b/modules/mono/build_scripts/godot_tools_build.py
index c47cfc8a38..35daa6d307 100644
--- a/modules/mono/build_scripts/godot_tools_build.py
+++ b/modules/mono/build_scripts/godot_tools_build.py
@@ -84,10 +84,16 @@ def build(env_mono):
source_filenames = ['GodotSharp.dll', 'GodotSharpEditor.dll']
sources = [os.path.join(editor_api_dir, filename) for filename in source_filenames]
- target_filenames = ['GodotTools.dll', 'GodotTools.BuildLogger.dll', 'GodotTools.ProjectEditor.dll', 'DotNet.Glob.dll', 'GodotTools.Core.dll']
+ target_filenames = [
+ 'GodotTools.dll', 'GodotTools.IdeConnection.dll', 'GodotTools.BuildLogger.dll',
+ 'GodotTools.ProjectEditor.dll', 'DotNet.Glob.dll', 'GodotTools.Core.dll'
+ ]
if env_mono['target'] == 'debug':
- target_filenames += ['GodotTools.pdb', 'GodotTools.BuildLogger.pdb', 'GodotTools.ProjectEditor.pdb', 'GodotTools.Core.pdb']
+ target_filenames += [
+ 'GodotTools.pdb', 'GodotTools.IdeConnection.pdb', 'GodotTools.BuildLogger.pdb',
+ 'GodotTools.ProjectEditor.pdb', 'GodotTools.Core.pdb'
+ ]
targets = [os.path.join(editor_tools_dir, filename) for filename in target_filenames]
diff --git a/modules/mono/build_scripts/make_android_mono_config.py b/modules/mono/build_scripts/make_android_mono_config.py
index cd9210897d..8cad204d7b 100644
--- a/modules/mono/build_scripts/make_android_mono_config.py
+++ b/modules/mono/build_scripts/make_android_mono_config.py
@@ -3,23 +3,6 @@ def generate_compressed_config(config_src, output_dir):
import os.path
from compat import byte_to_str
- # Header file
- with open(os.path.join(output_dir, 'android_mono_config.gen.h'), 'w') as header:
- header.write('''/* THIS FILE IS GENERATED DO NOT EDIT */
-#ifndef ANDROID_MONO_CONFIG_GEN_H
-#define ANDROID_MONO_CONFIG_GEN_H
-
-#ifdef ANDROID_ENABLED
-
-#include "core/ustring.h"
-
-String get_godot_android_mono_config();
-
-#endif // ANDROID_ENABLED
-
-#endif // ANDROID_MONO_CONFIG_GEN_H
-''')
-
# Source file
with open(os.path.join(output_dir, 'android_mono_config.gen.cpp'), 'w') as cpp:
with open(config_src, 'rb') as f:
@@ -36,7 +19,7 @@ String get_godot_android_mono_config();
bytes_seq_str += byte_to_str(buf[buf_idx])
cpp.write('''/* THIS FILE IS GENERATED DO NOT EDIT */
-#include "android_mono_config.gen.h"
+#include "android_mono_config.h"
#ifdef ANDROID_ENABLED
diff --git a/modules/mono/build_scripts/mono_configure.py b/modules/mono/build_scripts/mono_configure.py
index 9f0eb58896..f751719531 100644
--- a/modules/mono/build_scripts/mono_configure.py
+++ b/modules/mono/build_scripts/mono_configure.py
@@ -113,8 +113,8 @@ def configure(env, env_mono):
else:
env.Append(LINKFLAGS=os.path.join(mono_lib_path, mono_static_lib_name + lib_suffix))
- env.Append(LIBS='psapi')
- env.Append(LIBS='version')
+ env.Append(LIBS=['psapi'])
+ env.Append(LIBS=['version'])
else:
mono_lib_name = find_file_in_dir(mono_lib_path, mono_lib_names, extension='.lib')
@@ -124,7 +124,7 @@ def configure(env, env_mono):
if env.msvc:
env.Append(LINKFLAGS=mono_lib_name + Environment()['LIBSUFFIX'])
else:
- env.Append(LIBS=mono_lib_name)
+ env.Append(LIBS=[mono_lib_name])
mono_bin_path = os.path.join(mono_root, 'bin')
diff --git a/modules/mono/class_db_api_json.cpp b/modules/mono/class_db_api_json.cpp
index 4a6637434a..7580911a0a 100644
--- a/modules/mono/class_db_api_json.cpp
+++ b/modules/mono/class_db_api_json.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/class_db_api_json.h b/modules/mono/class_db_api_json.h
index ddfe2debea..9888ecfb55 100644
--- a/modules/mono/class_db_api_json.h
+++ b/modules/mono/class_db_api_json.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp
index 8c17bac3c9..4c9dd9c1a9 100644
--- a/modules/mono/csharp_script.cpp
+++ b/modules/mono/csharp_script.cpp
@@ -2661,7 +2661,7 @@ void CSharpScript::_get_property_list(List<PropertyInfo> *p_properties) const {
void CSharpScript::_bind_methods() {
- ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "new", &CSharpScript::_new, MethodInfo(Variant::OBJECT, "new"));
+ ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "new", &CSharpScript::_new, MethodInfo("new"));
}
Ref<CSharpScript> CSharpScript::create_for_managed_type(GDMonoClass *p_class, GDMonoClass *p_native) {
diff --git a/modules/mono/editor/GodotTools/GodotTools.BuildLogger/GodotTools.BuildLogger.csproj b/modules/mono/editor/GodotTools/GodotTools.BuildLogger/GodotTools.BuildLogger.csproj
index f3ac353c0f..dcfdd83831 100644
--- a/modules/mono/editor/GodotTools/GodotTools.BuildLogger/GodotTools.BuildLogger.csproj
+++ b/modules/mono/editor/GodotTools/GodotTools.BuildLogger/GodotTools.BuildLogger.csproj
@@ -11,6 +11,7 @@
<AssemblyName>GodotTools.BuildLogger</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
+ <LangVersion>7</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
diff --git a/modules/mono/editor/GodotTools/GodotTools.Core/GodotTools.Core.csproj b/modules/mono/editor/GodotTools/GodotTools.Core/GodotTools.Core.csproj
index f36b40f87c..24c7cb1573 100644
--- a/modules/mono/editor/GodotTools/GodotTools.Core/GodotTools.Core.csproj
+++ b/modules/mono/editor/GodotTools/GodotTools.Core/GodotTools.Core.csproj
@@ -8,6 +8,7 @@
<RootNamespace>GodotTools.Core</RootNamespace>
<AssemblyName>GodotTools.Core</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <LangVersion>7</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeConnection/ConsoleLogger.cs b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/ConsoleLogger.cs
new file mode 100644
index 0000000000..7a2ff2ca56
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/ConsoleLogger.cs
@@ -0,0 +1,33 @@
+using System;
+
+namespace GodotTools.IdeConnection
+{
+ public class ConsoleLogger : ILogger
+ {
+ public void LogDebug(string message)
+ {
+ Console.WriteLine("DEBUG: " + message);
+ }
+
+ public void LogInfo(string message)
+ {
+ Console.WriteLine("INFO: " + message);
+ }
+
+ public void LogWarning(string message)
+ {
+ Console.WriteLine("WARN: " + message);
+ }
+
+ public void LogError(string message)
+ {
+ Console.WriteLine("ERROR: " + message);
+ }
+
+ public void LogError(string message, Exception e)
+ {
+ Console.WriteLine("EXCEPTION: " + message);
+ Console.WriteLine(e);
+ }
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeBase.cs b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeBase.cs
new file mode 100644
index 0000000000..be89638241
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeBase.cs
@@ -0,0 +1,94 @@
+using System;
+using Path = System.IO.Path;
+
+namespace GodotTools.IdeConnection
+{
+ public class GodotIdeBase : IDisposable
+ {
+ private ILogger logger;
+
+ public ILogger Logger
+ {
+ get => logger ?? (logger = new ConsoleLogger());
+ set => logger = value;
+ }
+
+ private readonly string projectMetadataDir;
+
+ protected const string MetaFileName = "ide_server_meta.txt";
+ protected string MetaFilePath => Path.Combine(projectMetadataDir, MetaFileName);
+
+ private GodotIdeConnection connection;
+ protected readonly object ConnectionLock = new object();
+
+ public bool IsDisposed { get; private set; } = false;
+
+ public bool IsConnected => connection != null && !connection.IsDisposed && connection.IsConnected;
+
+ public event Action Connected
+ {
+ add
+ {
+ if (connection != null && !connection.IsDisposed)
+ connection.Connected += value;
+ }
+ remove
+ {
+ if (connection != null && !connection.IsDisposed)
+ connection.Connected -= value;
+ }
+ }
+
+ protected GodotIdeConnection Connection
+ {
+ get => connection;
+ set
+ {
+ connection?.Dispose();
+ connection = value;
+ }
+ }
+
+ protected GodotIdeBase(string projectMetadataDir)
+ {
+ this.projectMetadataDir = projectMetadataDir;
+ }
+
+ protected void DisposeConnection()
+ {
+ lock (ConnectionLock)
+ {
+ connection?.Dispose();
+ }
+ }
+
+ ~GodotIdeBase()
+ {
+ Dispose(disposing: false);
+ }
+
+ public void Dispose()
+ {
+ if (IsDisposed)
+ return;
+
+ lock (ConnectionLock)
+ {
+ if (IsDisposed) // lock may not be fair
+ return;
+ IsDisposed = true;
+ }
+
+ Dispose(disposing: true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ connection?.Dispose();
+ }
+ }
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeClient.cs b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeClient.cs
new file mode 100644
index 0000000000..4f56a8d71b
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeClient.cs
@@ -0,0 +1,219 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using System.Net.Sockets;
+using System.Threading;
+
+namespace GodotTools.IdeConnection
+{
+ public abstract class GodotIdeClient : GodotIdeBase
+ {
+ protected GodotIdeMetadata GodotIdeMetadata;
+
+ private readonly FileSystemWatcher fsWatcher;
+
+ protected GodotIdeClient(string projectMetadataDir) : base(projectMetadataDir)
+ {
+ messageHandlers = InitializeMessageHandlers();
+
+ // FileSystemWatcher requires an existing directory
+ if (!File.Exists(projectMetadataDir))
+ Directory.CreateDirectory(projectMetadataDir);
+
+ fsWatcher = new FileSystemWatcher(projectMetadataDir, MetaFileName);
+ }
+
+ private void OnMetaFileChanged(object sender, FileSystemEventArgs e)
+ {
+ if (IsDisposed)
+ return;
+
+ lock (ConnectionLock)
+ {
+ if (IsDisposed)
+ return;
+
+ if (!File.Exists(MetaFilePath))
+ return;
+
+ var metadata = ReadMetadataFile();
+
+ if (metadata != null && metadata != GodotIdeMetadata)
+ {
+ GodotIdeMetadata = metadata.Value;
+ ConnectToServer();
+ }
+ }
+ }
+
+ private void OnMetaFileDeleted(object sender, FileSystemEventArgs e)
+ {
+ if (IsDisposed)
+ return;
+
+ if (IsConnected)
+ DisposeConnection();
+
+ // The file may have been re-created
+
+ lock (ConnectionLock)
+ {
+ if (IsDisposed)
+ return;
+
+ if (IsConnected || !File.Exists(MetaFilePath))
+ return;
+
+ var metadata = ReadMetadataFile();
+
+ if (metadata != null)
+ {
+ GodotIdeMetadata = metadata.Value;
+ ConnectToServer();
+ }
+ }
+ }
+
+ private GodotIdeMetadata? ReadMetadataFile()
+ {
+ using (var reader = File.OpenText(MetaFilePath))
+ {
+ string portStr = reader.ReadLine();
+
+ if (portStr == null)
+ return null;
+
+ string editorExecutablePath = reader.ReadLine();
+
+ if (editorExecutablePath == null)
+ return null;
+
+ if (!int.TryParse(portStr, out int port))
+ return null;
+
+ return new GodotIdeMetadata(port, editorExecutablePath);
+ }
+ }
+
+ private void ConnectToServer()
+ {
+ var tcpClient = new TcpClient();
+
+ Connection = new GodotIdeConnectionClient(tcpClient, HandleMessage);
+ Connection.Logger = Logger;
+
+ try
+ {
+ Logger.LogInfo("Connecting to Godot Ide Server");
+
+ tcpClient.Connect(IPAddress.Loopback, GodotIdeMetadata.Port);
+
+ Logger.LogInfo("Connection open with Godot Ide Server");
+
+ var clientThread = new Thread(Connection.Start)
+ {
+ IsBackground = true,
+ Name = "Godot Ide Connection Client"
+ };
+ clientThread.Start();
+ }
+ catch (SocketException e)
+ {
+ if (e.SocketErrorCode == SocketError.ConnectionRefused)
+ Logger.LogError("The connection to the Godot Ide Server was refused");
+ else
+ throw;
+ }
+ }
+
+ public void Start()
+ {
+ Logger.LogInfo("Starting Godot Ide Client");
+
+ fsWatcher.Changed += OnMetaFileChanged;
+ fsWatcher.Deleted += OnMetaFileDeleted;
+ fsWatcher.EnableRaisingEvents = true;
+
+ lock (ConnectionLock)
+ {
+ if (IsDisposed)
+ return;
+
+ if (!File.Exists(MetaFilePath))
+ {
+ Logger.LogInfo("There is no Godot Ide Server running");
+ return;
+ }
+
+ var metadata = ReadMetadataFile();
+
+ if (metadata != null)
+ {
+ GodotIdeMetadata = metadata.Value;
+ ConnectToServer();
+ }
+ else
+ {
+ Logger.LogError("Failed to read Godot Ide metadata file");
+ }
+ }
+ }
+
+ public bool WriteMessage(Message message)
+ {
+ return Connection.WriteMessage(message);
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ base.Dispose(disposing);
+
+ if (disposing)
+ {
+ fsWatcher?.Dispose();
+ }
+ }
+
+ protected virtual bool HandleMessage(Message message)
+ {
+ if (messageHandlers.TryGetValue(message.Id, out var action))
+ {
+ action(message.Arguments);
+ return true;
+ }
+
+ return false;
+ }
+
+ private readonly Dictionary<string, Action<string[]>> messageHandlers;
+
+ private Dictionary<string, Action<string[]>> InitializeMessageHandlers()
+ {
+ return new Dictionary<string, Action<string[]>>
+ {
+ ["OpenFile"] = args =>
+ {
+ switch (args.Length)
+ {
+ case 1:
+ OpenFile(file: args[0]);
+ return;
+ case 2:
+ OpenFile(file: args[0], line: int.Parse(args[1]));
+ return;
+ case 3:
+ OpenFile(file: args[0], line: int.Parse(args[1]), column: int.Parse(args[2]));
+ return;
+ default:
+ throw new ArgumentException();
+ }
+ }
+ };
+ }
+
+ protected abstract void OpenFile(string file);
+ protected abstract void OpenFile(string file, int line);
+ protected abstract void OpenFile(string file, int line, int column);
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeConnection.cs b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeConnection.cs
new file mode 100644
index 0000000000..e7e81f175e
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeConnection.cs
@@ -0,0 +1,207 @@
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Net.Sockets;
+using System.Text;
+
+namespace GodotTools.IdeConnection
+{
+ public abstract class GodotIdeConnection : IDisposable
+ {
+ protected const string Version = "1.0";
+
+ protected static readonly string ClientHandshake = $"Godot Ide Client Version {Version}";
+ protected static readonly string ServerHandshake = $"Godot Ide Server Version {Version}";
+
+ private const int ClientWriteTimeout = 8000;
+ private readonly TcpClient tcpClient;
+
+ private TextReader clientReader;
+ private TextWriter clientWriter;
+
+ private readonly object writeLock = new object();
+
+ private readonly Func<Message, bool> messageHandler;
+
+ public event Action Connected;
+
+ private ILogger logger;
+
+ public ILogger Logger
+ {
+ get => logger ?? (logger = new ConsoleLogger());
+ set => logger = value;
+ }
+
+ public bool IsDisposed { get; private set; } = false;
+
+ public bool IsConnected => tcpClient.Client != null && tcpClient.Client.Connected;
+
+ protected GodotIdeConnection(TcpClient tcpClient, Func<Message, bool> messageHandler)
+ {
+ this.tcpClient = tcpClient;
+ this.messageHandler = messageHandler;
+ }
+
+ public void Start()
+ {
+ try
+ {
+ if (!StartConnection())
+ return;
+
+ string messageLine;
+ while ((messageLine = ReadLine()) != null)
+ {
+ if (!MessageParser.TryParse(messageLine, out Message msg))
+ {
+ Logger.LogError($"Received message with invalid format: {messageLine}");
+ continue;
+ }
+
+ Logger.LogDebug($"Received message: {msg}");
+
+ if (msg.Id == "close")
+ {
+ Logger.LogInfo("Closing connection");
+ return;
+ }
+
+ try
+ {
+ try
+ {
+ Debug.Assert(messageHandler != null);
+
+ if (!messageHandler(msg))
+ Logger.LogError($"Received unknown message: {msg}");
+ }
+ catch (Exception e)
+ {
+ Logger.LogError($"Message handler for '{msg}' failed with exception", e);
+ }
+ }
+ catch (Exception e)
+ {
+ Logger.LogError($"Exception thrown from message handler. Message: {msg}", e);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ Logger.LogError($"Unhandled exception in the Godot Ide Connection thread", e);
+ }
+ finally
+ {
+ Dispose();
+ }
+ }
+
+ private bool StartConnection()
+ {
+ NetworkStream clientStream = tcpClient.GetStream();
+
+ clientReader = new StreamReader(clientStream, Encoding.UTF8);
+
+ lock (writeLock)
+ clientWriter = new StreamWriter(clientStream, Encoding.UTF8);
+
+ clientStream.WriteTimeout = ClientWriteTimeout;
+
+ if (!WriteHandshake())
+ {
+ Logger.LogError("Could not write handshake");
+ return false;
+ }
+
+ if (!IsValidResponseHandshake(ReadLine()))
+ {
+ Logger.LogError("Received invalid handshake");
+ return false;
+ }
+
+ Connected?.Invoke();
+
+ Logger.LogInfo("Godot Ide connection started");
+
+ return true;
+ }
+
+ private string ReadLine()
+ {
+ try
+ {
+ return clientReader?.ReadLine();
+ }
+ catch (Exception e)
+ {
+ if (IsDisposed)
+ {
+ var se = e as SocketException ?? e.InnerException as SocketException;
+ if (se != null && se.SocketErrorCode == SocketError.Interrupted)
+ return null;
+ }
+
+ throw;
+ }
+ }
+
+ public bool WriteMessage(Message message)
+ {
+ Logger.LogDebug($"Sending message {message}");
+
+ var messageComposer = new MessageComposer();
+
+ messageComposer.AddArgument(message.Id);
+ foreach (string argument in message.Arguments)
+ messageComposer.AddArgument(argument);
+
+ return WriteLine(messageComposer.ToString());
+ }
+
+ protected bool WriteLine(string text)
+ {
+ if (clientWriter == null || IsDisposed || !IsConnected)
+ return false;
+
+ lock (writeLock)
+ {
+ try
+ {
+ clientWriter.WriteLine(text);
+ clientWriter.Flush();
+ }
+ catch (Exception e)
+ {
+ if (!IsDisposed)
+ {
+ var se = e as SocketException ?? e.InnerException as SocketException;
+ if (se != null && se.SocketErrorCode == SocketError.Shutdown)
+ Logger.LogInfo("Client disconnected ungracefully");
+ else
+ Logger.LogError("Exception thrown when trying to write to client", e);
+
+ Dispose();
+ }
+ }
+ }
+
+ return true;
+ }
+
+ protected abstract bool WriteHandshake();
+ protected abstract bool IsValidResponseHandshake(string handshakeLine);
+
+ public void Dispose()
+ {
+ if (IsDisposed)
+ return;
+
+ IsDisposed = true;
+
+ clientReader?.Dispose();
+ clientWriter?.Dispose();
+ ((IDisposable) tcpClient)?.Dispose();
+ }
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeConnectionClient.cs b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeConnectionClient.cs
new file mode 100644
index 0000000000..1b11a14358
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeConnectionClient.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Net.Sockets;
+using System.Threading.Tasks;
+
+namespace GodotTools.IdeConnection
+{
+ public class GodotIdeConnectionClient : GodotIdeConnection
+ {
+ public GodotIdeConnectionClient(TcpClient tcpClient, Func<Message, bool> messageHandler)
+ : base(tcpClient, messageHandler)
+ {
+ }
+
+ protected override bool WriteHandshake()
+ {
+ return WriteLine(ClientHandshake);
+ }
+
+ protected override bool IsValidResponseHandshake(string handshakeLine)
+ {
+ return handshakeLine == ServerHandshake;
+ }
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeConnectionServer.cs b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeConnectionServer.cs
new file mode 100644
index 0000000000..aa98dc7ca3
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeConnectionServer.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Net.Sockets;
+using System.Threading.Tasks;
+
+namespace GodotTools.IdeConnection
+{
+ public class GodotIdeConnectionServer : GodotIdeConnection
+ {
+ public GodotIdeConnectionServer(TcpClient tcpClient, Func<Message, bool> messageHandler)
+ : base(tcpClient, messageHandler)
+ {
+ }
+
+ protected override bool WriteHandshake()
+ {
+ return WriteLine(ServerHandshake);
+ }
+
+ protected override bool IsValidResponseHandshake(string handshakeLine)
+ {
+ return handshakeLine == ClientHandshake;
+ }
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeMetadata.cs b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeMetadata.cs
new file mode 100644
index 0000000000..d16daba0e2
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotIdeMetadata.cs
@@ -0,0 +1,45 @@
+namespace GodotTools.IdeConnection
+{
+ public struct GodotIdeMetadata
+ {
+ public int Port { get; }
+ public string EditorExecutablePath { get; }
+
+ public GodotIdeMetadata(int port, string editorExecutablePath)
+ {
+ Port = port;
+ EditorExecutablePath = editorExecutablePath;
+ }
+
+ public static bool operator ==(GodotIdeMetadata a, GodotIdeMetadata b)
+ {
+ return a.Port == b.Port && a.EditorExecutablePath == b.EditorExecutablePath;
+ }
+
+ public static bool operator !=(GodotIdeMetadata a, GodotIdeMetadata b)
+ {
+ return !(a == b);
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (obj is GodotIdeMetadata metadata)
+ return metadata == this;
+
+ return false;
+ }
+
+ public bool Equals(GodotIdeMetadata other)
+ {
+ return Port == other.Port && EditorExecutablePath == other.EditorExecutablePath;
+ }
+
+ public override int GetHashCode()
+ {
+ unchecked
+ {
+ return (Port * 397) ^ (EditorExecutablePath != null ? EditorExecutablePath.GetHashCode() : 0);
+ }
+ }
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotTools.IdeConnection.csproj b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotTools.IdeConnection.csproj
new file mode 100644
index 0000000000..94e525715b
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/GodotTools.IdeConnection.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{92600954-25F0-4291-8E11-1FEE9FC4BE20}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>GodotTools.IdeConnection</RootNamespace>
+ <AssemblyName>GodotTools.IdeConnection</AssemblyName>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <LangVersion>7</LangVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>portable</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <DebugType>portable</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="ConsoleLogger.cs" />
+ <Compile Include="GodotIdeMetadata.cs" />
+ <Compile Include="GodotIdeBase.cs" />
+ <Compile Include="GodotIdeClient.cs" />
+ <Compile Include="GodotIdeConnection.cs" />
+ <Compile Include="GodotIdeConnectionClient.cs" />
+ <Compile Include="GodotIdeConnectionServer.cs" />
+ <Compile Include="ILogger.cs" />
+ <Compile Include="Message.cs" />
+ <Compile Include="MessageComposer.cs" />
+ <Compile Include="MessageParser.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project> \ No newline at end of file
diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeConnection/ILogger.cs b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/ILogger.cs
new file mode 100644
index 0000000000..614bb30271
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/ILogger.cs
@@ -0,0 +1,13 @@
+using System;
+
+namespace GodotTools.IdeConnection
+{
+ public interface ILogger
+ {
+ void LogDebug(string message);
+ void LogInfo(string message);
+ void LogWarning(string message);
+ void LogError(string message);
+ void LogError(string message, Exception e);
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeConnection/Message.cs b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/Message.cs
new file mode 100644
index 0000000000..f24d324ae3
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/Message.cs
@@ -0,0 +1,21 @@
+using System.Linq;
+
+namespace GodotTools.IdeConnection
+{
+ public struct Message
+ {
+ public string Id { get; set; }
+ public string[] Arguments { get; set; }
+
+ public Message(string id, params string[] arguments)
+ {
+ Id = id;
+ Arguments = arguments;
+ }
+
+ public override string ToString()
+ {
+ return $"(Id: '{Id}', Arguments: '{string.Join(",", Arguments)}')";
+ }
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeConnection/MessageComposer.cs b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/MessageComposer.cs
new file mode 100644
index 0000000000..9e4cd6ec1a
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/MessageComposer.cs
@@ -0,0 +1,46 @@
+using System.Linq;
+using System.Text;
+
+namespace GodotTools.IdeConnection
+{
+ public class MessageComposer
+ {
+ private readonly StringBuilder stringBuilder = new StringBuilder();
+
+ private static readonly char[] CharsToEscape = { '\\', '"' };
+
+ public void AddArgument(string argument)
+ {
+ AddArgument(argument, quoted: argument.Contains(","));
+ }
+
+ public void AddArgument(string argument, bool quoted)
+ {
+ if (stringBuilder.Length > 0)
+ stringBuilder.Append(',');
+
+ if (quoted)
+ {
+ stringBuilder.Append('"');
+
+ foreach (char @char in argument)
+ {
+ if (CharsToEscape.Contains(@char))
+ stringBuilder.Append('\\');
+ stringBuilder.Append(@char);
+ }
+
+ stringBuilder.Append('"');
+ }
+ else
+ {
+ stringBuilder.Append(argument);
+ }
+ }
+
+ public override string ToString()
+ {
+ return stringBuilder.ToString();
+ }
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeConnection/MessageParser.cs b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/MessageParser.cs
new file mode 100644
index 0000000000..ed691e481f
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/MessageParser.cs
@@ -0,0 +1,88 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace GodotTools.IdeConnection
+{
+ public static class MessageParser
+ {
+ public static bool TryParse(string messageLine, out Message message)
+ {
+ var arguments = new List<string>();
+ var stringBuilder = new StringBuilder();
+
+ bool expectingArgument = true;
+
+ for (int i = 0; i < messageLine.Length; i++)
+ {
+ char @char = messageLine[i];
+
+ if (@char == ',')
+ {
+ if (expectingArgument)
+ arguments.Add(string.Empty);
+
+ expectingArgument = true;
+ continue;
+ }
+
+ bool quoted = false;
+
+ if (messageLine[i] == '"')
+ {
+ quoted = true;
+ i++;
+ }
+
+ while (i < messageLine.Length)
+ {
+ @char = messageLine[i];
+
+ if (quoted && @char == '"')
+ {
+ i++;
+ break;
+ }
+
+ if (@char == '\\')
+ {
+ i++;
+ if (i < messageLine.Length)
+ break;
+
+ stringBuilder.Append(messageLine[i]);
+ }
+ else if (!quoted && @char == ',')
+ {
+ break; // We don't increment the counter to allow the colon to be parsed after this
+ }
+ else
+ {
+ stringBuilder.Append(@char);
+ }
+
+ i++;
+ }
+
+ arguments.Add(stringBuilder.ToString());
+ stringBuilder.Clear();
+
+ expectingArgument = false;
+ }
+
+ if (arguments.Count == 0)
+ {
+ message = new Message();
+ return false;
+ }
+
+ message = new Message
+ {
+ Id = arguments[0],
+ Arguments = arguments.Skip(1).ToArray()
+ };
+
+ return true;
+ }
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeConnection/Properties/AssemblyInfo.cs b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..c7c00e66a2
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools.IdeConnection/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("GodotTools.IdeConnection")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Godot Engine contributors")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("92600954-25F0-4291-8E11-1FEE9FC4BE20")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/GodotTools.ProjectEditor.csproj b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/GodotTools.ProjectEditor.csproj
index 08b8ba3946..ab3a5d1aea 100644
--- a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/GodotTools.ProjectEditor.csproj
+++ b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/GodotTools.ProjectEditor.csproj
@@ -9,6 +9,7 @@
<AssemblyName>GodotTools.ProjectEditor</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<BaseIntermediateOutputPath>obj</BaseIntermediateOutputPath>
+ <LangVersion>7</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -36,9 +37,8 @@
entire solution. $(SolutionDir) is not defined in that case, so we need to workaround that.
We make SCons restore the NuGet packages in the project directory instead in this case.
-->
- <HintPath Condition=" '$(SolutionDir)' != '' ">$(SolutionDir)\packages\DotNet.Glob.2.1.1\lib\net45\DotNet.Glob.dll</HintPath>
- <HintPath>$(ProjectDir)\packages\DotNet.Glob.2.1.1\lib\net45\DotNet.Glob.dll</HintPath>
- <HintPath>packages\DotNet.Glob.2.1.1\lib\net45\DotNet.Glob.dll</HintPath> <!-- Are you happy CI? -->
+ <HintPath Condition=" '$(SolutionDir)' != '' And Exists('$(SolutionDir)\packages\DotNet.Glob.2.1.1\lib\net45\DotNet.Glob.dll') ">$(SolutionDir)\packages\DotNet.Glob.2.1.1\lib\net45\DotNet.Glob.dll</HintPath>
+ <HintPath Condition=" '$(SolutionDir)' == '' Or !Exists('$(SolutionDir)\packages\DotNet.Glob.2.1.1\lib\net45\DotNet.Glob.dll') ">$(ProjectDir)\packages\DotNet.Glob.2.1.1\lib\net45\DotNet.Glob.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
diff --git a/modules/mono/editor/GodotTools/GodotTools.sln b/modules/mono/editor/GodotTools/GodotTools.sln
index 6f7d44bec2..a3438ea5f3 100644
--- a/modules/mono/editor/GodotTools/GodotTools.sln
+++ b/modules/mono/editor/GodotTools/GodotTools.sln
@@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GodotTools.Core", "GodotToo
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GodotTools.BuildLogger", "GodotTools.BuildLogger\GodotTools.BuildLogger.csproj", "{6CE9A984-37B1-4F8A-8FE9-609F05F071B3}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GodotTools.IdeConnection", "GodotTools.IdeConnection\GodotTools.IdeConnection.csproj", "{92600954-25F0-4291-8E11-1FEE9FC4BE20}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -31,5 +33,9 @@ Global
{6CE9A984-37B1-4F8A-8FE9-609F05F071B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6CE9A984-37B1-4F8A-8FE9-609F05F071B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6CE9A984-37B1-4F8A-8FE9-609F05F071B3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {92600954-25F0-4291-8E11-1FEE9FC4BE20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {92600954-25F0-4291-8E11-1FEE9FC4BE20}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {92600954-25F0-4291-8E11-1FEE9FC4BE20}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {92600954-25F0-4291-8E11-1FEE9FC4BE20}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
diff --git a/modules/mono/editor/GodotTools/GodotTools/MonoBottomPanel.cs b/modules/mono/editor/GodotTools/GodotTools/BottomPanel.cs
index 53ff0891d5..44813f962c 100644
--- a/modules/mono/editor/GodotTools/GodotTools/MonoBottomPanel.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/BottomPanel.cs
@@ -9,7 +9,7 @@ using Path = System.IO.Path;
namespace GodotTools
{
- public class MonoBottomPanel : VBoxContainer
+ public class BottomPanel : VBoxContainer
{
private EditorInterface editorInterface;
@@ -34,7 +34,7 @@ namespace GodotTools
for (int i = 0; i < buildTabs.GetChildCount(); i++)
{
- var tab = (MonoBuildTab) buildTabs.GetChild(i);
+ var tab = (BuildTab) buildTabs.GetChild(i);
if (tab == null)
continue;
@@ -49,11 +49,11 @@ namespace GodotTools
itemTooltip += "\nStatus: ";
if (tab.BuildExited)
- itemTooltip += tab.BuildResult == MonoBuildTab.BuildResults.Success ? "Succeeded" : "Errored";
+ itemTooltip += tab.BuildResult == BuildTab.BuildResults.Success ? "Succeeded" : "Errored";
else
itemTooltip += "Running";
- if (!tab.BuildExited || tab.BuildResult == MonoBuildTab.BuildResults.Error)
+ if (!tab.BuildExited || tab.BuildResult == BuildTab.BuildResults.Error)
itemTooltip += $"\nErrors: {tab.ErrorCount}";
itemTooltip += $"\nWarnings: {tab.WarningCount}";
@@ -68,15 +68,15 @@ namespace GodotTools
}
}
- public MonoBuildTab GetBuildTabFor(MonoBuildInfo buildInfo)
+ public BuildTab GetBuildTabFor(BuildInfo buildInfo)
{
- foreach (var buildTab in new Array<MonoBuildTab>(buildTabs.GetChildren()))
+ foreach (var buildTab in new Array<BuildTab>(buildTabs.GetChildren()))
{
if (buildTab.BuildInfo.Equals(buildInfo))
return buildTab;
}
- var newBuildTab = new MonoBuildTab(buildInfo);
+ var newBuildTab = new BuildTab(buildInfo);
AddBuildTab(newBuildTab);
return newBuildTab;
@@ -120,7 +120,7 @@ namespace GodotTools
if (currentTab < 0 || currentTab >= buildTabs.GetTabCount())
throw new InvalidOperationException("No tab selected");
- var buildTab = (MonoBuildTab) buildTabs.GetChild(currentTab);
+ var buildTab = (BuildTab) buildTabs.GetChild(currentTab);
buildTab.WarningsVisible = pressed;
buildTab.UpdateIssuesList();
}
@@ -132,7 +132,7 @@ namespace GodotTools
if (currentTab < 0 || currentTab >= buildTabs.GetTabCount())
throw new InvalidOperationException("No tab selected");
- var buildTab = (MonoBuildTab) buildTabs.GetChild(currentTab);
+ var buildTab = (BuildTab) buildTabs.GetChild(currentTab);
buildTab.ErrorsVisible = pressed;
buildTab.UpdateIssuesList();
}
@@ -145,7 +145,7 @@ namespace GodotTools
string editorScriptsMetadataPath = Path.Combine(GodotSharpDirs.ResMetadataDir, "scripts_metadata.editor");
string playerScriptsMetadataPath = Path.Combine(GodotSharpDirs.ResMetadataDir, "scripts_metadata.editor_player");
- CSharpProject.GenerateScriptsMetadata(GodotSharpDirs.ProjectCsProjPath, editorScriptsMetadataPath);
+ CsProjOperations.GenerateScriptsMetadata(GodotSharpDirs.ProjectCsProjPath, editorScriptsMetadataPath);
if (File.Exists(editorScriptsMetadataPath))
{
@@ -166,7 +166,7 @@ namespace GodotTools
Internal.GodotIs32Bits() ? "32" : "64"
};
- bool buildSuccess = GodotSharpBuilds.BuildProjectBlocking("Tools", godotDefines);
+ bool buildSuccess = BuildManager.BuildProjectBlocking("Tools", godotDefines);
if (!buildSuccess)
return;
@@ -193,9 +193,9 @@ namespace GodotTools
int selectedItem = selectedItems[0];
- var buildTab = (MonoBuildTab) buildTabs.GetTabControl(selectedItem);
+ var buildTab = (BuildTab) buildTabs.GetTabControl(selectedItem);
- OS.ShellOpen(Path.Combine(buildTab.BuildInfo.LogsDirPath, GodotSharpBuilds.MsBuildLogFileName));
+ OS.ShellOpen(Path.Combine(buildTab.BuildInfo.LogsDirPath, BuildManager.MsBuildLogFileName));
}
public override void _Notification(int what)
@@ -211,13 +211,13 @@ namespace GodotTools
}
}
- public void AddBuildTab(MonoBuildTab buildTab)
+ public void AddBuildTab(BuildTab buildTab)
{
buildTabs.AddChild(buildTab);
RaiseBuildTab(buildTab);
}
- public void RaiseBuildTab(MonoBuildTab buildTab)
+ public void RaiseBuildTab(BuildTab buildTab)
{
if (buildTab.GetParent() != buildTabs)
throw new InvalidOperationException("Build tab is not in the tabs list");
diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs
index d8cb9024c3..9a2b2e3a26 100644
--- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs
@@ -46,8 +46,8 @@ namespace GodotTools.Build
{
if (OS.IsWindows())
{
- return (GodotSharpBuilds.BuildTool) EditorSettings.GetSetting("mono/builds/build_tool")
- == GodotSharpBuilds.BuildTool.MsBuildMono;
+ return (BuildManager.BuildTool) EditorSettings.GetSetting("mono/builds/build_tool")
+ == BuildManager.BuildTool.MsBuildMono;
}
return false;
@@ -103,16 +103,16 @@ namespace GodotTools.Build
return process;
}
- public static int Build(MonoBuildInfo monoBuildInfo)
+ public static int Build(BuildInfo buildInfo)
{
- return Build(monoBuildInfo.Solution, monoBuildInfo.Configuration,
- monoBuildInfo.LogsDirPath, monoBuildInfo.CustomProperties);
+ return Build(buildInfo.Solution, buildInfo.Configuration,
+ buildInfo.LogsDirPath, buildInfo.CustomProperties);
}
- public static async Task<int> BuildAsync(MonoBuildInfo monoBuildInfo)
+ public static async Task<int> BuildAsync(BuildInfo buildInfo)
{
- return await BuildAsync(monoBuildInfo.Solution, monoBuildInfo.Configuration,
- monoBuildInfo.LogsDirPath, monoBuildInfo.CustomProperties);
+ return await BuildAsync(buildInfo.Solution, buildInfo.Configuration,
+ buildInfo.LogsDirPath, buildInfo.CustomProperties);
}
public static int Build(string solution, string config, string loggerOutputDir, IEnumerable<string> customProperties = null)
diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs b/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs
index 926aabdf89..4c1e47ecad 100644
--- a/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs
@@ -19,13 +19,13 @@ namespace GodotTools.Build
public static string FindMsBuild()
{
var editorSettings = GodotSharpEditor.Instance.GetEditorInterface().GetEditorSettings();
- var buildTool = (GodotSharpBuilds.BuildTool) editorSettings.GetSetting("mono/builds/build_tool");
+ var buildTool = (BuildManager.BuildTool) editorSettings.GetSetting("mono/builds/build_tool");
if (OS.IsWindows())
{
switch (buildTool)
{
- case GodotSharpBuilds.BuildTool.MsBuildVs:
+ case BuildManager.BuildTool.MsBuildVs:
{
if (_msbuildToolsPath.Empty() || !File.Exists(_msbuildToolsPath))
{
@@ -34,7 +34,7 @@ namespace GodotTools.Build
if (_msbuildToolsPath.Empty())
{
- throw new FileNotFoundException($"Cannot find executable for '{GodotSharpBuilds.PropNameMsbuildVs}'. Tried with path: {_msbuildToolsPath}");
+ throw new FileNotFoundException($"Cannot find executable for '{BuildManager.PropNameMsbuildVs}'. Tried with path: {_msbuildToolsPath}");
}
}
@@ -43,13 +43,13 @@ namespace GodotTools.Build
return Path.Combine(_msbuildToolsPath, "MSBuild.exe");
}
- case GodotSharpBuilds.BuildTool.MsBuildMono:
+ case BuildManager.BuildTool.MsBuildMono:
{
string msbuildPath = Path.Combine(Internal.MonoWindowsInstallRoot, "bin", "msbuild.bat");
if (!File.Exists(msbuildPath))
{
- throw new FileNotFoundException($"Cannot find executable for '{GodotSharpBuilds.PropNameMsbuildMono}'. Tried with path: {msbuildPath}");
+ throw new FileNotFoundException($"Cannot find executable for '{BuildManager.PropNameMsbuildMono}'. Tried with path: {msbuildPath}");
}
return msbuildPath;
@@ -61,7 +61,7 @@ namespace GodotTools.Build
if (OS.IsUnix())
{
- if (buildTool == GodotSharpBuilds.BuildTool.MsBuildMono)
+ if (buildTool == BuildManager.BuildTool.MsBuildMono)
{
if (_msbuildUnixPath.Empty() || !File.Exists(_msbuildUnixPath))
{
@@ -71,7 +71,7 @@ namespace GodotTools.Build
if (_msbuildUnixPath.Empty())
{
- throw new FileNotFoundException($"Cannot find binary for '{GodotSharpBuilds.PropNameMsbuildMono}'");
+ throw new FileNotFoundException($"Cannot find binary for '{BuildManager.PropNameMsbuildMono}'");
}
return _msbuildUnixPath;
diff --git a/modules/mono/editor/GodotTools/GodotTools/MonoBuildInfo.cs b/modules/mono/editor/GodotTools/GodotTools/BuildInfo.cs
index 858e852392..70bd552f2f 100644
--- a/modules/mono/editor/GodotTools/GodotTools/MonoBuildInfo.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/BuildInfo.cs
@@ -7,7 +7,7 @@ using Path = System.IO.Path;
namespace GodotTools
{
[Serializable]
- public sealed class MonoBuildInfo : Reference // TODO Remove Reference once we have proper serialization
+ public sealed class BuildInfo : Reference // TODO Remove Reference once we have proper serialization
{
public string Solution { get; }
public string Configuration { get; }
@@ -17,7 +17,7 @@ namespace GodotTools
public override bool Equals(object obj)
{
- if (obj is MonoBuildInfo other)
+ if (obj is BuildInfo other)
return other.Solution == Solution && other.Configuration == Configuration;
return false;
@@ -34,11 +34,11 @@ namespace GodotTools
}
}
- private MonoBuildInfo()
+ private BuildInfo()
{
}
- public MonoBuildInfo(string solution, string configuration)
+ public BuildInfo(string solution, string configuration)
{
Solution = solution;
Configuration = configuration;
diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpBuilds.cs b/modules/mono/editor/GodotTools/GodotTools/BuildManager.cs
index de3a4d9a6e..417032da54 100644
--- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpBuilds.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/BuildManager.cs
@@ -6,15 +6,13 @@ using GodotTools.Build;
using GodotTools.Internals;
using GodotTools.Utils;
using static GodotTools.Internals.Globals;
-using Error = Godot.Error;
using File = GodotTools.Utils.File;
-using Directory = GodotTools.Utils.Directory;
namespace GodotTools
{
- public static class GodotSharpBuilds
+ public static class BuildManager
{
- private static readonly List<MonoBuildInfo> BuildsInProgress = new List<MonoBuildInfo>();
+ private static readonly List<BuildInfo> BuildsInProgress = new List<BuildInfo>();
public const string PropNameMsbuildMono = "MSBuild (Mono)";
public const string PropNameMsbuildVs = "MSBuild (VS Build Tools)";
@@ -28,7 +26,7 @@ namespace GodotTools
MsBuildVs
}
- private static void RemoveOldIssuesFile(MonoBuildInfo buildInfo)
+ private static void RemoveOldIssuesFile(BuildInfo buildInfo)
{
var issuesFile = GetIssuesFilePath(buildInfo);
@@ -38,29 +36,21 @@ namespace GodotTools
File.Delete(issuesFile);
}
- private static string _ApiFolderName(ApiAssemblyType apiType)
- {
- ulong apiHash = apiType == ApiAssemblyType.Core ?
- Internal.GetCoreApiHash() :
- Internal.GetEditorApiHash();
- return $"{apiHash}_{BindingsGenerator.Version}_{BindingsGenerator.CsGlueVersion}";
- }
-
private static void ShowBuildErrorDialog(string message)
{
GodotSharpEditor.Instance.ShowErrorDialog(message, "Build error");
- GodotSharpEditor.Instance.MonoBottomPanel.ShowBuildTab();
+ GodotSharpEditor.Instance.BottomPanel.ShowBuildTab();
}
- public static void RestartBuild(MonoBuildTab buildTab) => throw new NotImplementedException();
- public static void StopBuild(MonoBuildTab buildTab) => throw new NotImplementedException();
+ public static void RestartBuild(BuildTab buildTab) => throw new NotImplementedException();
+ public static void StopBuild(BuildTab buildTab) => throw new NotImplementedException();
- private static string GetLogFilePath(MonoBuildInfo buildInfo)
+ private static string GetLogFilePath(BuildInfo buildInfo)
{
return Path.Combine(buildInfo.LogsDirPath, MsBuildLogFileName);
}
- private static string GetIssuesFilePath(MonoBuildInfo buildInfo)
+ private static string GetIssuesFilePath(BuildInfo buildInfo)
{
return Path.Combine(buildInfo.LogsDirPath, MsBuildIssuesFileName);
}
@@ -71,7 +61,7 @@ namespace GodotTools
Godot.GD.Print(text);
}
- public static bool Build(MonoBuildInfo buildInfo)
+ public static bool Build(BuildInfo buildInfo)
{
if (BuildsInProgress.Contains(buildInfo))
throw new InvalidOperationException("A build is already in progress");
@@ -80,7 +70,7 @@ namespace GodotTools
try
{
- MonoBuildTab buildTab = GodotSharpEditor.Instance.MonoBottomPanel.GetBuildTabFor(buildInfo);
+ BuildTab buildTab = GodotSharpEditor.Instance.BottomPanel.GetBuildTabFor(buildInfo);
buildTab.OnBuildStart();
// Required in order to update the build tasks list
@@ -103,7 +93,7 @@ namespace GodotTools
if (exitCode != 0)
PrintVerbose($"MSBuild exited with code: {exitCode}. Log file: {GetLogFilePath(buildInfo)}");
- buildTab.OnBuildExit(exitCode == 0 ? MonoBuildTab.BuildResults.Success : MonoBuildTab.BuildResults.Error);
+ buildTab.OnBuildExit(exitCode == 0 ? BuildTab.BuildResults.Success : BuildTab.BuildResults.Error);
return exitCode == 0;
}
@@ -120,7 +110,7 @@ namespace GodotTools
}
}
- public static async Task<bool> BuildAsync(MonoBuildInfo buildInfo)
+ public static async Task<bool> BuildAsync(BuildInfo buildInfo)
{
if (BuildsInProgress.Contains(buildInfo))
throw new InvalidOperationException("A build is already in progress");
@@ -129,7 +119,7 @@ namespace GodotTools
try
{
- MonoBuildTab buildTab = GodotSharpEditor.Instance.MonoBottomPanel.GetBuildTabFor(buildInfo);
+ BuildTab buildTab = GodotSharpEditor.Instance.BottomPanel.GetBuildTabFor(buildInfo);
try
{
@@ -148,7 +138,7 @@ namespace GodotTools
if (exitCode != 0)
PrintVerbose($"MSBuild exited with code: {exitCode}. Log file: {GetLogFilePath(buildInfo)}");
- buildTab.OnBuildExit(exitCode == 0 ? MonoBuildTab.BuildResults.Success : MonoBuildTab.BuildResults.Error);
+ buildTab.OnBuildExit(exitCode == 0 ? BuildTab.BuildResults.Success : BuildTab.BuildResults.Error);
return exitCode == 0;
}
@@ -165,32 +155,6 @@ namespace GodotTools
}
}
- public static bool BuildApiSolution(string apiSlnDir, string config)
- {
- string apiSlnFile = Path.Combine(apiSlnDir, $"{ApiAssemblyNames.SolutionName}.sln");
-
- string coreApiAssemblyDir = Path.Combine(apiSlnDir, ApiAssemblyNames.Core, "bin", config);
- string coreApiAssemblyFile = Path.Combine(coreApiAssemblyDir, $"{ApiAssemblyNames.Core}.dll");
-
- string editorApiAssemblyDir = Path.Combine(apiSlnDir, ApiAssemblyNames.Editor, "bin", config);
- string editorApiAssemblyFile = Path.Combine(editorApiAssemblyDir, $"{ApiAssemblyNames.Editor}.dll");
-
- if (File.Exists(coreApiAssemblyFile) && File.Exists(editorApiAssemblyFile))
- return true; // The assemblies are in the output folder; assume the solution is already built
-
- var apiBuildInfo = new MonoBuildInfo(apiSlnFile, config);
-
- // TODO Replace this global NoWarn with '#pragma warning' directives on generated files,
- // once we start to actively document manually maintained C# classes
- apiBuildInfo.CustomProperties.Add("NoWarn=1591"); // Ignore missing documentation warnings
-
- if (Build(apiBuildInfo))
- return true;
-
- ShowBuildErrorDialog($"Failed to build {ApiAssemblyNames.SolutionName} solution.");
- return false;
- }
-
public static bool BuildProjectBlocking(string config, IEnumerable<string> godotDefines)
{
if (!File.Exists(GodotSharpDirs.ProjectSlnPath))
@@ -201,13 +165,13 @@ namespace GodotTools
Internal.UpdateApiAssembliesFromPrebuilt();
var editorSettings = GodotSharpEditor.Instance.GetEditorInterface().GetEditorSettings();
- var buildTool = (BuildTool)editorSettings.GetSetting("mono/builds/build_tool");
+ var buildTool = (BuildTool) editorSettings.GetSetting("mono/builds/build_tool");
using (var pr = new EditorProgress("mono_project_debug_build", "Building project solution...", 1))
{
pr.Step("Building project solution", 0);
- var buildInfo = new MonoBuildInfo(GodotSharpDirs.ProjectSlnPath, config);
+ var buildInfo = new BuildInfo(GodotSharpDirs.ProjectSlnPath, config);
// Add Godot defines
string constants = buildTool == BuildTool.MsBuildVs ? "GodotDefineConstants=\"" : "GodotDefineConstants=\\\"";
@@ -240,11 +204,28 @@ namespace GodotTools
string editorScriptsMetadataPath = Path.Combine(GodotSharpDirs.ResMetadataDir, "scripts_metadata.editor");
string playerScriptsMetadataPath = Path.Combine(GodotSharpDirs.ResMetadataDir, "scripts_metadata.editor_player");
- CSharpProject.GenerateScriptsMetadata(GodotSharpDirs.ProjectCsProjPath, editorScriptsMetadataPath);
+ CsProjOperations.GenerateScriptsMetadata(GodotSharpDirs.ProjectCsProjPath, editorScriptsMetadataPath);
if (File.Exists(editorScriptsMetadataPath))
File.Copy(editorScriptsMetadataPath, playerScriptsMetadataPath);
+ var currentPlayRequest = GodotSharpEditor.Instance.GodotIdeManager.GodotIdeServer.CurrentPlayRequest;
+
+ if (currentPlayRequest != null)
+ {
+ if (currentPlayRequest.Value.HasDebugger)
+ {
+ // Set the environment variable that will tell the player to connect to the IDE debugger
+ // TODO: We should probably add a better way to do this
+ Environment.SetEnvironmentVariable("GODOT_MONO_DEBUGGER_AGENT",
+ "--debugger-agent=transport=dt_socket" +
+ $",address={currentPlayRequest.Value.DebuggerHost}:{currentPlayRequest.Value.DebuggerPort}" +
+ ",server=n");
+ }
+
+ return true; // Requested play from an external editor/IDE which already built the project
+ }
+
var godotDefines = new[]
{
Godot.OS.GetName(),
diff --git a/modules/mono/editor/GodotTools/GodotTools/MonoBuildTab.cs b/modules/mono/editor/GodotTools/GodotTools/BuildTab.cs
index 3a74fa2f66..807a20d9a1 100644
--- a/modules/mono/editor/GodotTools/GodotTools/MonoBuildTab.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/BuildTab.cs
@@ -7,7 +7,7 @@ using Path = System.IO.Path;
namespace GodotTools
{
- public class MonoBuildTab : VBoxContainer
+ public class BuildTab : VBoxContainer
{
public enum BuildResults
{
@@ -55,7 +55,7 @@ namespace GodotTools
}
}
- public MonoBuildInfo BuildInfo { get; private set; }
+ public BuildInfo BuildInfo { get; private set; }
private void _LoadIssuesFromFile(string csvFile)
{
@@ -199,7 +199,7 @@ namespace GodotTools
ErrorCount = 0;
UpdateIssuesList();
- GodotSharpEditor.Instance.MonoBottomPanel.RaiseBuildTab(this);
+ GodotSharpEditor.Instance.BottomPanel.RaiseBuildTab(this);
}
public void OnBuildExit(BuildResults result)
@@ -207,10 +207,10 @@ namespace GodotTools
BuildExited = true;
BuildResult = result;
- _LoadIssuesFromFile(Path.Combine(BuildInfo.LogsDirPath, GodotSharpBuilds.MsBuildIssuesFileName));
+ _LoadIssuesFromFile(Path.Combine(BuildInfo.LogsDirPath, BuildManager.MsBuildIssuesFileName));
UpdateIssuesList();
- GodotSharpEditor.Instance.MonoBottomPanel.RaiseBuildTab(this);
+ GodotSharpEditor.Instance.BottomPanel.RaiseBuildTab(this);
}
public void OnBuildExecFailed(string cause)
@@ -227,7 +227,7 @@ namespace GodotTools
UpdateIssuesList();
- GodotSharpEditor.Instance.MonoBottomPanel.RaiseBuildTab(this);
+ GodotSharpEditor.Instance.BottomPanel.RaiseBuildTab(this);
}
public void RestartBuild()
@@ -235,7 +235,7 @@ namespace GodotTools
if (!BuildExited)
throw new InvalidOperationException("Build already started");
- GodotSharpBuilds.RestartBuild(this);
+ BuildManager.RestartBuild(this);
}
public void StopBuild()
@@ -243,7 +243,7 @@ namespace GodotTools
if (!BuildExited)
throw new InvalidOperationException("Build is not in progress");
- GodotSharpBuilds.StopBuild(this);
+ BuildManager.StopBuild(this);
}
public override void _Ready()
@@ -255,11 +255,11 @@ namespace GodotTools
AddChild(issuesList);
}
- private MonoBuildTab()
+ private BuildTab()
{
}
- public MonoBuildTab(MonoBuildInfo buildInfo)
+ public BuildTab(BuildInfo buildInfo)
{
BuildInfo = buildInfo;
}
diff --git a/modules/mono/editor/GodotTools/GodotTools/CSharpProject.cs b/modules/mono/editor/GodotTools/GodotTools/CsProjOperations.cs
index 4535ed7247..c021a9051e 100644
--- a/modules/mono/editor/GodotTools/GodotTools/CSharpProject.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/CsProjOperations.cs
@@ -9,7 +9,7 @@ using Directory = GodotTools.Utils.Directory;
namespace GodotTools
{
- public static class CSharpProject
+ public static class CsProjOperations
{
public static string GenerateGameProject(string dir, string name)
{
diff --git a/modules/mono/editor/GodotTools/GodotTools/ExternalEditorId.cs b/modules/mono/editor/GodotTools/GodotTools/ExternalEditorId.cs
new file mode 100644
index 0000000000..4312ca0230
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools/ExternalEditorId.cs
@@ -0,0 +1,11 @@
+namespace GodotTools
+{
+ public enum ExternalEditorId
+ {
+ None,
+ VisualStudio, // TODO (Windows-only)
+ VisualStudioForMac, // Mac-only
+ MonoDevelop,
+ VsCode
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
index 9b5afb94a3..7da7cff933 100644
--- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
@@ -2,16 +2,18 @@ using Godot;
using GodotTools.Utils;
using System;
using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
using System.IO;
+using GodotTools.Ides;
using GodotTools.Internals;
using GodotTools.ProjectEditor;
using static GodotTools.Internals.Globals;
using File = GodotTools.Utils.File;
-using Path = System.IO.Path;
using OS = GodotTools.Utils.OS;
namespace GodotTools
{
+ [SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
public class GodotSharpEditor : EditorPlugin, ISerializationListener
{
private EditorSettings editorSettings;
@@ -24,12 +26,11 @@ namespace GodotTools
private ToolButton bottomPanelBtn;
- private MonoDevelopInstance monoDevelopInstance;
- private MonoDevelopInstance visualStudioForMacInstance;
+ public GodotIdeManager GodotIdeManager { get; private set; }
private WeakRef exportPluginWeak; // TODO Use WeakReference once we have proper serialization
- public MonoBottomPanel MonoBottomPanel { get; private set; }
+ public BottomPanel BottomPanel { get; private set; }
private bool CreateProjectSolution()
{
@@ -44,7 +45,7 @@ namespace GodotTools
if (name.Empty())
name = "UnnamedProject";
- string guid = CSharpProject.GenerateGameProject(path, name);
+ string guid = CsProjOperations.GenerateGameProject(path, name);
if (guid.Length > 0)
{
@@ -133,7 +134,7 @@ namespace GodotTools
return; // Failed to create solution
}
- Instance.MonoBottomPanel.BuildProjectPressed();
+ Instance.BottomPanel.BuildProjectPressed();
}
public override void _Notification(int what)
@@ -153,21 +154,12 @@ namespace GodotTools
}
}
- public enum MenuOptions
+ private enum MenuOptions
{
CreateSln,
AboutCSharp,
}
- public enum ExternalEditor
- {
- None,
- VisualStudio, // TODO (Windows-only)
- VisualStudioForMac, // Mac-only
- MonoDevelop,
- VsCode
- }
-
public void ShowErrorDialog(string message, string title = "Error")
{
errorDialog.WindowTitle = title;
@@ -184,11 +176,30 @@ namespace GodotTools
public Error OpenInExternalEditor(Script script, int line, int col)
{
- var editor = (ExternalEditor) editorSettings.GetSetting("mono/editor/external_editor");
+ var editor = (ExternalEditorId) editorSettings.GetSetting("mono/editor/external_editor");
switch (editor)
{
- case ExternalEditor.VsCode:
+ case ExternalEditorId.None:
+ // Tells the caller to fallback to the global external editor settings or the built-in editor
+ return Error.Unavailable;
+ case ExternalEditorId.VisualStudio:
+ throw new NotSupportedException();
+ case ExternalEditorId.VisualStudioForMac:
+ goto case ExternalEditorId.MonoDevelop;
+ case ExternalEditorId.MonoDevelop:
+ {
+ string scriptPath = ProjectSettings.GlobalizePath(script.ResourcePath);
+
+ if (line >= 0)
+ GodotIdeManager.SendOpenFile(scriptPath, line + 1, col);
+ else
+ GodotIdeManager.SendOpenFile(scriptPath);
+
+ break;
+ }
+
+ case ExternalEditorId.VsCode:
{
if (_vsCodePath.Empty() || !File.Exists(_vsCodePath))
{
@@ -273,47 +284,6 @@ namespace GodotTools
break;
}
- case ExternalEditor.VisualStudioForMac:
- goto case ExternalEditor.MonoDevelop;
- case ExternalEditor.MonoDevelop:
- {
- MonoDevelopInstance GetMonoDevelopInstance(string solutionPath)
- {
- if (OS.IsOSX() && editor == ExternalEditor.VisualStudioForMac)
- {
- if (visualStudioForMacInstance == null)
- visualStudioForMacInstance = new MonoDevelopInstance(solutionPath, MonoDevelopInstance.EditorId.VisualStudioForMac);
-
- return visualStudioForMacInstance;
- }
-
- if (monoDevelopInstance == null)
- monoDevelopInstance = new MonoDevelopInstance(solutionPath, MonoDevelopInstance.EditorId.MonoDevelop);
-
- return monoDevelopInstance;
- }
-
- string scriptPath = ProjectSettings.GlobalizePath(script.ResourcePath);
-
- if (line >= 0)
- scriptPath += $";{line + 1};{col}";
-
- try
- {
- GetMonoDevelopInstance(GodotSharpDirs.ProjectSlnPath).Execute(scriptPath);
- }
- catch (FileNotFoundException)
- {
- string editorName = editor == ExternalEditor.VisualStudioForMac ? "Visual Studio" : "MonoDevelop";
- GD.PushError($"Cannot find code editor: {editorName}");
- return Error.FileNotFound;
- }
-
- break;
- }
-
- case ExternalEditor.None:
- return Error.Unavailable;
default:
throw new ArgumentOutOfRangeException();
}
@@ -323,12 +293,12 @@ namespace GodotTools
public bool OverridesExternalEditor()
{
- return (ExternalEditor) editorSettings.GetSetting("mono/editor/external_editor") != ExternalEditor.None;
+ return (ExternalEditorId) editorSettings.GetSetting("mono/editor/external_editor") != ExternalEditorId.None;
}
public override bool Build()
{
- return GodotSharpBuilds.EditorBuildCallback();
+ return BuildManager.EditorBuildCallback();
}
public override void EnablePlugin()
@@ -347,9 +317,9 @@ namespace GodotTools
errorDialog = new AcceptDialog();
editorBaseControl.AddChild(errorDialog);
- MonoBottomPanel = new MonoBottomPanel();
+ BottomPanel = new BottomPanel();
- bottomPanelBtn = AddControlToBottomPanel(MonoBottomPanel, "Mono".TTR());
+ bottomPanelBtn = AddControlToBottomPanel(BottomPanel, "Mono".TTR());
AddChild(new HotReloadAssemblyWatcher {Name = "HotReloadAssemblyWatcher"});
@@ -389,7 +359,7 @@ namespace GodotTools
aboutLabel.Text =
"C# support in Godot Engine is in late alpha stage and, while already usable, " +
"it is not meant for use in production.\n\n" +
- "Projects can be exported to Linux, macOS and Windows, but not yet to mobile or web platforms. " +
+ "Projects can be exported to Linux, macOS, Windows and Android, but not yet to iOS, HTML5 or UWP. " +
"Bugs and usability issues will be addressed gradually over future releases, " +
"potentially including compatibility breaking changes as new features are implemented for a better overall C# experience.\n\n" +
"If you experience issues with this Mono build, please report them on Godot's issue tracker with details about your system, MSBuild version, IDE, etc.:\n\n" +
@@ -407,7 +377,7 @@ namespace GodotTools
if (File.Exists(GodotSharpDirs.ProjectSlnPath) && File.Exists(GodotSharpDirs.ProjectCsProjPath))
{
// Make sure the existing project has Api assembly references configured correctly
- CSharpProject.FixApiHintPath(GodotSharpDirs.ProjectCsProjPath);
+ CsProjOperations.FixApiHintPath(GodotSharpDirs.ProjectCsProjPath);
}
else
{
@@ -427,25 +397,25 @@ namespace GodotTools
AddControlToContainer(CustomControlContainer.Toolbar, buildButton);
// External editor settings
- EditorDef("mono/editor/external_editor", ExternalEditor.None);
+ EditorDef("mono/editor/external_editor", ExternalEditorId.None);
string settingsHintStr = "Disabled";
if (OS.IsWindows())
{
- settingsHintStr += $",MonoDevelop:{(int) ExternalEditor.MonoDevelop}" +
- $",Visual Studio Code:{(int) ExternalEditor.VsCode}";
+ settingsHintStr += $",MonoDevelop:{(int) ExternalEditorId.MonoDevelop}" +
+ $",Visual Studio Code:{(int) ExternalEditorId.VsCode}";
}
else if (OS.IsOSX())
{
- settingsHintStr += $",Visual Studio:{(int) ExternalEditor.VisualStudioForMac}" +
- $",MonoDevelop:{(int) ExternalEditor.MonoDevelop}" +
- $",Visual Studio Code:{(int) ExternalEditor.VsCode}";
+ settingsHintStr += $",Visual Studio:{(int) ExternalEditorId.VisualStudioForMac}" +
+ $",MonoDevelop:{(int) ExternalEditorId.MonoDevelop}" +
+ $",Visual Studio Code:{(int) ExternalEditorId.VsCode}";
}
else if (OS.IsUnix())
{
- settingsHintStr += $",MonoDevelop:{(int) ExternalEditor.MonoDevelop}" +
- $",Visual Studio Code:{(int) ExternalEditor.VsCode}";
+ settingsHintStr += $",MonoDevelop:{(int) ExternalEditorId.MonoDevelop}" +
+ $",Visual Studio Code:{(int) ExternalEditorId.VsCode}";
}
editorSettings.AddPropertyInfo(new Godot.Collections.Dictionary
@@ -461,7 +431,10 @@ namespace GodotTools
AddExportPlugin(exportPlugin);
exportPluginWeak = WeakRef(exportPlugin);
- GodotSharpBuilds.Initialize();
+ BuildManager.Initialize();
+
+ GodotIdeManager = new GodotIdeManager();
+ AddChild(GodotIdeManager);
}
protected override void Dispose(bool disposing)
@@ -478,6 +451,8 @@ namespace GodotTools
exportPluginWeak.Dispose();
}
+
+ GodotIdeManager?.Dispose();
}
public void OnBeforeSerialize()
diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpExport.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpExport.cs
index b80fe1fab7..aefc51545e 100644
--- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpExport.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpExport.cs
@@ -65,14 +65,14 @@ namespace GodotTools
string buildConfig = isDebug ? "Debug" : "Release";
string scriptsMetadataPath = Path.Combine(GodotSharpDirs.ResMetadataDir, $"scripts_metadata.{(isDebug ? "debug" : "release")}");
- CSharpProject.GenerateScriptsMetadata(GodotSharpDirs.ProjectCsProjPath, scriptsMetadataPath);
+ CsProjOperations.GenerateScriptsMetadata(GodotSharpDirs.ProjectCsProjPath, scriptsMetadataPath);
AddFile(scriptsMetadataPath, scriptsMetadataPath);
// Turn export features into defines
var godotDefines = features;
- if (!GodotSharpBuilds.BuildProjectBlocking(buildConfig, godotDefines))
+ if (!BuildManager.BuildProjectBlocking(buildConfig, godotDefines))
{
GD.PushError("Failed to build project");
return;
diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotTools.csproj b/modules/mono/editor/GodotTools/GodotTools/GodotTools.csproj
index 01e8c87d14..3c57900873 100644
--- a/modules/mono/editor/GodotTools/GodotTools/GodotTools.csproj
+++ b/modules/mono/editor/GodotTools/GodotTools/GodotTools.csproj
@@ -10,6 +10,7 @@
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<GodotSourceRootPath>$(SolutionDir)/../../../../</GodotSourceRootPath>
<GodotApiConfiguration>Debug</GodotApiConfiguration>
+ <LangVersion>7</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -39,26 +40,31 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Build\MsBuildFinder.cs" />
+ <Compile Include="ExternalEditorId.cs" />
+ <Compile Include="Ides\GodotIdeManager.cs" />
+ <Compile Include="Ides\GodotIdeServer.cs" />
+ <Compile Include="Ides\MonoDevelop\EditorId.cs" />
+ <Compile Include="Ides\MonoDevelop\Instance.cs" />
<Compile Include="Internals\BindingsGenerator.cs" />
<Compile Include="Internals\EditorProgress.cs" />
<Compile Include="Internals\GodotSharpDirs.cs" />
<Compile Include="Internals\Internal.cs" />
<Compile Include="Internals\ScriptClassParser.cs" />
<Compile Include="Internals\Globals.cs" />
- <Compile Include="MonoDevelopInstance.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Build\BuildSystem.cs" />
<Compile Include="Utils\Directory.cs" />
<Compile Include="Utils\File.cs" />
+ <Compile Include="Utils\NotifyAwaiter.cs" />
<Compile Include="Utils\OS.cs" />
<Compile Include="GodotSharpEditor.cs" />
- <Compile Include="GodotSharpBuilds.cs" />
+ <Compile Include="BuildManager.cs" />
<Compile Include="HotReloadAssemblyWatcher.cs" />
- <Compile Include="MonoBuildInfo.cs" />
- <Compile Include="MonoBuildTab.cs" />
- <Compile Include="MonoBottomPanel.cs" />
+ <Compile Include="BuildInfo.cs" />
+ <Compile Include="BuildTab.cs" />
+ <Compile Include="BottomPanel.cs" />
<Compile Include="GodotSharpExport.cs" />
- <Compile Include="CSharpProject.cs" />
+ <Compile Include="CsProjOperations.cs" />
<Compile Include="Utils\CollectionExtensions.cs" />
</ItemGroup>
<ItemGroup>
@@ -66,6 +72,10 @@
<Project>{6ce9a984-37b1-4f8a-8fe9-609f05f071b3}</Project>
<Name>GodotTools.BuildLogger</Name>
</ProjectReference>
+ <ProjectReference Include="..\GodotTools.IdeConnection\GodotTools.IdeConnection.csproj">
+ <Project>{92600954-25f0-4291-8e11-1fee9fc4be20}</Project>
+ <Name>GodotTools.IdeConnection</Name>
+ </ProjectReference>
<ProjectReference Include="..\GodotTools.ProjectEditor\GodotTools.ProjectEditor.csproj">
<Project>{A8CDAD94-C6D4-4B19-A7E7-76C53CC92984}</Project>
<Name>GodotTools.ProjectEditor</Name>
@@ -75,8 +85,5 @@
<Name>GodotTools.Core</Name>
</ProjectReference>
</ItemGroup>
- <ItemGroup>
- <Folder Include="Editor" />
- </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project> \ No newline at end of file
diff --git a/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeManager.cs b/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeManager.cs
new file mode 100644
index 0000000000..9e24138143
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeManager.cs
@@ -0,0 +1,166 @@
+using System;
+using System.IO;
+using Godot;
+using GodotTools.IdeConnection;
+using GodotTools.Internals;
+
+namespace GodotTools.Ides
+{
+ public class GodotIdeManager : Node, ISerializationListener
+ {
+ public GodotIdeServer GodotIdeServer { get; private set; }
+
+ private MonoDevelop.Instance monoDevelInstance;
+ private MonoDevelop.Instance vsForMacInstance;
+
+ private GodotIdeServer GetRunningServer()
+ {
+ if (GodotIdeServer != null && !GodotIdeServer.IsDisposed)
+ return GodotIdeServer;
+ StartServer();
+ return GodotIdeServer;
+ }
+
+ public override void _Ready()
+ {
+ StartServer();
+ }
+
+ public void OnBeforeSerialize()
+ {
+ GodotIdeServer?.Dispose();
+ }
+
+ public void OnAfterDeserialize()
+ {
+ StartServer();
+ }
+
+ private ILogger logger;
+
+ protected ILogger Logger
+ {
+ get => logger ?? (logger = new ConsoleLogger());
+ set => logger = value;
+ }
+
+ private void StartServer()
+ {
+ GodotIdeServer?.Dispose();
+ GodotIdeServer = new GodotIdeServer(LaunchIde,
+ OS.GetExecutablePath(),
+ ProjectSettings.GlobalizePath(GodotSharpDirs.ResMetadataDir));
+
+ GodotIdeServer.Logger = Logger;
+
+ GodotIdeServer.StartServer();
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ base.Dispose(disposing);
+
+ GodotIdeServer?.Dispose();
+ }
+
+ private void LaunchIde()
+ {
+ var editor = (ExternalEditorId) GodotSharpEditor.Instance.GetEditorInterface()
+ .GetEditorSettings().GetSetting("mono/editor/external_editor");
+
+ switch (editor)
+ {
+ case ExternalEditorId.None:
+ case ExternalEditorId.VisualStudio:
+ case ExternalEditorId.VsCode:
+ throw new NotSupportedException();
+ case ExternalEditorId.VisualStudioForMac:
+ goto case ExternalEditorId.MonoDevelop;
+ case ExternalEditorId.MonoDevelop:
+ {
+ MonoDevelop.Instance GetMonoDevelopInstance(string solutionPath)
+ {
+ if (Utils.OS.IsOSX() && editor == ExternalEditorId.VisualStudioForMac)
+ {
+ vsForMacInstance = vsForMacInstance ??
+ new MonoDevelop.Instance(solutionPath, MonoDevelop.EditorId.VisualStudioForMac);
+ return vsForMacInstance;
+ }
+
+ monoDevelInstance = monoDevelInstance ??
+ new MonoDevelop.Instance(solutionPath, MonoDevelop.EditorId.MonoDevelop);
+ return monoDevelInstance;
+ }
+
+ try
+ {
+ var instance = GetMonoDevelopInstance(GodotSharpDirs.ProjectSlnPath);
+
+ if (!instance.IsRunning)
+ instance.Execute();
+ }
+ catch (FileNotFoundException)
+ {
+ string editorName = editor == ExternalEditorId.VisualStudioForMac ? "Visual Studio" : "MonoDevelop";
+ GD.PushError($"Cannot find code editor: {editorName}");
+ }
+
+ break;
+ }
+
+ default:
+ throw new ArgumentOutOfRangeException();
+ }
+ }
+
+ private void WriteMessage(string id, params string[] arguments)
+ {
+ GetRunningServer().WriteMessage(new Message(id, arguments));
+ }
+
+ public void SendOpenFile(string file)
+ {
+ WriteMessage("OpenFile", file);
+ }
+
+ public void SendOpenFile(string file, int line)
+ {
+ WriteMessage("OpenFile", file, line.ToString());
+ }
+
+ public void SendOpenFile(string file, int line, int column)
+ {
+ WriteMessage("OpenFile", file, line.ToString(), column.ToString());
+ }
+
+ private class GodotLogger : ILogger
+ {
+ public void LogDebug(string message)
+ {
+ if (OS.IsStdoutVerbose())
+ Console.WriteLine(message);
+ }
+
+ public void LogInfo(string message)
+ {
+ if (OS.IsStdoutVerbose())
+ Console.WriteLine(message);
+ }
+
+ public void LogWarning(string message)
+ {
+ GD.PushWarning(message);
+ }
+
+ public void LogError(string message)
+ {
+ GD.PushError(message);
+ }
+
+ public void LogError(string message, Exception e)
+ {
+ GD.PushError(message + "\n" + e);
+ }
+ }
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeServer.cs b/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeServer.cs
new file mode 100644
index 0000000000..309b917c71
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeServer.cs
@@ -0,0 +1,212 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using GodotTools.IdeConnection;
+using GodotTools.Internals;
+using GodotTools.Utils;
+using Directory = System.IO.Directory;
+using File = System.IO.File;
+using Thread = System.Threading.Thread;
+
+namespace GodotTools.Ides
+{
+ public class GodotIdeServer : GodotIdeBase
+ {
+ private readonly TcpListener listener;
+ private readonly FileStream metaFile;
+ private readonly Action launchIdeAction;
+ private readonly NotifyAwaiter<bool> clientConnectedAwaiter = new NotifyAwaiter<bool>();
+
+ private async Task<bool> AwaitClientConnected()
+ {
+ return await clientConnectedAwaiter.Reset();
+ }
+
+ public GodotIdeServer(Action launchIdeAction, string editorExecutablePath, string projectMetadataDir)
+ : base(projectMetadataDir)
+ {
+ messageHandlers = InitializeMessageHandlers();
+
+ this.launchIdeAction = launchIdeAction;
+
+ // Make sure the directory exists
+ Directory.CreateDirectory(projectMetadataDir);
+
+ // The Godot editor's file system thread can keep the file open for writing, so we are forced to allow write sharing...
+ const FileShare metaFileShare = FileShare.ReadWrite;
+
+ metaFile = File.Open(MetaFilePath, FileMode.Create, FileAccess.Write, metaFileShare);
+
+ listener = new TcpListener(new IPEndPoint(IPAddress.Loopback, port: 0));
+ listener.Start();
+
+ int port = ((IPEndPoint) listener.Server.LocalEndPoint).Port;
+ using (var metaFileWriter = new StreamWriter(metaFile, Encoding.UTF8))
+ {
+ metaFileWriter.WriteLine(port);
+ metaFileWriter.WriteLine(editorExecutablePath);
+ }
+
+ StartServer();
+ }
+
+ public void StartServer()
+ {
+ var serverThread = new Thread(RunServerThread) {Name = "Godot Ide Connection Server"};
+ serverThread.Start();
+ }
+
+ private void RunServerThread()
+ {
+ SynchronizationContext.SetSynchronizationContext(Godot.Dispatcher.SynchronizationContext);
+
+ try
+ {
+ while (!IsDisposed)
+ {
+ TcpClient tcpClient = listener.AcceptTcpClient();
+
+ Logger.LogInfo("Connection open with Ide Client");
+
+ lock (ConnectionLock)
+ {
+ Connection = new GodotIdeConnectionServer(tcpClient, HandleMessage);
+ Connection.Logger = Logger;
+ }
+
+ Connected += () => clientConnectedAwaiter.SetResult(true);
+
+ Connection.Start();
+ }
+ }
+ catch (Exception e)
+ {
+ if (!IsDisposed && !(e is SocketException se && se.SocketErrorCode == SocketError.Interrupted))
+ throw;
+ }
+ }
+
+ public async void WriteMessage(Message message)
+ {
+ async Task LaunchIde()
+ {
+ if (IsConnected)
+ return;
+
+ launchIdeAction();
+ await Task.WhenAny(Task.Delay(10000), AwaitClientConnected());
+ }
+
+ await LaunchIde();
+
+ if (!IsConnected)
+ {
+ Logger.LogError("Cannot write message: Godot Ide Server not connected");
+ return;
+ }
+
+ Connection.WriteMessage(message);
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ base.Dispose(disposing);
+
+ if (disposing)
+ {
+ listener?.Stop();
+
+ metaFile?.Dispose();
+
+ File.Delete(MetaFilePath);
+ }
+ }
+
+ protected virtual bool HandleMessage(Message message)
+ {
+ if (messageHandlers.TryGetValue(message.Id, out var action))
+ {
+ action(message.Arguments);
+ return true;
+ }
+
+ return false;
+ }
+
+ private readonly Dictionary<string, Action<string[]>> messageHandlers;
+
+ private Dictionary<string, Action<string[]>> InitializeMessageHandlers()
+ {
+ return new Dictionary<string, Action<string[]>>
+ {
+ ["Play"] = args =>
+ {
+ switch (args.Length)
+ {
+ case 0:
+ Play();
+ return;
+ case 2:
+ Play(debuggerHost: args[0], debuggerPort: int.Parse(args[1]));
+ return;
+ default:
+ throw new ArgumentException();
+ }
+ },
+ ["ReloadScripts"] = args => ReloadScripts()
+ };
+ }
+
+ private void DispatchToMainThread(Action action)
+ {
+ var d = new SendOrPostCallback(state => action());
+ Godot.Dispatcher.SynchronizationContext.Post(d, null);
+ }
+
+ private void Play()
+ {
+ DispatchToMainThread(() =>
+ {
+ CurrentPlayRequest = new PlayRequest();
+ Internal.EditorRunPlay();
+ CurrentPlayRequest = null;
+ });
+ }
+
+ private void Play(string debuggerHost, int debuggerPort)
+ {
+ DispatchToMainThread(() =>
+ {
+ CurrentPlayRequest = new PlayRequest(debuggerHost, debuggerPort);
+ Internal.EditorRunPlay();
+ CurrentPlayRequest = null;
+ });
+ }
+
+ private void ReloadScripts()
+ {
+ DispatchToMainThread(Internal.ScriptEditorDebugger_ReloadScripts);
+ }
+
+ public PlayRequest? CurrentPlayRequest { get; private set; }
+
+ public struct PlayRequest
+ {
+ public bool HasDebugger { get; }
+ public string DebuggerHost { get; }
+ public int DebuggerPort { get; }
+
+ public PlayRequest(string debuggerHost, int debuggerPort)
+ {
+ HasDebugger = true;
+ DebuggerHost = debuggerHost;
+ DebuggerPort = debuggerPort;
+ }
+ }
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/EditorId.cs b/modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/EditorId.cs
new file mode 100644
index 0000000000..1dfc91d6d1
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/EditorId.cs
@@ -0,0 +1,8 @@
+namespace GodotTools.Ides.MonoDevelop
+{
+ public enum EditorId
+ {
+ MonoDevelop = 0,
+ VisualStudioForMac = 1
+ }
+}
diff --git a/modules/mono/editor/GodotTools/GodotTools/MonoDevelopInstance.cs b/modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/Instance.cs
index 61a0a992ce..1fdccf5bbd 100644
--- a/modules/mono/editor/GodotTools/GodotTools/MonoDevelopInstance.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/Instance.cs
@@ -1,4 +1,3 @@
-using GodotTools.Core;
using System;
using System.IO;
using System.Collections.Generic;
@@ -6,22 +5,18 @@ using System.Diagnostics;
using GodotTools.Internals;
using GodotTools.Utils;
-namespace GodotTools
+namespace GodotTools.Ides.MonoDevelop
{
- public class MonoDevelopInstance
+ public class Instance
{
- public enum EditorId
- {
- MonoDevelop = 0,
- VisualStudioForMac = 1
- }
-
private readonly string solutionFile;
private readonly EditorId editorId;
private Process process;
- public void Execute(params string[] files)
+ public bool IsRunning => process != null && !process.HasExited;
+
+ public void Execute()
{
bool newWindow = process == null || process.HasExited;
@@ -29,7 +24,7 @@ namespace GodotTools
string command;
- if (Utils.OS.IsOSX())
+ if (OS.IsOSX())
{
string bundleId = BundleIds[editorId];
@@ -61,16 +56,6 @@ namespace GodotTools
if (newWindow)
args.Add("\"" + Path.GetFullPath(solutionFile) + "\"");
- foreach (var file in files)
- {
- int semicolonIndex = file.IndexOf(';');
-
- string filePath = semicolonIndex < 0 ? file : file.Substring(0, semicolonIndex);
- string cursor = semicolonIndex < 0 ? string.Empty : file.Substring(semicolonIndex);
-
- args.Add("\"" + Path.GetFullPath(filePath.NormalizePath()) + cursor + "\"");
- }
-
if (command == null)
throw new FileNotFoundException();
@@ -80,7 +65,7 @@ namespace GodotTools
{
FileName = command,
Arguments = string.Join(" ", args),
- UseShellExecute = false
+ UseShellExecute = true
});
}
else
@@ -89,14 +74,14 @@ namespace GodotTools
{
FileName = command,
Arguments = string.Join(" ", args),
- UseShellExecute = false
+ UseShellExecute = true
})?.Dispose();
}
}
- public MonoDevelopInstance(string solutionFile, EditorId editorId)
+ public Instance(string solutionFile, EditorId editorId)
{
- if (editorId == EditorId.VisualStudioForMac && !Utils.OS.IsOSX())
+ if (editorId == EditorId.VisualStudioForMac && !OS.IsOSX())
throw new InvalidOperationException($"{nameof(EditorId.VisualStudioForMac)} not supported on this platform");
this.solutionFile = solutionFile;
@@ -106,9 +91,9 @@ namespace GodotTools
private static readonly IReadOnlyDictionary<EditorId, string> ExecutableNames;
private static readonly IReadOnlyDictionary<EditorId, string> BundleIds;
- static MonoDevelopInstance()
+ static Instance()
{
- if (Utils.OS.IsOSX())
+ if (OS.IsOSX())
{
ExecutableNames = new Dictionary<EditorId, string>
{
@@ -122,7 +107,7 @@ namespace GodotTools
{EditorId.VisualStudioForMac, "com.microsoft.visual-studio"}
};
}
- else if (Utils.OS.IsWindows())
+ else if (OS.IsWindows())
{
ExecutableNames = new Dictionary<EditorId, string>
{
@@ -133,7 +118,7 @@ namespace GodotTools
{EditorId.MonoDevelop, "MonoDevelop.exe"}
};
}
- else if (Utils.OS.IsUnix())
+ else if (OS.IsUnix())
{
ExecutableNames = new Dictionary<EditorId, string>
{
diff --git a/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs b/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs
index 9526dd3c6f..7783576910 100644
--- a/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs
@@ -46,6 +46,12 @@ namespace GodotTools.Internals
public static string MonoWindowsInstallRoot => internal_MonoWindowsInstallRoot();
+ public static void EditorRunPlay() => internal_EditorRunPlay();
+
+ public static void EditorRunStop() => internal_EditorRunStop();
+
+ public static void ScriptEditorDebugger_ReloadScripts() => internal_ScriptEditorDebugger_ReloadScripts();
+
// Internal Calls
[MethodImpl(MethodImplOptions.InternalCall)]
@@ -95,5 +101,14 @@ namespace GodotTools.Internals
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_MonoWindowsInstallRoot();
+
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern void internal_EditorRunPlay();
+
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern void internal_EditorRunStop();
+
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern void internal_ScriptEditorDebugger_ReloadScripts();
}
}
diff --git a/modules/mono/editor/GodotTools/GodotTools/Utils/CollectionExtensions.cs b/modules/mono/editor/GodotTools/GodotTools/Utils/CollectionExtensions.cs
index 288c65de74..e3c2c822a5 100644
--- a/modules/mono/editor/GodotTools/GodotTools/Utils/CollectionExtensions.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/Utils/CollectionExtensions.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.IO;
namespace GodotTools.Utils
{
@@ -17,5 +18,12 @@ namespace GodotTools.Utils
return orElse;
}
+
+ public static IEnumerable<string> EnumerateLines(this TextReader textReader)
+ {
+ string line;
+ while ((line = textReader.ReadLine()) != null)
+ yield return line;
+ }
}
}
diff --git a/modules/mono/editor/GodotTools/GodotTools/Utils/NotifyAwaiter.cs b/modules/mono/editor/GodotTools/GodotTools/Utils/NotifyAwaiter.cs
new file mode 100644
index 0000000000..700b786752
--- /dev/null
+++ b/modules/mono/editor/GodotTools/GodotTools/Utils/NotifyAwaiter.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Runtime.CompilerServices;
+
+namespace GodotTools.Utils
+{
+ public sealed class NotifyAwaiter<T> : INotifyCompletion
+ {
+ private Action continuation;
+ private Exception exception;
+ private T result;
+
+ public bool IsCompleted { get; private set; }
+
+ public T GetResult()
+ {
+ if (exception != null)
+ throw exception;
+ return result;
+ }
+
+ public void OnCompleted(Action continuation)
+ {
+ if (this.continuation != null)
+ throw new InvalidOperationException("This awaiter has already been listened");
+ this.continuation = continuation;
+ }
+
+ public void SetResult(T result)
+ {
+ if (IsCompleted)
+ throw new InvalidOperationException("This awaiter is already completed");
+
+ IsCompleted = true;
+ this.result = result;
+
+ continuation?.Invoke();
+ }
+
+ public void SetException(Exception exception)
+ {
+ if (IsCompleted)
+ throw new InvalidOperationException("This awaiter is already completed");
+
+ IsCompleted = true;
+ this.exception = exception;
+
+ continuation?.Invoke();
+ }
+
+ public NotifyAwaiter<T> Reset()
+ {
+ continuation = null;
+ exception = null;
+ result = default(T);
+ IsCompleted = false;
+ return this;
+ }
+
+ public NotifyAwaiter<T> GetAwaiter()
+ {
+ return this;
+ }
+ }
+}
diff --git a/modules/mono/editor/editor_internal_calls.cpp b/modules/mono/editor/editor_internal_calls.cpp
index 0014aaca70..cd1ca2a2c7 100644
--- a/modules/mono/editor/editor_internal_calls.cpp
+++ b/modules/mono/editor/editor_internal_calls.cpp
@@ -271,7 +271,7 @@ MonoString *godot_icall_Internal_SimplifyGodotPath(MonoString *p_path) {
MonoBoolean godot_icall_Internal_IsOsxAppBundleInstalled(MonoString *p_bundle_id) {
#ifdef OSX_ENABLED
String bundle_id = GDMonoMarshal::mono_string_to_godot(p_bundle_id);
- return (MonoBoolean)osx_is_app_bundle_installed;
+ return (MonoBoolean)osx_is_app_bundle_installed(bundle_id);
#else
(void)p_bundle_id; // UNUSED
return (MonoBoolean) false;
@@ -350,6 +350,21 @@ MonoString *godot_icall_Internal_MonoWindowsInstallRoot() {
#endif
}
+void godot_icall_Internal_EditorRunPlay() {
+ EditorNode::get_singleton()->run_play();
+}
+
+void godot_icall_Internal_EditorRunStop() {
+ EditorNode::get_singleton()->run_stop();
+}
+
+void godot_icall_Internal_ScriptEditorDebugger_ReloadScripts() {
+ ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
+ if (sed) {
+ sed->reload_scripts();
+ }
+}
+
MonoString *godot_icall_Utils_OS_GetPlatformName() {
String os_name = OS::get_singleton()->get_name();
return GDMonoMarshal::mono_string_from_godot(os_name);
@@ -414,7 +429,9 @@ void register_editor_internal_calls() {
mono_add_internal_call("GodotTools.Internals.Internal::internal_ScriptEditorEdit", (void *)godot_icall_Internal_ScriptEditorEdit);
mono_add_internal_call("GodotTools.Internals.Internal::internal_EditorNodeShowScriptScreen", (void *)godot_icall_Internal_EditorNodeShowScriptScreen);
mono_add_internal_call("GodotTools.Internals.Internal::internal_GetScriptsMetadataOrNothing", (void *)godot_icall_Internal_GetScriptsMetadataOrNothing);
- mono_add_internal_call("GodotTools.Internals.Internal::internal_MonoWindowsInstallRoot", (void *)godot_icall_Internal_MonoWindowsInstallRoot);
+ mono_add_internal_call("GodotTools.Internals.Internal::internal_EditorRunPlay", (void *)godot_icall_Internal_EditorRunPlay);
+ mono_add_internal_call("GodotTools.Internals.Internal::internal_EditorRunStop", (void *)godot_icall_Internal_EditorRunStop);
+ mono_add_internal_call("GodotTools.Internals.Internal::internal_ScriptEditorDebugger_ReloadScripts", (void *)godot_icall_Internal_ScriptEditorDebugger_ReloadScripts);
// Globals
mono_add_internal_call("GodotTools.Internals.Globals::internal_EditorScale", (void *)godot_icall_Globals_EditorScale);
diff --git a/modules/mono/glue/Managed/Files/Color.cs b/modules/mono/glue/Managed/Files/Color.cs
index 447697c671..3a52a1a13b 100644
--- a/modules/mono/glue/Managed/Files/Color.cs
+++ b/modules/mono/glue/Managed/Files/Color.cs
@@ -16,7 +16,11 @@ namespace Godot
{
get
{
- return (int)(r * 255.0f);
+ return (int)Math.Round(r * 255.0f);
+ }
+ set
+ {
+ r = value / 255.0f;
}
}
@@ -24,7 +28,11 @@ namespace Godot
{
get
{
- return (int)(g * 255.0f);
+ return (int)Math.Round(g * 255.0f);
+ }
+ set
+ {
+ g = value / 255.0f;
}
}
@@ -32,7 +40,11 @@ namespace Godot
{
get
{
- return (int)(b * 255.0f);
+ return (int)Math.Round(b * 255.0f);
+ }
+ set
+ {
+ b = value / 255.0f;
}
}
@@ -40,7 +52,11 @@ namespace Godot
{
get
{
- return (int)(a * 255.0f);
+ return (int)Math.Round(a * 255.0f);
+ }
+ set
+ {
+ a = value / 255.0f;
}
}
@@ -74,7 +90,7 @@ namespace Godot
}
set
{
- this = FromHsv(value, s, v);
+ this = FromHsv(value, s, v, a);
}
}
@@ -91,7 +107,7 @@ namespace Godot
}
set
{
- this = FromHsv(h, value, v);
+ this = FromHsv(h, value, v, a);
}
}
@@ -103,7 +119,7 @@ namespace Godot
}
set
{
- this = FromHsv(h, s, value);
+ this = FromHsv(h, s, value, a);
}
}
@@ -166,12 +182,12 @@ namespace Godot
}
}
- public static void ToHsv(Color color, out float hue, out float saturation, out float value)
+ public void ToHsv(out float hue, out float saturation, out float value)
{
- int max = Mathf.Max(color.r8, Mathf.Max(color.g8, color.b8));
- int min = Mathf.Min(color.r8, Mathf.Min(color.g8, color.b8));
+ float max = (float)Mathf.Max(r, Mathf.Max(g, b));
+ float min = (float)Mathf.Min(r, Mathf.Min(g, b));
- int delta = max - min;
+ float delta = max - min;
if (delta == 0)
{
@@ -179,12 +195,12 @@ namespace Godot
}
else
{
- if (color.r == max)
- hue = (color.g - color.b) / delta; // Between yellow & magenta
- else if (color.g == max)
- hue = 2 + (color.b - color.r) / delta; // Between cyan & yellow
+ if (r == max)
+ hue = (g - b) / delta; // Between yellow & magenta
+ else if (g == max)
+ hue = 2 + (b - r) / delta; // Between cyan & yellow
else
- hue = 4 + (color.r - color.g) / delta; // Between magenta & cyan
+ hue = 4 + (r - g) / delta; // Between magenta & cyan
hue /= 6.0f;
@@ -193,7 +209,7 @@ namespace Godot
}
saturation = max == 0 ? 0 : 1f - 1f * min / max;
- value = max / 255f;
+ value = max;
}
public static Color FromHsv(float hue, float saturation, float value, float alpha = 1.0f)
@@ -257,7 +273,8 @@ namespace Godot
return new Color(
(r + 0.5f) % 1.0f,
(g + 0.5f) % 1.0f,
- (b + 0.5f) % 1.0f
+ (b + 0.5f) % 1.0f,
+ a
);
}
@@ -275,7 +292,8 @@ namespace Godot
return new Color(
1.0f - r,
1.0f - g,
- 1.0f - b
+ 1.0f - b,
+ a
);
}
diff --git a/modules/mono/glue/Managed/Files/Colors.cs b/modules/mono/glue/Managed/Files/Colors.cs
index bc2a1a3bd7..f41f5e9fc8 100644
--- a/modules/mono/glue/Managed/Files/Colors.cs
+++ b/modules/mono/glue/Managed/Files/Colors.cs
@@ -141,6 +141,7 @@ namespace Godot
{"teal", new Color(0.00f, 0.50f, 0.50f)},
{"thistle", new Color(0.85f, 0.75f, 0.85f)},
{"tomato", new Color(1.00f, 0.39f, 0.28f)},
+ {"transparent", new Color(1.00f, 1.00f, 1.00f, 0.00f)},
{"turquoise", new Color(0.25f, 0.88f, 0.82f)},
{"violet", new Color(0.93f, 0.51f, 0.93f)},
{"webgreen", new Color(0.00f, 0.50f, 0.00f)},
@@ -187,7 +188,7 @@ namespace Godot
public static Color DarkOrchid { get { return namedColors["darkorchid"]; } }
public static Color DarkRed { get { return namedColors["darkred"]; } }
public static Color DarkSalmon { get { return namedColors["darksalmon"]; } }
- public static Color DarkSeagreen { get { return namedColors["darkseagreen"]; } }
+ public static Color DarkSeaGreen { get { return namedColors["darkseagreen"]; } }
public static Color DarkSlateBlue { get { return namedColors["darkslateblue"]; } }
public static Color DarkSlateGray { get { return namedColors["darkslategray"]; } }
public static Color DarkTurquoise { get { return namedColors["darkturquoise"]; } }
@@ -288,6 +289,7 @@ namespace Godot
public static Color Teal { get { return namedColors["teal"]; } }
public static Color Thistle { get { return namedColors["thistle"]; } }
public static Color Tomato { get { return namedColors["tomato"]; } }
+ public static Color Transparent { get { return namedColors["transparent"]; } }
public static Color Turquoise { get { return namedColors["turquoise"]; } }
public static Color Violet { get { return namedColors["violet"]; } }
public static Color WebGreen { get { return namedColors["webgreen"]; } }
diff --git a/modules/mono/glue/Managed/Files/Dispatcher.cs b/modules/mono/glue/Managed/Files/Dispatcher.cs
new file mode 100644
index 0000000000..072e0f20ff
--- /dev/null
+++ b/modules/mono/glue/Managed/Files/Dispatcher.cs
@@ -0,0 +1,13 @@
+using System.Runtime.CompilerServices;
+
+namespace Godot
+{
+ public static class Dispatcher
+ {
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern GodotTaskScheduler godot_icall_DefaultGodotTaskScheduler();
+
+ public static GodotSynchronizationContext SynchronizationContext =>
+ godot_icall_DefaultGodotTaskScheduler().Context;
+ }
+}
diff --git a/modules/mono/glue/Managed/Files/GodotSynchronizationContext.cs b/modules/mono/glue/Managed/Files/GodotSynchronizationContext.cs
index e727781d63..4b5e3f8761 100644
--- a/modules/mono/glue/Managed/Files/GodotSynchronizationContext.cs
+++ b/modules/mono/glue/Managed/Files/GodotSynchronizationContext.cs
@@ -6,17 +6,16 @@ namespace Godot
{
public class GodotSynchronizationContext : SynchronizationContext
{
- private readonly BlockingCollection<KeyValuePair<SendOrPostCallback, object>> queue = new BlockingCollection<KeyValuePair<SendOrPostCallback, object>>();
+ private readonly BlockingCollection<KeyValuePair<SendOrPostCallback, object>> _queue = new BlockingCollection<KeyValuePair<SendOrPostCallback, object>>();
public override void Post(SendOrPostCallback d, object state)
{
- queue.Add(new KeyValuePair<SendOrPostCallback, object>(d, state));
+ _queue.Add(new KeyValuePair<SendOrPostCallback, object>(d, state));
}
public void ExecutePendingContinuations()
{
- KeyValuePair<SendOrPostCallback, object> workItem;
- while (queue.TryTake(out workItem))
+ while (_queue.TryTake(out var workItem))
{
workItem.Key(workItem.Value);
}
diff --git a/modules/mono/glue/Managed/Files/GodotTaskScheduler.cs b/modules/mono/glue/Managed/Files/GodotTaskScheduler.cs
index 9a40fef5a9..8eaeea50dc 100644
--- a/modules/mono/glue/Managed/Files/GodotTaskScheduler.cs
+++ b/modules/mono/glue/Managed/Files/GodotTaskScheduler.cs
@@ -8,7 +8,7 @@ namespace Godot
{
public class GodotTaskScheduler : TaskScheduler
{
- private GodotSynchronizationContext Context { get; set; }
+ internal GodotSynchronizationContext Context { get; }
private readonly LinkedList<Task> _tasks = new LinkedList<Task>();
public GodotTaskScheduler()
@@ -28,14 +28,10 @@ namespace Godot
protected sealed override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
{
if (SynchronizationContext.Current != Context)
- {
return false;
- }
if (taskWasPreviouslyQueued)
- {
TryDequeue(task);
- }
return TryExecuteTask(task);
}
@@ -52,7 +48,8 @@ namespace Godot
{
lock (_tasks)
{
- return _tasks.ToArray();
+ foreach (Task task in _tasks)
+ yield return task;
}
}
diff --git a/modules/mono/glue/Managed/Files/Mathf.cs b/modules/mono/glue/Managed/Files/Mathf.cs
index 15adf0a13b..ce34cd6a99 100644
--- a/modules/mono/glue/Managed/Files/Mathf.cs
+++ b/modules/mono/glue/Managed/Files/Mathf.cs
@@ -158,6 +158,11 @@ namespace Godot
public static bool IsEqualApprox(real_t a, real_t b)
{
+ // Check for exact equality first, required to handle "infinity" values.
+ if (a == b) {
+ return true;
+ }
+ // Then check for approximate equality.
real_t tolerance = Epsilon * Abs(a);
if (tolerance < Epsilon) {
tolerance = Epsilon;
diff --git a/modules/mono/glue/Managed/Files/MathfEx.cs b/modules/mono/glue/Managed/Files/MathfEx.cs
index b96f01bc2e..6cffc7f01d 100644
--- a/modules/mono/glue/Managed/Files/MathfEx.cs
+++ b/modules/mono/glue/Managed/Files/MathfEx.cs
@@ -48,7 +48,12 @@ namespace Godot
public static bool IsEqualApprox(real_t a, real_t b, real_t tolerance)
{
+ // Check for exact equality first, required to handle "infinity" values.
+ if (a == b) {
+ return true;
+ }
+ // Then check for approximate equality.
return Abs(a - b) < tolerance;
}
}
-} \ No newline at end of file
+}
diff --git a/modules/mono/glue/Managed/Files/Vector2.cs b/modules/mono/glue/Managed/Files/Vector2.cs
index b1c1dae3c2..0daa94057e 100644
--- a/modules/mono/glue/Managed/Files/Vector2.cs
+++ b/modules/mono/glue/Managed/Files/Vector2.cs
@@ -14,10 +14,19 @@ using real_t = System.Single;
namespace Godot
{
+ /// <summary>
+ /// 2-element structure that can be used to represent positions in 2D space or any other pair of numeric values.
+ /// </summary>
[Serializable]
[StructLayout(LayoutKind.Sequential)]
public struct Vector2 : IEquatable<Vector2>
{
+ public enum Axis
+ {
+ X = 0,
+ Y
+ }
+
public real_t x;
public real_t y;
@@ -202,6 +211,22 @@ namespace Godot
return v;
}
+ public Vector2 PosMod(real_t mod)
+ {
+ Vector2 v;
+ v.x = Mathf.PosMod(x, mod);
+ v.y = Mathf.PosMod(y, mod);
+ return v;
+ }
+
+ public Vector2 PosMod(Vector2 modv)
+ {
+ Vector2 v;
+ v.x = Mathf.PosMod(x, modv.x);
+ v.y = Mathf.PosMod(y, modv.y);
+ return v;
+ }
+
public Vector2 Project(Vector2 onNormal)
{
return onNormal * (Dot(onNormal) / onNormal.LengthSquared());
@@ -236,6 +261,14 @@ namespace Godot
y = v.y;
}
+ public Vector2 Sign()
+ {
+ Vector2 v;
+ v.x = Mathf.Sign(x);
+ v.y = Mathf.Sign(y);
+ return v;
+ }
+
public Vector2 Slerp(Vector2 b, real_t t)
{
real_t theta = AngleTo(b);
@@ -265,7 +298,7 @@ namespace Godot
private static readonly Vector2 _up = new Vector2(0, -1);
private static readonly Vector2 _down = new Vector2(0, 1);
- private static readonly Vector2 _right = new Vector2(1, 0);
+ private static readonly Vector2 _right = new Vector2(1, 0);
private static readonly Vector2 _left = new Vector2(-1, 0);
public static Vector2 Zero { get { return _zero; } }
@@ -346,6 +379,20 @@ namespace Godot
return left;
}
+ public static Vector2 operator %(Vector2 vec, real_t divisor)
+ {
+ vec.x %= divisor;
+ vec.y %= divisor;
+ return vec;
+ }
+
+ public static Vector2 operator %(Vector2 vec, Vector2 divisorv)
+ {
+ vec.x %= divisorv.x;
+ vec.y %= divisorv.y;
+ return vec;
+ }
+
public static bool operator ==(Vector2 left, Vector2 right)
{
return left.Equals(right);
diff --git a/modules/mono/glue/Managed/Files/Vector3.cs b/modules/mono/glue/Managed/Files/Vector3.cs
index c2da7b8bb1..9076dbd3b0 100644
--- a/modules/mono/glue/Managed/Files/Vector3.cs
+++ b/modules/mono/glue/Managed/Files/Vector3.cs
@@ -14,6 +14,9 @@ using real_t = System.Single;
namespace Godot
{
+ /// <summary>
+ /// 3-element structure that can be used to represent positions in 3D space or any other pair of numeric values.
+ /// </summary>
[Serializable]
[StructLayout(LayoutKind.Sequential)]
public struct Vector3 : IEquatable<Vector3>
@@ -225,6 +228,24 @@ namespace Godot
);
}
+ public Vector3 PosMod(real_t mod)
+ {
+ Vector3 v;
+ v.x = Mathf.PosMod(x, mod);
+ v.y = Mathf.PosMod(y, mod);
+ v.z = Mathf.PosMod(z, mod);
+ return v;
+ }
+
+ public Vector3 PosMod(Vector3 modv)
+ {
+ Vector3 v;
+ v.x = Mathf.PosMod(x, modv.x);
+ v.y = Mathf.PosMod(y, modv.y);
+ v.z = Mathf.PosMod(z, modv.z);
+ return v;
+ }
+
public Vector3 Project(Vector3 onNormal)
{
return onNormal * (Dot(onNormal) / onNormal.LengthSquared());
@@ -264,6 +285,15 @@ namespace Godot
z = v.z;
}
+ public Vector3 Sign()
+ {
+ Vector3 v;
+ v.x = Mathf.Sign(x);
+ v.y = Mathf.Sign(y);
+ v.z = Mathf.Sign(z);
+ return v;
+ }
+
public Vector3 Slerp(Vector3 b, real_t t)
{
real_t theta = AngleTo(b);
@@ -397,6 +427,22 @@ namespace Godot
return left;
}
+ public static Vector3 operator %(Vector3 vec, real_t divisor)
+ {
+ vec.x %= divisor;
+ vec.y %= divisor;
+ vec.z %= divisor;
+ return vec;
+ }
+
+ public static Vector3 operator %(Vector3 vec, Vector3 divisorv)
+ {
+ vec.x %= divisorv.x;
+ vec.y %= divisorv.y;
+ vec.z %= divisorv.z;
+ return vec;
+ }
+
public static bool operator ==(Vector3 left, Vector3 right)
{
return left.Equals(right);
diff --git a/modules/mono/glue/Managed/Managed.csproj b/modules/mono/glue/Managed/Managed.csproj
index 61f738922b..c8eca71199 100644
--- a/modules/mono/glue/Managed/Managed.csproj
+++ b/modules/mono/glue/Managed/Managed.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -8,6 +8,7 @@
<RootNamespace>Managed</RootNamespace>
<AssemblyName>Managed</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <LangVersion>7</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>true</DebugSymbols>
@@ -37,4 +38,4 @@
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-</Project>
+</Project> \ No newline at end of file
diff --git a/modules/mono/glue/gd_glue.cpp b/modules/mono/glue/gd_glue.cpp
index 27fd715f60..8b9a1380d8 100644
--- a/modules/mono/glue/gd_glue.cpp
+++ b/modules/mono/glue/gd_glue.cpp
@@ -210,6 +210,10 @@ MonoString *godot_icall_GD_var2str(MonoObject *p_var) {
return GDMonoMarshal::mono_string_from_godot(vars);
}
+MonoObject *godot_icall_DefaultGodotTaskScheduler() {
+ return GDMonoUtils::mono_cache.task_scheduler_handle->get_target();
+}
+
void godot_register_gd_icalls() {
mono_add_internal_call("Godot.GD::godot_icall_GD_bytes2var", (void *)godot_icall_GD_bytes2var);
mono_add_internal_call("Godot.GD::godot_icall_GD_convert", (void *)godot_icall_GD_convert);
@@ -233,6 +237,9 @@ void godot_register_gd_icalls() {
mono_add_internal_call("Godot.GD::godot_icall_GD_type_exists", (void *)godot_icall_GD_type_exists);
mono_add_internal_call("Godot.GD::godot_icall_GD_var2bytes", (void *)godot_icall_GD_var2bytes);
mono_add_internal_call("Godot.GD::godot_icall_GD_var2str", (void *)godot_icall_GD_var2str);
+
+ // Dispatcher
+ mono_add_internal_call("Godot.Dispatcher::godot_icall_DefaultGodotTaskScheduler", (void *)godot_icall_DefaultGodotTaskScheduler);
}
#endif // MONO_GLUE_ENABLED
diff --git a/modules/mono/glue/gd_glue.h b/modules/mono/glue/gd_glue.h
index d4e20e2887..a34c0bc50f 100644
--- a/modules/mono/glue/gd_glue.h
+++ b/modules/mono/glue/gd_glue.h
@@ -75,6 +75,8 @@ MonoArray *godot_icall_GD_var2bytes(MonoObject *p_var, MonoBoolean p_full_object
MonoString *godot_icall_GD_var2str(MonoObject *p_var);
+MonoObject *godot_icall_DefaultGodotTaskScheduler();
+
// Register internal calls
void godot_register_gd_icalls();
diff --git a/modules/mono/mono_gd/android_mono_config.h b/modules/mono/mono_gd/android_mono_config.h
new file mode 100644
index 0000000000..c5cc244aec
--- /dev/null
+++ b/modules/mono/mono_gd/android_mono_config.h
@@ -0,0 +1,43 @@
+/*************************************************************************/
+/* android_mono_config.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef ANDROID_MONO_CONFIG_H
+#define ANDROID_MONO_CONFIG_H
+
+#ifdef ANDROID_ENABLED
+
+#include "core/ustring.h"
+
+// This function is defined in an auto-generated source file
+String get_godot_android_mono_config();
+
+#endif // ANDROID_ENABLED
+
+#endif // ANDROID_MONO_CONFIG_H
diff --git a/modules/mono/mono_gd/gd_mono.cpp b/modules/mono/mono_gd/gd_mono.cpp
index ee1ecf3be7..cd111abd4d 100644
--- a/modules/mono/mono_gd/gd_mono.cpp
+++ b/modules/mono/mono_gd/gd_mono.cpp
@@ -56,7 +56,7 @@
#endif
#ifdef ANDROID_ENABLED
-#include "android_mono_config.gen.h"
+#include "android_mono_config.h"
#endif
GDMono *GDMono::singleton = NULL;
@@ -317,6 +317,13 @@ void GDMono::initialize() {
return;
#endif
+#if !defined(WINDOWS_ENABLED) && !defined(NO_MONO_THREADS_SUSPEND_WORKAROUND)
+ // FIXME: Temporary workaround. See: https://github.com/godotengine/godot/issues/29812
+ if (!OS::get_singleton()->has_environment("MONO_THREADS_SUSPEND")) {
+ OS::get_singleton()->set_environment("MONO_THREADS_SUSPEND", "preemptive");
+ }
+#endif
+
root_domain = mono_jit_init_version("GodotEngine.RootDomain", "v4.0.30319");
ERR_FAIL_NULL_MSG(root_domain, "Mono: Failed to initialize runtime.");
@@ -556,14 +563,14 @@ bool GDMono::_load_corlib_assembly() {
}
#ifdef TOOLS_ENABLED
-bool GDMono::copy_prebuilt_api_assembly(APIAssembly::Type p_api_type) {
+bool GDMono::copy_prebuilt_api_assembly(APIAssembly::Type p_api_type, const String &p_config) {
bool &api_assembly_out_of_sync = (p_api_type == APIAssembly::API_CORE) ?
GDMono::get_singleton()->core_api_assembly_out_of_sync :
GDMono::get_singleton()->editor_api_assembly_out_of_sync;
- String src_dir = GodotSharpDirs::get_data_editor_prebuilt_api_dir().plus_file("Debug");
- String dst_dir = GodotSharpDirs::get_res_assemblies_dir();
+ String src_dir = GodotSharpDirs::get_data_editor_prebuilt_api_dir().plus_file(p_config);
+ String dst_dir = GodotSharpDirs::get_res_assemblies_base_dir().plus_file(p_config);
String assembly_name = p_api_type == APIAssembly::API_CORE ? CORE_API_ASSEMBLY_NAME : EDITOR_API_ASSEMBLY_NAME;
@@ -626,18 +633,28 @@ String GDMono::update_api_assemblies_from_prebuilt() {
if (!api_assembly_out_of_sync && FileAccess::exists(core_assembly_path) && FileAccess::exists(editor_assembly_path))
return String(); // No update needed
- print_verbose("Updating API assemblies");
+ const int CONFIGS_LEN = 2;
+ String configs[CONFIGS_LEN] = { String("Debug"), String("Release") };
+
+ for (int i = 0; i < CONFIGS_LEN; i++) {
+ String config = configs[i];
- String prebuilt_api_dir = GodotSharpDirs::get_data_editor_prebuilt_api_dir().plus_file("Debug");
- String prebuilt_core_dll_path = prebuilt_api_dir.plus_file(CORE_API_ASSEMBLY_NAME ".dll");
- String prebuilt_editor_dll_path = prebuilt_api_dir.plus_file(EDITOR_API_ASSEMBLY_NAME ".dll");
+ print_verbose("Updating '" + config + "' API assemblies");
- if (!FileAccess::exists(prebuilt_core_dll_path) || !FileAccess::exists(prebuilt_editor_dll_path))
- return FAIL_REASON(api_assembly_out_of_sync, /* prebuilt_exists: */ false);
+ String prebuilt_api_dir = GodotSharpDirs::get_data_editor_prebuilt_api_dir().plus_file(config);
+ String prebuilt_core_dll_path = prebuilt_api_dir.plus_file(CORE_API_ASSEMBLY_NAME ".dll");
+ String prebuilt_editor_dll_path = prebuilt_api_dir.plus_file(EDITOR_API_ASSEMBLY_NAME ".dll");
- // Copy the prebuilt Api
- if (!copy_prebuilt_api_assembly(APIAssembly::API_CORE) || !copy_prebuilt_api_assembly(APIAssembly::API_EDITOR))
- return FAIL_REASON(api_assembly_out_of_sync, /* prebuilt_exists: */ true);
+ if (!FileAccess::exists(prebuilt_core_dll_path) || !FileAccess::exists(prebuilt_editor_dll_path)) {
+ return FAIL_REASON(api_assembly_out_of_sync, /* prebuilt_exists: */ false);
+ }
+
+ // Copy the prebuilt Api
+ if (!copy_prebuilt_api_assembly(APIAssembly::API_CORE, config) ||
+ !copy_prebuilt_api_assembly(APIAssembly::API_EDITOR, config)) {
+ return FAIL_REASON(api_assembly_out_of_sync, /* prebuilt_exists: */ true);
+ }
+ }
return String(); // Updated successfully
diff --git a/modules/mono/mono_gd/gd_mono.h b/modules/mono/mono_gd/gd_mono.h
index c5bcce4fa1..4f7d3791f7 100644
--- a/modules/mono/mono_gd/gd_mono.h
+++ b/modules/mono/mono_gd/gd_mono.h
@@ -165,7 +165,7 @@ public:
#endif
#ifdef TOOLS_ENABLED
- bool copy_prebuilt_api_assembly(APIAssembly::Type p_api_type);
+ bool copy_prebuilt_api_assembly(APIAssembly::Type p_api_type, const String &p_config);
String update_api_assemblies_from_prebuilt();
#endif
diff --git a/modules/recast/navigation_mesh_generator.cpp b/modules/recast/navigation_mesh_generator.cpp
index 14467dc5c7..c5b60f2dca 100644
--- a/modules/recast/navigation_mesh_generator.cpp
+++ b/modules/recast/navigation_mesh_generator.cpp
@@ -49,6 +49,10 @@
#include "modules/csg/csg_shape.h"
#endif
+#ifdef MODULE_GRIDMAP_ENABLED
+#include "modules/gridmap/grid_map.h"
+#endif
+
EditorNavigationMeshGenerator *EditorNavigationMeshGenerator::singleton = NULL;
void EditorNavigationMeshGenerator::_add_vertex(const Vector3 &p_vec3, Vector<float> &p_verticies) {
@@ -240,8 +244,21 @@ void EditorNavigationMeshGenerator::_parse_geometry(Transform p_accumulated_tran
}
}
- if (Object::cast_to<Spatial>(p_node)) {
+#ifdef MODULE_GRIDMAP_ENABLED
+ if (Object::cast_to<GridMap>(p_node) && p_generate_from != NavigationMesh::PARSED_GEOMETRY_STATIC_COLLIDERS) {
+ GridMap *gridmap_instance = Object::cast_to<GridMap>(p_node);
+ Array meshes = gridmap_instance->get_meshes();
+ Transform xform = gridmap_instance->get_transform();
+ for (int i = 0; i < meshes.size(); i += 2) {
+ Ref<Mesh> mesh = meshes[i + 1];
+ if (mesh.is_valid()) {
+ _add_mesh(mesh, p_accumulated_transform * xform * meshes[i], p_verticies, p_indices);
+ }
+ }
+ }
+#endif
+ if (Object::cast_to<Spatial>(p_node)) {
Spatial *spatial = Object::cast_to<Spatial>(p_node);
p_accumulated_transform = p_accumulated_transform * spatial->get_transform();
}
diff --git a/modules/tinyexr/image_loader_tinyexr.h b/modules/tinyexr/image_loader_tinyexr.h
index 4003fdc802..ee8479b1b4 100644
--- a/modules/tinyexr/image_loader_tinyexr.h
+++ b/modules/tinyexr/image_loader_tinyexr.h
@@ -33,9 +33,6 @@
#include "core/io/image_loader.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class ImageLoaderTinyEXR : public ImageFormatLoader {
public:
diff --git a/modules/visual_script/visual_script_editor.cpp b/modules/visual_script/visual_script_editor.cpp
index eef3f0f8ae..8faa342bbe 100644
--- a/modules/visual_script/visual_script_editor.cpp
+++ b/modules/visual_script/visual_script_editor.cpp
@@ -591,6 +591,7 @@ void VisualScriptEditor::_update_graph(int p_only_id) {
gnode->add_color_override("title_color", c);
c.a = 0.7;
gnode->add_color_override("close_color", c);
+ gnode->add_color_override("resizer_color", c);
gnode->add_style_override("frame", sbf);
}
diff --git a/modules/visual_script/visual_script_nodes.cpp b/modules/visual_script/visual_script_nodes.cpp
index 3b0210597b..65820b4c15 100644
--- a/modules/visual_script/visual_script_nodes.cpp
+++ b/modules/visual_script/visual_script_nodes.cpp
@@ -2530,7 +2530,7 @@ String VisualScriptCustomNode::get_category() const {
if (get_script_instance() && get_script_instance()->has_method("_get_category")) {
return get_script_instance()->call("_get_category");
}
- return "custom";
+ return "Custom";
}
class VisualScriptNodeInstanceCustomNode : public VisualScriptNodeInstance {
diff --git a/modules/webp/image_loader_webp.cpp b/modules/webp/image_loader_webp.cpp
index 8986e49cf0..d1bfa20842 100644
--- a/modules/webp/image_loader_webp.cpp
+++ b/modules/webp/image_loader_webp.cpp
@@ -106,8 +106,7 @@ static Ref<Image> _webp_lossy_unpack(const PoolVector<uint8_t> &p_buffer) {
errdec = WebPDecodeRGBInto(&r[4], size, dst_w.ptr(), datasize, 3 * features.width) == NULL;
}
- //ERR_EXPLAIN("Error decoding webp! - "+p_file);
- ERR_FAIL_COND_V(errdec, Ref<Image>());
+ ERR_FAIL_COND_V_MSG(errdec, Ref<Image>(), "Failed decoding WebP image.");
dst_w.release();
@@ -121,7 +120,6 @@ Error webp_load_image_from_buffer(Image *p_image, const uint8_t *p_buffer, int p
WebPBitstreamFeatures features;
if (WebPGetFeatures(p_buffer, p_buffer_len, &features) != VP8_STATUS_OK) {
- // ERR_EXPLAIN("Error decoding WEBP image");
ERR_FAIL_V(ERR_FILE_CORRUPT);
}
@@ -138,8 +136,7 @@ Error webp_load_image_from_buffer(Image *p_image, const uint8_t *p_buffer, int p
}
dst_w.release();
- //ERR_EXPLAIN("Error decoding webp!");
- ERR_FAIL_COND_V(errdec, ERR_FILE_CORRUPT);
+ ERR_FAIL_COND_V_MSG(errdec, ERR_FILE_CORRUPT, "Failed decoding WebP image.");
p_image->create(features.width, features.height, 0, features.has_alpha ? Image::FORMAT_RGBA8 : Image::FORMAT_RGB8, dst_image);
diff --git a/modules/webp/image_loader_webp.h b/modules/webp/image_loader_webp.h
index 0c4e54df09..5a5c038017 100644
--- a/modules/webp/image_loader_webp.h
+++ b/modules/webp/image_loader_webp.h
@@ -33,9 +33,6 @@
#include "core/io/image_loader.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class ImageLoaderWEBP : public ImageFormatLoader {
public:
diff --git a/modules/webrtc/register_types.cpp b/modules/webrtc/register_types.cpp
index 58b68d926b..6f97842064 100644
--- a/modules/webrtc/register_types.cpp
+++ b/modules/webrtc/register_types.cpp
@@ -29,6 +29,7 @@
/*************************************************************************/
#include "register_types.h"
+#include "core/project_settings.h"
#include "webrtc_data_channel.h"
#include "webrtc_peer_connection.h"
@@ -43,6 +44,12 @@
#include "webrtc_multiplayer.h"
void register_webrtc_types() {
+#define _SET_HINT(NAME, _VAL_, _MAX_) \
+ GLOBAL_DEF(NAME, _VAL_); \
+ ProjectSettings::get_singleton()->set_custom_property_info(NAME, PropertyInfo(Variant::INT, NAME, PROPERTY_HINT_RANGE, "2," #_MAX_ ",1,or_greater"));
+
+ _SET_HINT(WRTC_IN_BUF, 64, 4096);
+
#ifdef JAVASCRIPT_ENABLED
WebRTCPeerConnectionJS::make_default();
#elif defined(WEBRTC_GDNATIVE_ENABLED)
diff --git a/modules/webrtc/webrtc_data_channel.cpp b/modules/webrtc/webrtc_data_channel.cpp
index 2bd30e68f5..7b3843410a 100644
--- a/modules/webrtc/webrtc_data_channel.cpp
+++ b/modules/webrtc/webrtc_data_channel.cpp
@@ -29,6 +29,7 @@
/*************************************************************************/
#include "webrtc_data_channel.h"
+#include "core/project_settings.h"
void WebRTCDataChannel::_bind_methods() {
ClassDB::bind_method(D_METHOD("poll"), &WebRTCDataChannel::poll);
@@ -58,6 +59,7 @@ void WebRTCDataChannel::_bind_methods() {
}
WebRTCDataChannel::WebRTCDataChannel() {
+ _in_buffer_shift = nearest_shift((int)GLOBAL_GET(WRTC_IN_BUF) - 1) + 10;
}
WebRTCDataChannel::~WebRTCDataChannel() {
diff --git a/modules/webrtc/webrtc_data_channel.h b/modules/webrtc/webrtc_data_channel.h
index 0b161da784..7e2c08d9d7 100644
--- a/modules/webrtc/webrtc_data_channel.h
+++ b/modules/webrtc/webrtc_data_channel.h
@@ -33,6 +33,8 @@
#include "core/io/packet_peer.h"
+#define WRTC_IN_BUF "network/limits/webrtc/max_channel_in_buffer_kb"
+
class WebRTCDataChannel : public PacketPeer {
GDCLASS(WebRTCDataChannel, PacketPeer);
@@ -50,6 +52,8 @@ public:
};
protected:
+ unsigned int _in_buffer_shift;
+
static void _bind_methods();
public:
diff --git a/modules/webrtc/webrtc_data_channel_js.cpp b/modules/webrtc/webrtc_data_channel_js.cpp
index 996db35cba..2edd212a50 100644
--- a/modules/webrtc/webrtc_data_channel_js.cpp
+++ b/modules/webrtc/webrtc_data_channel_js.cpp
@@ -56,7 +56,7 @@ EMSCRIPTEN_KEEPALIVE void _emrtc_on_ch_message(void *obj, uint8_t *p_data, uint3
}
void WebRTCDataChannelJS::_on_open() {
- in_buffer.resize(16);
+ in_buffer.resize(_in_buffer_shift);
}
void WebRTCDataChannelJS::_on_close() {
diff --git a/modules/websocket/websocket_multiplayer_peer.cpp b/modules/websocket/websocket_multiplayer_peer.cpp
index 62f09bfbf9..dd86c758bf 100644
--- a/modules/websocket/websocket_multiplayer_peer.cpp
+++ b/modules/websocket/websocket_multiplayer_peer.cpp
@@ -265,7 +265,10 @@ Error WebSocketMultiplayerPeer::_server_relay(int32_t p_from, int32_t p_to, cons
ERR_FAIL_COND_V(p_to == p_from, FAILED);
- return get_peer(p_to)->put_packet(p_buffer, p_buffer_size); // Sending to specific peer
+ Ref<WebSocketPeer> peer_to = get_peer(p_to);
+ ERR_FAIL_COND_V(peer_to.is_null(), FAILED);
+
+ return peer_to->put_packet(p_buffer, p_buffer_size); // Sending to specific peer
}
}
@@ -296,8 +299,6 @@ void WebSocketMultiplayerPeer::_process_multiplayer(Ref<WebSocketPeer> p_peer, u
ERR_FAIL_COND(type != SYS_NONE); // Only server sends sys messages
ERR_FAIL_COND(from != p_peer_id); // Someone is cheating
- _server_relay(from, to, in_buffer, size); // Relay if needed
-
if (to == 1) { // This is for the server
_store_pkt(from, to, in_buffer, data_size);
@@ -312,13 +313,9 @@ void WebSocketMultiplayerPeer::_process_multiplayer(Ref<WebSocketPeer> p_peer, u
// All but one, for us if not excluded
if (_peer_id != -(int32_t)p_peer_id)
_store_pkt(from, to, in_buffer, data_size);
-
- } else {
-
- // Send to specific peer
- ERR_FAIL_COND(!_peer_map.has(to));
- get_peer(to)->put_packet(in_buffer, size);
}
+ // Relay if needed (i.e. "to" includes a peer that is not the server)
+ _server_relay(from, to, in_buffer, size);
} else {
diff --git a/modules/websocket/wsl_client.cpp b/modules/websocket/wsl_client.cpp
index cf2ad55b4a..0006a057e0 100644
--- a/modules/websocket/wsl_client.cpp
+++ b/modules/websocket/wsl_client.cpp
@@ -121,17 +121,17 @@ bool WSLClient::_verify_headers(String &r_protocol) {
headers[name] = value;
}
-#define _WLS_EXPLAIN(NAME, VALUE) \
- ERR_EXPLAIN("Missing or invalid header '" + String(NAME) + "'. Expected value '" + VALUE + "'");
-#define _WLS_CHECK(NAME, VALUE) \
- _WLS_EXPLAIN(NAME, VALUE); \
- ERR_FAIL_COND_V(!headers.has(NAME) || headers[NAME].to_lower() != VALUE, false);
-#define _WLS_CHECK_NC(NAME, VALUE) \
- _WLS_EXPLAIN(NAME, VALUE); \
- ERR_FAIL_COND_V(!headers.has(NAME) || headers[NAME] != VALUE, false);
- _WLS_CHECK("connection", "upgrade");
- _WLS_CHECK("upgrade", "websocket");
- _WLS_CHECK_NC("sec-websocket-accept", WSLPeer::compute_key_response(_key));
+#define _WSL_CHECK(NAME, VALUE) \
+ ERR_FAIL_COND_V_MSG(!headers.has(NAME) || headers[NAME].to_lower() != VALUE, false, \
+ "Missing or invalid header '" + String(NAME) + "'. Expected value '" + VALUE + "'.");
+#define _WSL_CHECK_NC(NAME, VALUE) \
+ ERR_FAIL_COND_V_MSG(!headers.has(NAME) || headers[NAME] != VALUE, false, \
+ "Missing or invalid header '" + String(NAME) + "'. Expected value '" + VALUE + "'.");
+ _WSL_CHECK("connection", "upgrade");
+ _WSL_CHECK("upgrade", "websocket");
+ _WSL_CHECK_NC("sec-websocket-accept", WSLPeer::compute_key_response(_key));
+#undef _WSL_CHECK_NC
+#undef _WSL_CHECK
if (_protocols.size() == 0) {
// We didn't request a custom protocol
ERR_FAIL_COND_V(headers.has("sec-websocket-protocol"), false);
@@ -148,10 +148,6 @@ bool WSLClient::_verify_headers(String &r_protocol) {
if (!valid)
return false;
}
-#undef _WLS_CHECK_NC
-#undef _WLS_CHECK
-#undef _WLS_EXPLAIN
-
return true;
}
diff --git a/modules/websocket/wsl_peer.cpp b/modules/websocket/wsl_peer.cpp
index b11bd2b70f..74fb901232 100644
--- a/modules/websocket/wsl_peer.cpp
+++ b/modules/websocket/wsl_peer.cpp
@@ -1,5 +1,5 @@
/*************************************************************************/
-/* lws_peer.cpp */
+/* wsl_peer.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
@@ -35,7 +35,7 @@
#include "wsl_client.h"
#include "wsl_server.h"
-#include "core/math/crypto_core.h"
+#include "core/crypto/crypto_core.h"
#include "core/math/random_number_generator.h"
#include "core/os/os.h"
diff --git a/modules/websocket/wsl_server.cpp b/modules/websocket/wsl_server.cpp
index 1feae420b9..efb526eed1 100644
--- a/modules/websocket/wsl_server.cpp
+++ b/modules/websocket/wsl_server.cpp
@@ -1,5 +1,5 @@
/*************************************************************************/
-/* lws_server.cpp */
+/* wsl_server.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
@@ -64,18 +64,17 @@ bool WSLServer::PendingPeer::_parse_request(const PoolStringArray p_protocols) {
else
headers[name] = value;
}
-#define _WLS_CHECK(NAME, VALUE) \
- ERR_EXPLAIN("Missing or invalid header '" + String(NAME) + "'. Expected value '" + VALUE + "'"); \
- ERR_FAIL_COND_V(!headers.has(NAME) || headers[NAME].to_lower() != VALUE, false);
-#define _WLS_CHECK_EX(NAME) \
- ERR_EXPLAIN("Missing header '" + String(NAME) + "'."); \
- ERR_FAIL_COND_V(!headers.has(NAME), false);
- _WLS_CHECK("upgrade", "websocket");
- _WLS_CHECK("sec-websocket-version", "13");
- _WLS_CHECK_EX("sec-websocket-key");
- _WLS_CHECK_EX("connection");
-#undef _WLS_CHECK_EX
-#undef _WLS_CHECK
+#define _WSL_CHECK(NAME, VALUE) \
+ ERR_FAIL_COND_V_MSG(!headers.has(NAME) || headers[NAME].to_lower() != VALUE, false, \
+ "Missing or invalid header '" + String(NAME) + "'. Expected value '" + VALUE + "'.");
+#define _WSL_CHECK_EX(NAME) \
+ ERR_FAIL_COND_V_MSG(!headers.has(NAME), false, "Missing header '" + String(NAME) + "'.");
+ _WSL_CHECK("upgrade", "websocket");
+ _WSL_CHECK("sec-websocket-version", "13");
+ _WSL_CHECK_EX("sec-websocket-key");
+ _WSL_CHECK_EX("connection");
+#undef _WSL_CHECK_EX
+#undef _WSL_CHECK
key = headers["sec-websocket-key"];
if (headers.has("sec-websocket-protocol")) {
Vector<String> protos = headers["sec-websocket-protocol"].split(",");
diff --git a/modules/xatlas_unwrap/register_types.cpp b/modules/xatlas_unwrap/register_types.cpp
index c18aa04336..65b3cf08f5 100644
--- a/modules/xatlas_unwrap/register_types.cpp
+++ b/modules/xatlas_unwrap/register_types.cpp
@@ -29,11 +29,14 @@
/*************************************************************************/
#include "register_types.h"
+
#include "core/error_macros.h"
+
#include "thirdparty/xatlas/xatlas.h"
#include <stdio.h>
#include <stdlib.h>
+
extern bool (*array_mesh_lightmap_unwrap_callback)(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, const int *p_face_materials, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y);
bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, const int *p_face_materials, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y) {
@@ -56,7 +59,7 @@ bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_ver
xatlas::PackOptions pack_options;
pack_options.maxChartSize = 4096;
- pack_options.bruteForce = true;
+ pack_options.blockAlign = true;
pack_options.texelsPerUnit = 1.0 / p_texel_size;
xatlas::Atlas *atlas = xatlas::Create();
@@ -75,7 +78,7 @@ bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_ver
float h = *r_size_hint_y;
if (w == 0 || h == 0) {
- return false; //could not bake
+ return false; //could not bake because there is no area
}
const xatlas::Mesh &output = atlas->meshes[0];
@@ -103,7 +106,7 @@ bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_ver
*r_index_count = output.indexCount;
- //xatlas::Destroy(atlas);
+ xatlas::Destroy(atlas);
printf("Done\n");
return true;
}
diff --git a/platform/SCsub b/platform/SCsub
index 20c89ae8c6..38bab59d74 100644
--- a/platform/SCsub
+++ b/platform/SCsub
@@ -29,4 +29,4 @@ with open_utf8('register_platform_apis.gen.cpp', 'w') as f:
env.add_source_files(env.platform_sources, 'register_platform_apis.gen.cpp')
lib = env.add_library('platform', env.platform_sources)
-env.Prepend(LIBS=lib)
+env.Prepend(LIBS=[lib])
diff --git a/platform/android/SCsub b/platform/android/SCsub
index e355caf0f9..1bd8161fa7 100644
--- a/platform/android/SCsub
+++ b/platform/android/SCsub
@@ -1,12 +1,11 @@
#!/usr/bin/env python
-Import('env')
-
-from distutils.version import LooseVersion
from detect import get_ndk_version
+from distutils.version import LooseVersion
-android_files = [
+Import('env')
+android_files = [
'os_android.cpp',
'file_access_android.cpp',
'audio_driver_opensl.cpp',
@@ -18,7 +17,7 @@ android_files = [
'java_class_wrapper.cpp',
'java_godot_wrapper.cpp',
'java_godot_io_wrapper.cpp',
-# 'power_android.cpp'
+ #'power_android.cpp'
]
env_android = env.Clone()
@@ -56,3 +55,25 @@ if lib_arch_dir != '':
stl_lib_path = str(env['ANDROID_NDK_ROOT']) + '/sources/cxx-stl/llvm-libc++/libs/' + lib_arch_dir + '/libc++_shared.so'
env_android.Command(out_dir + '/libc++_shared.so', stl_lib_path, Copy("$TARGET", "$SOURCE"))
+
+# Zip android/java folder for the source export template.
+print("Archiving platform/android/java as bin/android_source.zip...")
+import os
+import zipfile
+# Change dir to avoid have zipped paths start from the android/java folder.
+olddir = os.getcwd()
+os.chdir(Dir('#platform/android/java').abspath)
+bindir = Dir('#bin').abspath
+# Make 'bin' dir if missing, can happen on fresh clone.
+if not os.path.exists(bindir):
+ os.makedirs(bindir)
+zipf = zipfile.ZipFile(os.path.join(bindir, 'android_source.zip'), 'w', zipfile.ZIP_DEFLATED)
+exclude_dirs = ['.gradle', 'build', 'libs', 'patches']
+for root, dirs, files in os.walk('.', topdown=True):
+ # Change 'dirs' in place to exclude folders we don't want.
+ # https://stackoverflow.com/a/19859907
+ dirs[:] = [d for d in dirs if d not in exclude_dirs]
+ for f in files:
+ zipf.write(os.path.join(root, f))
+zipf.close()
+os.chdir(olddir)
diff --git a/platform/android/detect.py b/platform/android/detect.py
index 283791f336..8b62360888 100644
--- a/platform/android/detect.py
+++ b/platform/android/detect.py
@@ -32,14 +32,12 @@ def get_opts():
def get_flags():
-
return [
('tools', False),
]
def create(env):
-
tools = env['TOOLS']
if "mingw" in tools:
tools.remove('mingw')
@@ -50,7 +48,6 @@ def create(env):
def configure(env):
-
# Workaround for MinGW. See:
# http://www.scons.org/wiki/LongCmdLinesOnWin32
if (os.name == "nt"):
@@ -90,7 +87,7 @@ def configure(env):
env['SPAWN'] = mySpawn
- ## Architecture
+ # Architecture
if env['android_arch'] not in ['armv7', 'arm64v8', 'x86', 'x86_64']:
env['android_arch'] = 'armv7'
@@ -137,14 +134,14 @@ def configure(env):
arch_subpath = "arm64-v8a"
env.extra_suffix = ".armv8" + env.extra_suffix
- ## Build type
+ # Build type
if (env["target"].startswith("release")):
- if (env["optimize"] == "speed"): #optimize for speed (default)
+ if (env["optimize"] == "speed"): # optimize for speed (default)
env.Append(LINKFLAGS=['-O2'])
env.Append(CCFLAGS=['-O2', '-fomit-frame-pointer'])
env.Append(CPPDEFINES=['NDEBUG'])
- else: #optimize for size
+ else: # optimize for size
env.Append(CCFLAGS=['-Os'])
env.Append(CPPDEFINES=['NDEBUG'])
env.Append(LINKFLAGS=['-Os'])
@@ -159,7 +156,7 @@ def configure(env):
env.Append(CPPDEFINES=['_DEBUG', 'DEBUG_ENABLED', 'DEBUG_MEMORY_ENABLED'])
env.Append(CPPFLAGS=['-UNDEBUG'])
- ## Compiler configuration
+ # Compiler configuration
env['SHLIBSUFFIX'] = '.so'
@@ -204,7 +201,7 @@ def configure(env):
common_opts = ['-fno-integrated-as', '-gcc-toolchain', gcc_toolchain_path]
- ## Compile flags
+ # Compile flags
env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/include"])
env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++abi/include"])
@@ -259,7 +256,7 @@ def configure(env):
env.Append(CCFLAGS=target_opts)
env.Append(CCFLAGS=common_opts)
- ## Link flags
+ # Link flags
ndk_version = get_ndk_version(env["ANDROID_NDK_ROOT"])
if ndk_version != None and LooseVersion(ndk_version) >= LooseVersion("17.1.4828580"):
@@ -268,7 +265,7 @@ def configure(env):
env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/libandroid_support.a"])
env.Append(LINKFLAGS=['-shared', '--sysroot=' + lib_sysroot, '-Wl,--warn-shared-textrel'])
env.Append(LIBPATH=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/"])
- env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] +"/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/libc++_shared.so"])
+ env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/libc++_shared.so"])
if env["android_arch"] == "armv7":
env.Append(LINKFLAGS='-Wl,--fix-cortex-a8'.split())
@@ -287,6 +284,7 @@ def configure(env):
env.Append(CPPDEFINES=['ANDROID_ENABLED', 'UNIX_ENABLED', 'NO_FCNTL'])
env.Append(LIBS=['OpenSLES', 'EGL', 'GLESv3', 'GLESv2', 'android', 'log', 'z', 'dl'])
+
# Return NDK version string in source.properties (adapted from the Chromium project).
def get_ndk_version(path):
if path is None:
diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp
index 16e49e8a38..441fa38bff 100644
--- a/platform/android/export/export.cpp
+++ b/platform/android/export/export.cpp
@@ -1610,19 +1610,16 @@ public:
valid = false;
} else {
Error errn;
- DirAccess *da = DirAccess::open(sdk_path.plus_file("tools"), &errn);
+ DirAccessRef da = DirAccess::open(sdk_path.plus_file("tools"), &errn);
if (errn != OK) {
err += TTR("Invalid Android SDK path for custom build in Editor Settings.") + "\n";
valid = false;
}
- if (da) {
- memdelete(da);
- }
}
if (!FileAccess::exists("res://android/build/build.gradle")) {
- err += TTR("Android project is not installed for compiling. Install from Editor menu.") + "\n";
+ err += TTR("Android build template not installed in the project. Install it from the Project menu.") + "\n";
valid = false;
}
}
@@ -2513,7 +2510,7 @@ void register_android_exporter() {
EDITOR_DEF("export/android/debug_keystore_pass", "android");
EDITOR_DEF("export/android/force_system_user", false);
EDITOR_DEF("export/android/custom_build_sdk_path", "");
- EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/android/custom_build_sdk_path", PROPERTY_HINT_GLOBAL_DIR, "*.keystore"));
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/android/custom_build_sdk_path", PROPERTY_HINT_GLOBAL_DIR));
EDITOR_DEF("export/android/timestamping_authority_url", "");
EDITOR_DEF("export/android/shutdown_adb_on_exit", true);
diff --git a/platform/android/java/AndroidManifest.xml b/platform/android/java/AndroidManifest.xml
index 3152ef12cd..5114aeb8c5 100644
--- a/platform/android/java/AndroidManifest.xml
+++ b/platform/android/java/AndroidManifest.xml
@@ -1,58 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- package="com.godot.game"
- android:versionCode="1"
- android:versionName="1.0"
- android:installLocation="auto"
- >
-<supports-screens android:smallScreens="true"
- android:normalScreens="true"
- android:largeScreens="true"
- android:xlargeScreens="true"/>
-
-<!--glEsVersion is modified by the exporter, changing this value here has no effect-->
- <uses-feature android:glEsVersion="0x00020000" android:required="true" />
-<!--Adding custom text to manifest is fine, but do it outside the custom user and application BEGIN/END regions, as that gets rewritten-->
-
-<!--Custom permissions XML added by add-ons. It's recommended to add them from the export preset, though-->
+ xmlns:tools="http://schemas.android.com/tools"
+ package="com.godot.game"
+ android:versionCode="1"
+ android:versionName="1.0"
+ android:installLocation="auto" >
+
+ <!-- Adding custom text to the manifest is fine, but do it outside the custom USER and APPLICATION BEGIN/END comments, -->
+ <!-- as that gets rewritten. -->
+
+ <supports-screens
+ android:smallScreens="true"
+ android:normalScreens="true"
+ android:largeScreens="true"
+ android:xlargeScreens="true" />
+
+ <!-- glEsVersion is modified by the exporter, changing this value here has no effect. -->
+ <uses-feature
+ android:glEsVersion="0x00020000"
+ android:required="true" />
+
+<!-- Custom user permissions XML added by add-ons. It's recommended to add them from the export preset, though. -->
<!--CHUNK_USER_PERMISSIONS_BEGIN-->
<!--CHUNK_USER_PERMISSIONS_END-->
-<!--Anything in this line after the icon will be erased when doing custom build. If you want to add tags manually, do before it.-->
- <application android:label="@string/godot_project_name_string" android:allowBackup="false" tools:ignore="GoogleAppIndexingWarning" android:icon="@drawable/icon">
+ <!-- Any tag in this line after android:icon will be erased when doing custom builds. -->
+ <!-- If you want to add tags manually, do before it. -->
+ <application
+ android:label="@string/godot_project_name_string"
+ android:allowBackup="false"
+ tools:ignore="GoogleAppIndexingWarning"
+ android:icon="@drawable/icon" >
-<!--The following values are replaced when Godot exports, modifying them here has no effect. Do these changes in the-->
-<!--export preset. Adding new ones is fine.-->
+ <!-- The following metadata values are replaced when Godot exports, modifying them here has no effect. -->
+ <!-- Do these changes in the export preset. Adding new ones is fine. -->
-<!-- XR mode metadata. This is modified by the exporter based on the selected xr mode. DO NOT CHANGE the values here. -->
- <meta-data android:name="xr_mode_metadata_name" android:value="xr_mode_metadata_value"/>
+ <!-- XR mode metadata. This is modified by the exporter based on the selected xr mode. DO NOT CHANGE the values here. -->
+ <meta-data
+ android:name="xr_mode_metadata_name"
+ android:value="xr_mode_metadata_value" />
- <activity android:name="org.godotengine.godot.Godot"
- android:label="@string/godot_project_name_string"
- android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
- android:launchMode="singleTask"
- android:screenOrientation="landscape"
- android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize|density|keyboard|navigation|screenLayout|uiMode"
- android:resizeableActivity="false"
- tools:ignore="UnusedAttribute">
+ <activity
+ android:name="org.godotengine.godot.Godot"
+ android:label="@string/godot_project_name_string"
+ android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
+ android:launchMode="singleTask"
+ android:screenOrientation="landscape"
+ android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize|density|keyboard|navigation|screenLayout|uiMode"
+ android:resizeableActivity="false"
+ tools:ignore="UnusedAttribute" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <service android:name="org.godotengine.godot.GodotDownloaderService" />
-<!--Custom application XML added by add-ons-->
+ <service android:name="org.godotengine.godot.GodotDownloaderService" />
+
+<!-- Custom application XML added by add-ons. -->
<!--CHUNK_APPLICATION_BEGIN-->
<!--CHUNK_APPLICATION_END-->
</application>
- <instrumentation android:icon="@drawable/icon"
- android:label="@string/godot_project_name_string"
- android:name="org.godotengine.godot.GodotInstrumentation"
- android:targetPackage="org.godotengine.game" />
+ <instrumentation
+ android:icon="@drawable/icon"
+ android:label="@string/godot_project_name_string"
+ android:name="org.godotengine.godot.GodotInstrumentation"
+ android:targetPackage="org.godotengine.game" />
</manifest>
diff --git a/platform/android/java/README.md b/platform/android/java/README.md
deleted file mode 100644
index 58d2b10706..0000000000
--- a/platform/android/java/README.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# Third party libraries
-
-
-## Google's vending library
-
-- Upstream: https://github.com/google/play-licensing/tree/master/lvl_library/src/main/java/com/google/android/vending
-- Version: git (eb57657, 2018) with modifications
-- License: Apache 2.0
-
-Overwrite all files under `com/google/android/vending`
-
-### Modify some files to avoid compile error and lint warning
-
-#### com/google/android/vending/licensing/util/Base64.java
-```
-@@ -338,7 +338,8 @@ public class Base64 {
- e += 4;
- }
-
-- assert (e == outBuff.length);
-+ if (BuildConfig.DEBUG && e != outBuff.length)
-+ throw new RuntimeException();
- return outBuff;
- }
-```
-
-#### com/google/android/vending/licensing/LicenseChecker.java
-```
-@@ -29,8 +29,8 @@ import android.os.RemoteException;
- import android.provider.Settings.Secure;
- import android.util.Log;
-
--import com.android.vending.licensing.ILicenseResultListener;
--import com.android.vending.licensing.ILicensingService;
-+import com.google.android.vending.licensing.ILicenseResultListener;
-+import com.google.android.vending.licensing.ILicensingService;
- import com.google.android.vending.licensing.util.Base64;
- import com.google.android.vending.licensing.util.Base64DecoderException;
-```
-```
-@@ -287,13 +287,15 @@ public class LicenseChecker implements ServiceConnection {
- if (logResponse) {
-- String android_id = Secure.getString(mContext.getContentResolver(),
-- Secure.ANDROID_ID);
-+ String android_id = Secure.ANDROID_ID;
- Date date = new Date();
-```
diff --git a/platform/android/java/THIRDPARTY.md b/platform/android/java/THIRDPARTY.md
new file mode 100644
index 0000000000..2496b59263
--- /dev/null
+++ b/platform/android/java/THIRDPARTY.md
@@ -0,0 +1,39 @@
+# Third-party libraries
+
+This file list third-party libraries used in the Android source folder,
+with their provenance and, when relevant, modifications made to those files.
+
+## com.android.vending.billing
+
+- Upstream: https://github.com/googlesamples/android-play-billing/tree/master/TrivialDrive/app/src/main
+- Version: git (7a94c69, 2019)
+- License: Apache 2.0
+
+Overwrite the file `aidl/com/android/vending/billing/IInAppBillingService.aidl`.
+
+## com.google.android.vending.expansion.downloader
+
+- Upstream: https://github.com/google/play-apk-expansion/tree/master/apkx_library
+- Version: git (9ecf54e, 2017)
+- License: Apache 2.0
+
+Overwrite all files under:
+
+- `src/com/google/android/vending/expansion/downloader`
+
+Some files have been modified for yet unclear reasons.
+See the `patches/com.google.android.vending.expansion.downloader.patch` file.
+
+## com.google.android.vending.licensing
+
+- Upstream: https://github.com/google/play-licensing/tree/master/lvl_library/
+- Version: git (eb57657, 2018) with modifications
+- License: Apache 2.0
+
+Overwrite all files under:
+
+- `aidl/com/android/vending/licensing`
+- `src/com/google/android/vending/licensing`
+
+Some files have been modified to silence linter errors or fix downstream issues.
+See the `patches/com.google.android.vending.licensing.patch` file.
diff --git a/platform/android/java/aidl/com/android/vending/billing/IInAppBillingService.aidl b/platform/android/java/aidl/com/android/vending/billing/IInAppBillingService.aidl
index 2a492f7845..0f2bcae338 100644
--- a/platform/android/java/aidl/com/android/vending/billing/IInAppBillingService.aidl
+++ b/platform/android/java/aidl/com/android/vending/billing/IInAppBillingService.aidl
@@ -34,10 +34,11 @@ import android.os.Bundle;
*
* All calls will give a response code with the following possible values
* RESULT_OK = 0 - success
- * RESULT_USER_CANCELED = 1 - user pressed back or canceled a dialog
- * RESULT_BILLING_UNAVAILABLE = 3 - this billing API version is not supported for the type requested
- * RESULT_ITEM_UNAVAILABLE = 4 - requested SKU is not available for purchase
- * RESULT_DEVELOPER_ERROR = 5 - invalid arguments provided to the API
+ * RESULT_USER_CANCELED = 1 - User pressed back or canceled a dialog
+ * RESULT_SERVICE_UNAVAILABLE = 2 - The network connection is down
+ * RESULT_BILLING_UNAVAILABLE = 3 - This billing API version is not supported for the type requested
+ * RESULT_ITEM_UNAVAILABLE = 4 - Requested SKU is not available for purchase
+ * RESULT_DEVELOPER_ERROR = 5 - Invalid arguments provided to the API
* RESULT_ERROR = 6 - Fatal error during the API action
* RESULT_ITEM_ALREADY_OWNED = 7 - Failure to purchase since item is already owned
* RESULT_ITEM_NOT_OWNED = 8 - Failure to consume since item is not owned
@@ -46,11 +47,11 @@ interface IInAppBillingService {
/**
* Checks support for the requested billing API version, package and in-app type.
* Minimum API version supported by this interface is 3.
- * @param apiVersion the billing version which the app is using
+ * @param apiVersion billing API version that the app is using
* @param packageName the package name of the calling app
- * @param type type of the in-app item being purchased "inapp" for one-time purchases
- * and "subs" for subscription.
- * @return RESULT_OK(0) on success, corresponding result code on failures
+ * @param type type of the in-app item being purchased ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
+ * @return RESULT_OK(0) on success and appropriate response code on failures.
*/
int isBillingSupported(int apiVersion, String packageName, String type);
@@ -59,16 +60,23 @@ interface IInAppBillingService {
* Given a list of SKUs of a valid type in the skusBundle, this returns a bundle
* with a list JSON strings containing the productId, price, title and description.
* This API can be called with a maximum of 20 SKUs.
- * @param apiVersion billing API version that the Third-party is using
+ * @param apiVersion billing API version that the app is using
* @param packageName the package name of the calling app
+ * @param type of the in-app items ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
* @param skusBundle bundle containing a StringArrayList of SKUs with key "ITEM_ID_LIST"
* @return Bundle containing the following key-value pairs
- * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, other response codes on
- * failure as listed above.
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes
+ * on failures.
* "DETAILS_LIST" with a StringArrayList containing purchase information
- * in JSON format similar to:
- * '{ "productId" : "exampleSku", "type" : "inapp", "price" : "$5.00",
- * "title : "Example Title", "description" : "This is an example description" }'
+ * in JSON format similar to:
+ * '{ "productId" : "exampleSku",
+ * "type" : "inapp",
+ * "price" : "$5.00",
+ * "price_currency": "USD",
+ * "price_amount_micros": 5000000,
+ * "title : "Example Title",
+ * "description" : "This is an example description" }'
*/
Bundle getSkuDetails(int apiVersion, String packageName, String type, in Bundle skusBundle);
@@ -78,29 +86,28 @@ interface IInAppBillingService {
* @param apiVersion billing API version that the app is using
* @param packageName package name of the calling app
* @param sku the SKU of the in-app item as published in the developer console
- * @param type the type of the in-app item ("inapp" for one-time purchases
- * and "subs" for subscription).
+ * @param type of the in-app item being purchased ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
* @param developerPayload optional argument to be sent back with the purchase information
* @return Bundle containing the following key-value pairs
- * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, other response codes on
- * failure as listed above.
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes
+ * on failures.
* "BUY_INTENT" - PendingIntent to start the purchase flow
*
* The Pending intent should be launched with startIntentSenderForResult. When purchase flow
* has completed, the onActivityResult() will give a resultCode of OK or CANCELED.
* If the purchase is successful, the result data will contain the following key-value pairs
- * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, other response codes on
- * failure as listed above.
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response
+ * codes on failures.
* "INAPP_PURCHASE_DATA" - String in JSON format similar to
- * '{"orderId":"12999763169054705758.1371079406387615",
- * "packageName":"com.example.app",
- * "productId":"exampleSku",
- * "purchaseTime":1345678900000,
- * "purchaseToken" : "122333444455555",
- * "developerPayload":"example developer payload" }'
+ * '{"orderId":"12999763169054705758.1371079406387615",
+ * "packageName":"com.example.app",
+ * "productId":"exampleSku",
+ * "purchaseTime":1345678900000,
+ * "purchaseToken" : "122333444455555",
+ * "developerPayload":"example developer payload" }'
* "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that
* was signed with the private key of the developer
- * TODO: change this to app-specific keys.
*/
Bundle getBuyIntent(int apiVersion, String packageName, String sku, String type,
String developerPayload);
@@ -112,15 +119,15 @@ interface IInAppBillingService {
* V1 and V2 that have not been consumed.
* @param apiVersion billing API version that the app is using
* @param packageName package name of the calling app
- * @param type the type of the in-app items being requested
- * ("inapp" for one-time purchases and "subs" for subscription).
+ * @param type of the in-app items being requested ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
* @param continuationToken to be set as null for the first call, if the number of owned
* skus are too many, a continuationToken is returned in the response bundle.
* This method can be called again with the continuation token to get the next set of
* owned skus.
* @return Bundle containing the following key-value pairs
- * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, other response codes on
- * failure as listed above.
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes
+ on failures.
* "INAPP_PURCHASE_ITEM_LIST" - StringArrayList containing the list of SKUs
* "INAPP_PURCHASE_DATA_LIST" - StringArrayList containing the purchase information
* "INAPP_DATA_SIGNATURE_LIST"- StringArrayList containing the signatures
@@ -138,7 +145,137 @@ interface IInAppBillingService {
* @param packageName package name of the calling app
* @param purchaseToken token in the purchase information JSON that identifies the purchase
* to be consumed
- * @return 0 if consumption succeeded. Appropriate error values for failures.
+ * @return RESULT_OK(0) if consumption succeeded, appropriate response codes on failures.
*/
int consumePurchase(int apiVersion, String packageName, String purchaseToken);
+
+ /**
+ * This API is currently under development.
+ */
+ int stub(int apiVersion, String packageName, String type);
+
+ /**
+ * Returns a pending intent to launch the purchase flow for upgrading or downgrading a
+ * subscription. The existing owned SKU(s) should be provided along with the new SKU that
+ * the user is upgrading or downgrading to.
+ * @param apiVersion billing API version that the app is using, must be 5 or later
+ * @param packageName package name of the calling app
+ * @param oldSkus the SKU(s) that the user is upgrading or downgrading from,
+ * if null or empty this method will behave like {@link #getBuyIntent}
+ * @param newSku the SKU that the user is upgrading or downgrading to
+ * @param type of the item being purchased, currently must be "subs"
+ * @param developerPayload optional argument to be sent back with the purchase information
+ * @return Bundle containing the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes
+ * on failures.
+ * "BUY_INTENT" - PendingIntent to start the purchase flow
+ *
+ * The Pending intent should be launched with startIntentSenderForResult. When purchase flow
+ * has completed, the onActivityResult() will give a resultCode of OK or CANCELED.
+ * If the purchase is successful, the result data will contain the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response
+ * codes on failures.
+ * "INAPP_PURCHASE_DATA" - String in JSON format similar to
+ * '{"orderId":"12999763169054705758.1371079406387615",
+ * "packageName":"com.example.app",
+ * "productId":"exampleSku",
+ * "purchaseTime":1345678900000,
+ * "purchaseToken" : "122333444455555",
+ * "developerPayload":"example developer payload" }'
+ * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that
+ * was signed with the private key of the developer
+ */
+ Bundle getBuyIntentToReplaceSkus(int apiVersion, String packageName,
+ in List<String> oldSkus, String newSku, String type, String developerPayload);
+
+ /**
+ * Returns a pending intent to launch the purchase flow for an in-app item. This method is
+ * a variant of the {@link #getBuyIntent} method and takes an additional {@code extraParams}
+ * parameter. This parameter is a Bundle of optional keys and values that affect the
+ * operation of the method.
+ * @param apiVersion billing API version that the app is using, must be 6 or later
+ * @param packageName package name of the calling app
+ * @param sku the SKU of the in-app item as published in the developer console
+ * @param type of the in-app item being purchased ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
+ * @param developerPayload optional argument to be sent back with the purchase information
+ * @extraParams a Bundle with the following optional keys:
+ * "skusToReplace" - List<String> - an optional list of SKUs that the user is
+ * upgrading or downgrading from.
+ * Pass this field if the purchase is upgrading or downgrading
+ * existing subscriptions.
+ * The specified SKUs are replaced with the SKUs that the user is
+ * purchasing. Google Play replaces the specified SKUs at the start of
+ * the next billing cycle.
+ * "replaceSkusProration" - Boolean - whether the user should be credited for any unused
+ * subscription time on the SKUs they are upgrading or downgrading.
+ * If you set this field to true, Google Play swaps out the old SKUs
+ * and credits the user with the unused value of their subscription
+ * time on a pro-rated basis.
+ * Google Play applies this credit to the new subscription, and does
+ * not begin billing the user for the new subscription until after
+ * the credit is used up.
+ * If you set this field to false, the user does not receive credit for
+ * any unused subscription time and the recurrence date does not
+ * change.
+ * Default value is true. Ignored if you do not pass skusToReplace.
+ * "accountId" - String - an optional obfuscated string that is uniquely
+ * associated with the user's account in your app.
+ * If you pass this value, Google Play can use it to detect irregular
+ * activity, such as many devices making purchases on the same
+ * account in a short period of time.
+ * Do not use the developer ID or the user's Google ID for this field.
+ * In addition, this field should not contain the user's ID in
+ * cleartext.
+ * We recommend that you use a one-way hash to generate a string from
+ * the user's ID, and store the hashed string in this field.
+ * "vr" - Boolean - an optional flag indicating whether the returned intent
+ * should start a VR purchase flow. The apiVersion must also be 7 or
+ * later to use this flag.
+ */
+ Bundle getBuyIntentExtraParams(int apiVersion, String packageName, String sku,
+ String type, String developerPayload, in Bundle extraParams);
+
+ /**
+ * Returns the most recent purchase made by the user for each SKU, even if that purchase is
+ * expired, canceled, or consumed.
+ * @param apiVersion billing API version that the app is using, must be 6 or later
+ * @param packageName package name of the calling app
+ * @param type of the in-app items being requested ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
+ * @param continuationToken to be set as null for the first call, if the number of owned
+ * skus is too large, a continuationToken is returned in the response bundle.
+ * This method can be called again with the continuation token to get the next set of
+ * owned skus.
+ * @param extraParams a Bundle with extra params that would be appended into http request
+ * query string. Not used at this moment. Reserved for future functionality.
+ * @return Bundle containing the following key-value pairs
+ * "RESPONSE_CODE" with int value: RESULT_OK(0) if success,
+ * {@link IabHelper#BILLING_RESPONSE_RESULT_*} response codes on failures.
+ *
+ * "INAPP_PURCHASE_ITEM_LIST" - ArrayList<String> containing the list of SKUs
+ * "INAPP_PURCHASE_DATA_LIST" - ArrayList<String> containing the purchase information
+ * "INAPP_DATA_SIGNATURE_LIST"- ArrayList<String> containing the signatures
+ * of the purchase information
+ * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the
+ * next set of in-app purchases. Only set if the
+ * user has more owned skus than the current list.
+ */
+ Bundle getPurchaseHistory(int apiVersion, String packageName, String type,
+ String continuationToken, in Bundle extraParams);
+
+ /**
+ * This method is a variant of {@link #isBillingSupported}} that takes an additional
+ * {@code extraParams} parameter.
+ * @param apiVersion billing API version that the app is using, must be 7 or later
+ * @param packageName package name of the calling app
+ * @param type of the in-app item being purchased ("inapp" for one-time purchases and "subs"
+ * for subscriptions)
+ * @param extraParams a Bundle with the following optional keys:
+ * "vr" - Boolean - an optional flag to indicate whether {link #getBuyIntentExtraParams}
+ * supports returning a VR purchase flow.
+ * @return RESULT_OK(0) on success and appropriate response code on failures.
+ */
+ int isBillingSupportedExtraParams(int apiVersion, String packageName, String type,
+ in Bundle extraParams);
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.aidl b/platform/android/java/aidl/com/android/vending/licensing/ILicenseResultListener.aidl
index c816558afc..869cb16f68 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.aidl
+++ b/platform/android/java/aidl/com/android/vending/licensing/ILicenseResultListener.aidl
@@ -16,8 +16,6 @@
package com.android.vending.licensing;
-// Android library projects do not yet support AIDL, so this has been
-// precompiled into the src directory.
oneway interface ILicenseResultListener {
void verifyLicense(int responseCode, String signedData, String signature);
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/ILicensingService.aidl b/platform/android/java/aidl/com/android/vending/licensing/ILicensingService.aidl
index 664510ce0c..9541a2090c 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/ILicensingService.aidl
+++ b/platform/android/java/aidl/com/android/vending/licensing/ILicensingService.aidl
@@ -18,8 +18,6 @@ package com.android.vending.licensing;
import com.android.vending.licensing.ILicenseResultListener;
-// Android library projects do not yet support AIDL, so this has been
-// precompiled into the src directory.
oneway interface ILicensingService {
void checkLicense(long nonce, String packageName, in ILicenseResultListener listener);
}
diff --git a/platform/android/java/build.gradle b/platform/android/java/build.gradle
index c468277daa..0f8499ba91 100644
--- a/platform/android/java/build.gradle
+++ b/platform/android/java/build.gradle
@@ -1,113 +1,111 @@
-//Gradle project for Godot Engine Android port.
-//Do not modify code between the BEGIN/END sections, as it's autogenerated by add-ons
+// Gradle build config for Godot Engine's Android port.
+//
+// Do not remove/modify comments ending with BEGIN/END, they are used to inject
+// addon-specific configuration.
buildscript {
- repositories {
- google()
- jcenter()
+ repositories {
+ google()
+ jcenter()
//CHUNK_BUILDSCRIPT_REPOSITORIES_BEGIN
//CHUNK_BUILDSCRIPT_REPOSITORIES_END
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:3.2.1'
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.4.2'
//CHUNK_BUILDSCRIPT_DEPENDENCIES_BEGIN
//CHUNK_BUILDSCRIPT_DEPENDENCIES_END
- }
+ }
}
apply plugin: 'com.android.application'
allprojects {
repositories {
- mavenCentral()
- google()
- jcenter()
+ mavenCentral()
+ google()
+ jcenter()
//CHUNK_ALLPROJECTS_REPOSITORIES_BEGIN
//CHUNK_ALLPROJECTS_REPOSITORIES_END
-
}
}
dependencies {
- implementation "com.android.support:support-core-utils:28.0.0"
+ implementation "com.android.support:support-core-utils:28.0.0"
//CHUNK_DEPENDENCIES_BEGIN
//CHUNK_DEPENDENCIES_END
}
android {
+ compileSdkVersion 28
+ buildToolsVersion "28.0.3"
+ useLibrary 'org.apache.http.legacy'
- lintOptions {
- abortOnError false
- disable 'MissingTranslation','UnusedResources'
- }
-
- compileSdkVersion 28
- buildToolsVersion "28.0.3"
- useLibrary 'org.apache.http.legacy'
-
- packagingOptions {
- exclude 'META-INF/LICENSE'
- exclude 'META-INF/NOTICE'
- }
- defaultConfig {
- minSdkVersion 18
- targetSdkVersion 28
+ defaultConfig {
+ minSdkVersion 18
+ targetSdkVersion 28
//CHUNK_ANDROID_DEFAULTCONFIG_BEGIN
//CHUNK_ANDROID_DEFAULTCONFIG_END
- }
- // Both signing and zip-aligning will be done at export time
- buildTypes.all { buildType ->
- buildType.zipAlignEnabled false
- buildType.signingConfig null
- }
- sourceSets {
- main {
- manifest.srcFile 'AndroidManifest.xml'
- java.srcDirs = ['src'
+ }
+
+ lintOptions {
+ abortOnError false
+ disable 'MissingTranslation', 'UnusedResources'
+ }
+
+ packagingOptions {
+ exclude 'META-INF/LICENSE'
+ exclude 'META-INF/NOTICE'
+ }
+
+ // Both signing and zip-aligning will be done at export time
+ buildTypes.all { buildType ->
+ buildType.zipAlignEnabled false
+ buildType.signingConfig null
+ }
+
+ sourceSets {
+ main {
+ manifest.srcFile 'AndroidManifest.xml'
+ java.srcDirs = [
+ 'src'
//DIR_SRC_BEGIN
//DIR_SRC_END
- ]
- res.srcDirs = [
- 'res'
+ ]
+ res.srcDirs = [
+ 'res'
//DIR_RES_BEGIN
//DIR_RES_END
- ]
- aidl.srcDirs = [
- 'aidl'
+ ]
+ aidl.srcDirs = [
+ 'aidl'
//DIR_AIDL_BEGIN
//DIR_AIDL_END
- ]
- assets.srcDirs = [
- 'assets'
+ ]
+ assets.srcDirs = [
+ 'assets'
//DIR_ASSETS_BEGIN
//DIR_ASSETS_END
-
- ]
- }
- debug.jniLibs.srcDirs = [
- 'libs/debug'
+ ]
+ }
+ debug.jniLibs.srcDirs = [
+ 'libs/debug'
//DIR_JNI_DEBUG_BEGIN
//DIR_JNI_DEBUG_END
- ]
- release.jniLibs.srcDirs = [
- 'libs/release'
+ ]
+ release.jniLibs.srcDirs = [
+ 'libs/release'
//DIR_JNI_RELEASE_BEGIN
//DIR_JNI_RELEASE_END
- ]
- }
-// No longer used, as it's not useful for build source template
-// applicationVariants.all { variant ->
-// variant.outputs.all { output ->
-// output.outputFileName = "../../../../../../../bin/android_${variant.name}.apk"
-// }
-// }
+ ]
+ }
+ // No longer used, as it's not useful for build source template
+ //applicationVariants.all { variant ->
+ // variant.outputs.all { output ->
+ // output.outputFileName = "../../../../../../../bin/android_${variant.name}.apk"
+ // }
+ //}
}
//CHUNK_GLOBAL_BEGIN
//CHUNK_GLOBAL_END
-
-
-
-
-
diff --git a/platform/android/java/gradle/wrapper/gradle-wrapper.properties b/platform/android/java/gradle/wrapper/gradle-wrapper.properties
index bf3de21830..558870dad5 100644
--- a/platform/android/java/gradle/wrapper/gradle-wrapper.properties
+++ b/platform/android/java/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/platform/android/java/patches/com.google.android.vending.expansion.downloader.patch b/platform/android/java/patches/com.google.android.vending.expansion.downloader.patch
new file mode 100644
index 0000000000..1189cfbfbb
--- /dev/null
+++ b/platform/android/java/patches/com.google.android.vending.expansion.downloader.patch
@@ -0,0 +1,300 @@
+diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java
+index ad6ea0de6..452c7d148 100644
+--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java
++++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java
+@@ -32,6 +32,9 @@ import android.os.Messenger;
+ import android.os.RemoteException;
+ import android.util.Log;
+
++// -- GODOT start --
++import java.lang.ref.WeakReference;
++// -- GODOT end --
+
+
+ /**
+@@ -118,29 +121,46 @@ public class DownloaderClientMarshaller {
+ /**
+ * Target we publish for clients to send messages to IncomingHandler.
+ */
+- final Messenger mMessenger = new Messenger(new Handler() {
++ // -- GODOT start --
++ private final MessengerHandlerClient mMsgHandler = new MessengerHandlerClient(this);
++ final Messenger mMessenger = new Messenger(mMsgHandler);
++
++ private static class MessengerHandlerClient extends Handler {
++ private final WeakReference<Stub> mDownloader;
++ public MessengerHandlerClient(Stub downloader) {
++ mDownloader = new WeakReference<>(downloader);
++ }
++
+ @Override
+ public void handleMessage(Message msg) {
+- switch (msg.what) {
+- case MSG_ONDOWNLOADPROGRESS:
+- Bundle bun = msg.getData();
+- if ( null != mContext ) {
+- bun.setClassLoader(mContext.getClassLoader());
+- DownloadProgressInfo dpi = (DownloadProgressInfo) msg.getData()
+- .getParcelable(PARAM_PROGRESS);
+- mItf.onDownloadProgress(dpi);
+- }
+- break;
+- case MSG_ONDOWNLOADSTATE_CHANGED:
+- mItf.onDownloadStateChanged(msg.getData().getInt(PARAM_NEW_STATE));
+- break;
+- case MSG_ONSERVICECONNECTED:
+- mItf.onServiceConnected(
+- (Messenger) msg.getData().getParcelable(PARAM_MESSENGER));
+- break;
++ Stub downloader = mDownloader.get();
++ if (downloader != null) {
++ downloader.handleMessage(msg);
+ }
+ }
+- });
++ }
++
++ private void handleMessage(Message msg) {
++ switch (msg.what) {
++ case MSG_ONDOWNLOADPROGRESS:
++ Bundle bun = msg.getData();
++ if (null != mContext) {
++ bun.setClassLoader(mContext.getClassLoader());
++ DownloadProgressInfo dpi = (DownloadProgressInfo)msg.getData()
++ .getParcelable(PARAM_PROGRESS);
++ mItf.onDownloadProgress(dpi);
++ }
++ break;
++ case MSG_ONDOWNLOADSTATE_CHANGED:
++ mItf.onDownloadStateChanged(msg.getData().getInt(PARAM_NEW_STATE));
++ break;
++ case MSG_ONSERVICECONNECTED:
++ mItf.onServiceConnected(
++ (Messenger)msg.getData().getParcelable(PARAM_MESSENGER));
++ break;
++ }
++ }
++ // -- GODOT end --
+
+ public Stub(IDownloaderClient itf, Class<?> downloaderService) {
+ mItf = itf;
+diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java
+index 979352299..3771d19c9 100644
+--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java
++++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java
+@@ -25,6 +25,9 @@ import android.os.Message;
+ import android.os.Messenger;
+ import android.os.RemoteException;
+
++// -- GODOT start --
++import java.lang.ref.WeakReference;
++// -- GODOT end --
+
+
+ /**
+@@ -108,32 +111,49 @@ public class DownloaderServiceMarshaller {
+
+ private static class Stub implements IStub {
+ private IDownloaderService mItf = null;
+- final Messenger mMessenger = new Messenger(new Handler() {
++ // -- GODOT start --
++ private final MessengerHandlerServer mMsgHandler = new MessengerHandlerServer(this);
++ final Messenger mMessenger = new Messenger(mMsgHandler);
++
++ private static class MessengerHandlerServer extends Handler {
++ private final WeakReference<Stub> mDownloader;
++ public MessengerHandlerServer(Stub downloader) {
++ mDownloader = new WeakReference<>(downloader);
++ }
++
+ @Override
+ public void handleMessage(Message msg) {
+- switch (msg.what) {
+- case MSG_REQUEST_ABORT_DOWNLOAD:
+- mItf.requestAbortDownload();
+- break;
+- case MSG_REQUEST_CONTINUE_DOWNLOAD:
+- mItf.requestContinueDownload();
+- break;
+- case MSG_REQUEST_PAUSE_DOWNLOAD:
+- mItf.requestPauseDownload();
+- break;
+- case MSG_SET_DOWNLOAD_FLAGS:
+- mItf.setDownloadFlags(msg.getData().getInt(PARAMS_FLAGS));
+- break;
+- case MSG_REQUEST_DOWNLOAD_STATE:
+- mItf.requestDownloadStatus();
+- break;
+- case MSG_REQUEST_CLIENT_UPDATE:
+- mItf.onClientUpdated((Messenger) msg.getData().getParcelable(
+- PARAM_MESSENGER));
+- break;
++ Stub downloader = mDownloader.get();
++ if (downloader != null) {
++ downloader.handleMessage(msg);
+ }
+ }
+- });
++ }
++
++ private void handleMessage(Message msg) {
++ switch (msg.what) {
++ case MSG_REQUEST_ABORT_DOWNLOAD:
++ mItf.requestAbortDownload();
++ break;
++ case MSG_REQUEST_CONTINUE_DOWNLOAD:
++ mItf.requestContinueDownload();
++ break;
++ case MSG_REQUEST_PAUSE_DOWNLOAD:
++ mItf.requestPauseDownload();
++ break;
++ case MSG_SET_DOWNLOAD_FLAGS:
++ mItf.setDownloadFlags(msg.getData().getInt(PARAMS_FLAGS));
++ break;
++ case MSG_REQUEST_DOWNLOAD_STATE:
++ mItf.requestDownloadStatus();
++ break;
++ case MSG_REQUEST_CLIENT_UPDATE:
++ mItf.onClientUpdated((Messenger)msg.getData().getParcelable(
++ PARAM_MESSENGER));
++ break;
++ }
++ }
++ // -- GODOT end --
+
+ public Stub(IDownloaderService itf) {
+ mItf = itf;
+diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java
+index e4b1b0f1c..36cd6aacf 100644
+--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java
++++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java
+@@ -24,7 +24,10 @@ import android.os.StatFs;
+ import android.os.SystemClock;
+ import android.util.Log;
+
+-import com.android.vending.expansion.downloader.R;
++// -- GODOT start --
++//import com.android.vending.expansion.downloader.R;
++import com.godot.game.R;
++// -- GODOT end --
+
+ import java.io.File;
+ import java.text.SimpleDateFormat;
+@@ -146,12 +149,14 @@ public class Helpers {
+ }
+ return "";
+ }
+- return String.format("%.2f",
++ // -- GODOT start --
++ return String.format(Locale.ENGLISH, "%.2f",
+ (float) overallProgress / (1024.0f * 1024.0f))
+ + "MB /" +
+- String.format("%.2f", (float) overallTotal /
++ String.format(Locale.ENGLISH, "%.2f", (float) overallTotal /
+ (1024.0f * 1024.0f))
+ + "MB";
++ // -- GODOT end --
+ }
+
+ /**
+@@ -184,7 +189,9 @@ public class Helpers {
+ }
+
+ public static String getSpeedString(float bytesPerMillisecond) {
+- return String.format("%.2f", bytesPerMillisecond * 1000 / 1024);
++ // -- GODOT start --
++ return String.format(Locale.ENGLISH, "%.2f", bytesPerMillisecond * 1000 / 1024);
++ // -- GODOT end --
+ }
+
+ public static String getTimeRemaining(long durationInMilliseconds) {
+diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java
+index 12edd97ab..a0e1165cc 100644
+--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java
++++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java
+@@ -26,6 +26,10 @@ import android.net.NetworkInfo;
+ import android.telephony.TelephonyManager;
+ import android.util.Log;
+
++// -- GODOT start --
++import android.annotation.SuppressLint;
++// -- GODOT end --
++
+ /**
+ * Contains useful helper functions, typically tied to the application context.
+ */
+@@ -51,6 +55,7 @@ class SystemFacade {
+ return null;
+ }
+
++ @SuppressLint("MissingPermission")
+ NetworkInfo activeInfo = connectivity.getActiveNetworkInfo();
+ if (activeInfo == null) {
+ if (Constants.LOGVV) {
+@@ -69,6 +74,7 @@ class SystemFacade {
+ return false;
+ }
+
++ @SuppressLint("MissingPermission")
+ NetworkInfo info = connectivity.getActiveNetworkInfo();
+ boolean isMobile = (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE);
+ TelephonyManager tm = (TelephonyManager) mContext
+diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java
+index f1536e80e..4b214b22d 100644
+--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java
++++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java
+@@ -16,7 +16,11 @@
+
+ package com.google.android.vending.expansion.downloader.impl;
+
+-import com.android.vending.expansion.downloader.R;
++// -- GODOT start --
++//import com.android.vending.expansion.downloader.R;
++import com.godot.game.R;
++// -- GODOT end --
++
+ import com.google.android.vending.expansion.downloader.DownloadProgressInfo;
+ import com.google.android.vending.expansion.downloader.DownloaderClientMarshaller;
+ import com.google.android.vending.expansion.downloader.Helpers;
+diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java
+index b2e0e7af0..c114b8a64 100644
+--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java
++++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java
+@@ -146,8 +146,12 @@ public class DownloadThread {
+
+ try {
+ PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+- wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Constants.TAG);
+- wakeLock.acquire();
++ // -- GODOT start --
++ //wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Constants.TAG);
++ //wakeLock.acquire();
++ wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "org.godot.game:wakelock");
++ wakeLock.acquire(20 * 60 * 1000L /*20 minutes*/);
++ // -- GODOT end --
+
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "initiating download for " + mInfo.mFileName);
+diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java
+index 4babe476f..8d41a7690 100644
+--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java
++++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java
+@@ -50,6 +50,10 @@ import android.provider.Settings.Secure;
+ import android.telephony.TelephonyManager;
+ import android.util.Log;
+
++// -- GODOT start --
++import android.annotation.SuppressLint;
++// -- GODOT end --
++
+ import java.io.File;
+
+ /**
+@@ -578,6 +582,7 @@ public abstract class DownloaderService extends CustomIntentService implements I
+ Log.w(Constants.TAG,
+ "couldn't get connectivity manager to poll network state");
+ } else {
++ @SuppressLint("MissingPermission")
+ NetworkInfo activeInfo = mConnectivityManager
+ .getActiveNetworkInfo();
+ updateNetworkState(activeInfo);
diff --git a/platform/android/java/patches/com.google.android.vending.licensing.patch b/platform/android/java/patches/com.google.android.vending.licensing.patch
new file mode 100644
index 0000000000..9f8e5b8eab
--- /dev/null
+++ b/platform/android/java/patches/com.google.android.vending.licensing.patch
@@ -0,0 +1,42 @@
+diff --git a/platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java b/platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java
+index 7c42bfc28..feb579af0 100644
+--- a/platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java
++++ b/platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java
+@@ -45,6 +45,9 @@ public class PreferenceObfuscator {
+ public void putString(String key, String value) {
+ if (mEditor == null) {
+ mEditor = mPreferences.edit();
++ // -- GODOT start --
++ mEditor.apply();
++ // -- GODOT end --
+ }
+ String obfuscatedValue = mObfuscator.obfuscate(value, key);
+ mEditor.putString(key, obfuscatedValue);
+diff --git a/platform/android/java/src/com/google/android/vending/licensing/util/Base64.java b/platform/android/java/src/com/google/android/vending/licensing/util/Base64.java
+index a0d2779af..a8bf65f9c 100644
+--- a/platform/android/java/src/com/google/android/vending/licensing/util/Base64.java
++++ b/platform/android/java/src/com/google/android/vending/licensing/util/Base64.java
+@@ -31,6 +31,10 @@ package com.google.android.vending.licensing.util;
+ * @version 1.3
+ */
+
++// -- GODOT start --
++import com.godot.game.BuildConfig;
++// -- GODOT end --
++
+ /**
+ * Base64 converter class. This code is not a full-blown MIME encoder;
+ * it simply converts binary data to base64 data and back.
+@@ -341,7 +345,11 @@ public class Base64 {
+ e += 4;
+ }
+
+- assert (e == outBuff.length);
++ // -- GODOT start --
++ //assert (e == outBuff.length);
++ if (BuildConfig.DEBUG && e != outBuff.length)
++ throw new RuntimeException();
++ // -- GODOT end --
+ return outBuff;
+ }
+
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/Constants.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/Constants.java
index ff1eee528f..1dcc370d83 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/Constants.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/Constants.java
@@ -18,113 +18,115 @@ package com.google.android.vending.expansion.downloader;
import java.io.File;
+
/**
* Contains the internal constants that are used in the download manager.
* As a general rule, modifying these constants should be done with care.
*/
public class Constants {
- /** Tag used for debugging/logging */
- public static final String TAG = "LVLDL";
+ /** Tag used for debugging/logging */
+ public static final String TAG = "LVLDL";
- /**
+ /**
* Expansion path where we store obb files
*/
- public static final String EXP_PATH = File.separator + "Android" + File.separator + "obb" + File.separator;
+ public static final String EXP_PATH = File.separator + "Android"
+ + File.separator + "obb" + File.separator;
- /** The intent that gets sent when the service must wake up for a retry */
- public static final String ACTION_RETRY = "android.intent.action.DOWNLOAD_WAKEUP";
+ /** The intent that gets sent when the service must wake up for a retry */
+ public static final String ACTION_RETRY = "android.intent.action.DOWNLOAD_WAKEUP";
- /** the intent that gets sent when clicking a successful download */
- public static final String ACTION_OPEN = "android.intent.action.DOWNLOAD_OPEN";
+ /** the intent that gets sent when clicking a successful download */
+ public static final String ACTION_OPEN = "android.intent.action.DOWNLOAD_OPEN";
- /** the intent that gets sent when clicking an incomplete/failed download */
- public static final String ACTION_LIST = "android.intent.action.DOWNLOAD_LIST";
+ /** the intent that gets sent when clicking an incomplete/failed download */
+ public static final String ACTION_LIST = "android.intent.action.DOWNLOAD_LIST";
- /** the intent that gets sent when deleting the notification of a completed download */
- public static final String ACTION_HIDE = "android.intent.action.DOWNLOAD_HIDE";
+ /** the intent that gets sent when deleting the notification of a completed download */
+ public static final String ACTION_HIDE = "android.intent.action.DOWNLOAD_HIDE";
- /**
+ /**
* When a number has to be appended to the filename, this string is used to separate the
* base filename from the sequence number
*/
- public static final String FILENAME_SEQUENCE_SEPARATOR = "-";
+ public static final String FILENAME_SEQUENCE_SEPARATOR = "-";
- /** The default user agent used for downloads */
- public static final String DEFAULT_USER_AGENT = "Android.LVLDM";
+ /** The default user agent used for downloads */
+ public static final String DEFAULT_USER_AGENT = "Android.LVLDM";
- /** The buffer size used to stream the data */
- public static final int BUFFER_SIZE = 4096;
+ /** The buffer size used to stream the data */
+ public static final int BUFFER_SIZE = 4096;
- /** The minimum amount of progress that has to be done before the progress bar gets updated */
- public static final int MIN_PROGRESS_STEP = 4096;
+ /** The minimum amount of progress that has to be done before the progress bar gets updated */
+ public static final int MIN_PROGRESS_STEP = 4096;
- /** The minimum amount of time that has to elapse before the progress bar gets updated, in ms */
- public static final long MIN_PROGRESS_TIME = 1000;
+ /** The minimum amount of time that has to elapse before the progress bar gets updated, in ms */
+ public static final long MIN_PROGRESS_TIME = 1000;
- /** The maximum number of rows in the database (FIFO) */
- public static final int MAX_DOWNLOADS = 1000;
+ /** The maximum number of rows in the database (FIFO) */
+ public static final int MAX_DOWNLOADS = 1000;
- /**
+ /**
* The number of times that the download manager will retry its network
* operations when no progress is happening before it gives up.
*/
- public static final int MAX_RETRIES = 5;
+ public static final int MAX_RETRIES = 5;
- /**
+ /**
* The minimum amount of time that the download manager accepts for
* a Retry-After response header with a parameter in delta-seconds.
*/
- public static final int MIN_RETRY_AFTER = 30; // 30s
+ public static final int MIN_RETRY_AFTER = 30; // 30s
- /**
+ /**
* The maximum amount of time that the download manager accepts for
* a Retry-After response header with a parameter in delta-seconds.
*/
- public static final int MAX_RETRY_AFTER = 24 * 60 * 60; // 24h
+ public static final int MAX_RETRY_AFTER = 24 * 60 * 60; // 24h
- /**
+ /**
* The maximum number of redirects.
*/
- public static final int MAX_REDIRECTS = 5; // can't be more than 7.
+ public static final int MAX_REDIRECTS = 5; // can't be more than 7.
- /**
+ /**
* The time between a failure and the first retry after an IOException.
* Each subsequent retry grows exponentially, doubling each time.
* The time is in seconds.
*/
- public static final int RETRY_FIRST_DELAY = 30;
+ public static final int RETRY_FIRST_DELAY = 30;
- /** Enable separate connectivity logging */
- public static final boolean LOGX = true;
+ /** Enable separate connectivity logging */
+ public static final boolean LOGX = true;
- /** Enable verbose logging */
- public static final boolean LOGV = false;
+ /** Enable verbose logging */
+ public static final boolean LOGV = false;
- /** Enable super-verbose logging */
- private static final boolean LOCAL_LOGVV = false;
- public static final boolean LOGVV = LOCAL_LOGVV && LOGV;
+ /** Enable super-verbose logging */
+ private static final boolean LOCAL_LOGVV = false;
+ public static final boolean LOGVV = LOCAL_LOGVV && LOGV;
- /**
+ /**
* This download has successfully completed.
* Warning: there might be other status values that indicate success
* in the future.
* Use isSucccess() to capture the entire category.
*/
- public static final int STATUS_SUCCESS = 200;
+ public static final int STATUS_SUCCESS = 200;
- /**
+ /**
* This request couldn't be parsed. This is also used when processing
* requests with unknown/unsupported URI schemes.
*/
- public static final int STATUS_BAD_REQUEST = 400;
+ public static final int STATUS_BAD_REQUEST = 400;
- /**
+ /**
* This download can't be performed because the content type cannot be
* handled.
*/
- public static final int STATUS_NOT_ACCEPTABLE = 406;
+ public static final int STATUS_NOT_ACCEPTABLE = 406;
- /**
+ /**
* This download cannot be performed because the length cannot be
* determined accurately. This is the code for the HTTP error "Length
* Required", which is typically used when making requests that require
@@ -133,101 +135,102 @@ public class Constants {
* accurately (therefore making it impossible to know when a download
* completes).
*/
- public static final int STATUS_LENGTH_REQUIRED = 411;
+ public static final int STATUS_LENGTH_REQUIRED = 411;
- /**
+ /**
* This download was interrupted and cannot be resumed.
* This is the code for the HTTP error "Precondition Failed", and it is
* also used in situations where the client doesn't have an ETag at all.
*/
- public static final int STATUS_PRECONDITION_FAILED = 412;
+ public static final int STATUS_PRECONDITION_FAILED = 412;
- /**
+ /**
* The lowest-valued error status that is not an actual HTTP status code.
*/
- public static final int MIN_ARTIFICIAL_ERROR_STATUS = 488;
+ public static final int MIN_ARTIFICIAL_ERROR_STATUS = 488;
- /**
+ /**
* The requested destination file already exists.
*/
- public static final int STATUS_FILE_ALREADY_EXISTS_ERROR = 488;
+ public static final int STATUS_FILE_ALREADY_EXISTS_ERROR = 488;
- /**
+ /**
* Some possibly transient error occurred, but we can't resume the download.
*/
- public static final int STATUS_CANNOT_RESUME = 489;
+ public static final int STATUS_CANNOT_RESUME = 489;
- /**
+ /**
* This download was canceled
*/
- public static final int STATUS_CANCELED = 490;
+ public static final int STATUS_CANCELED = 490;
- /**
+ /**
* This download has completed with an error.
* Warning: there will be other status values that indicate errors in
* the future. Use isStatusError() to capture the entire category.
*/
- public static final int STATUS_UNKNOWN_ERROR = 491;
+ public static final int STATUS_UNKNOWN_ERROR = 491;
- /**
+ /**
* This download couldn't be completed because of a storage issue.
* Typically, that's because the filesystem is missing or full.
* Use the more specific {@link #STATUS_INSUFFICIENT_SPACE_ERROR}
* and {@link #STATUS_DEVICE_NOT_FOUND_ERROR} when appropriate.
*/
- public static final int STATUS_FILE_ERROR = 492;
+ public static final int STATUS_FILE_ERROR = 492;
- /**
+ /**
* This download couldn't be completed because of an HTTP
* redirect response that the download manager couldn't
* handle.
*/
- public static final int STATUS_UNHANDLED_REDIRECT = 493;
+ public static final int STATUS_UNHANDLED_REDIRECT = 493;
- /**
+ /**
* This download couldn't be completed because of an
* unspecified unhandled HTTP code.
*/
- public static final int STATUS_UNHANDLED_HTTP_CODE = 494;
+ public static final int STATUS_UNHANDLED_HTTP_CODE = 494;
- /**
+ /**
* This download couldn't be completed because of an
* error receiving or processing data at the HTTP level.
*/
- public static final int STATUS_HTTP_DATA_ERROR = 495;
+ public static final int STATUS_HTTP_DATA_ERROR = 495;
- /**
+ /**
* This download couldn't be completed because of an
* HttpException while setting up the request.
*/
- public static final int STATUS_HTTP_EXCEPTION = 496;
+ public static final int STATUS_HTTP_EXCEPTION = 496;
- /**
+ /**
* This download couldn't be completed because there were
* too many redirects.
*/
- public static final int STATUS_TOO_MANY_REDIRECTS = 497;
+ public static final int STATUS_TOO_MANY_REDIRECTS = 497;
- /**
+ /**
* This download couldn't be completed due to insufficient storage
* space. Typically, this is because the SD card is full.
*/
- public static final int STATUS_INSUFFICIENT_SPACE_ERROR = 498;
+ public static final int STATUS_INSUFFICIENT_SPACE_ERROR = 498;
- /**
+ /**
* This download couldn't be completed because no external storage
* device was found. Typically, this is because the SD card is not
* mounted.
*/
- public static final int STATUS_DEVICE_NOT_FOUND_ERROR = 499;
+ public static final int STATUS_DEVICE_NOT_FOUND_ERROR = 499;
- /**
+ /**
* The wake duration to check to see if a download is possible.
*/
- public static final long WATCHDOG_WAKE_TIMER = 60 * 1000;
+ public static final long WATCHDOG_WAKE_TIMER = 60*1000;
- /**
+ /**
* The wake duration to check to see if the process was killed.
*/
- public static final long ACTIVE_THREAD_WATCHDOG = 5 * 1000;
+ public static final long ACTIVE_THREAD_WATCHDOG = 5*1000;
+
} \ No newline at end of file
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java
index 9a78a6d3df..9cb294d721 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java
@@ -19,6 +19,7 @@ package com.google.android.vending.expansion.downloader;
import android.os.Parcel;
import android.os.Parcelable;
+
/**
* This class contains progress information about the active download(s).
*
@@ -30,49 +31,50 @@ import android.os.Parcelable;
* as the progress so far, time remaining and current speed.
*/
public class DownloadProgressInfo implements Parcelable {
- public long mOverallTotal;
- public long mOverallProgress;
- public long mTimeRemaining; // time remaining
- public float mCurrentSpeed; // speed in KB/S
+ public long mOverallTotal;
+ public long mOverallProgress;
+ public long mTimeRemaining; // time remaining
+ public float mCurrentSpeed; // speed in KB/S
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
- @Override
- public int describeContents() {
- return 0;
- }
+ @Override
+ public void writeToParcel(Parcel p, int i) {
+ p.writeLong(mOverallTotal);
+ p.writeLong(mOverallProgress);
+ p.writeLong(mTimeRemaining);
+ p.writeFloat(mCurrentSpeed);
+ }
- @Override
- public void writeToParcel(Parcel p, int i) {
- p.writeLong(mOverallTotal);
- p.writeLong(mOverallProgress);
- p.writeLong(mTimeRemaining);
- p.writeFloat(mCurrentSpeed);
- }
+ public DownloadProgressInfo(Parcel p) {
+ mOverallTotal = p.readLong();
+ mOverallProgress = p.readLong();
+ mTimeRemaining = p.readLong();
+ mCurrentSpeed = p.readFloat();
+ }
- public DownloadProgressInfo(Parcel p) {
- mOverallTotal = p.readLong();
- mOverallProgress = p.readLong();
- mTimeRemaining = p.readLong();
- mCurrentSpeed = p.readFloat();
- }
+ public DownloadProgressInfo(long overallTotal, long overallProgress,
+ long timeRemaining,
+ float currentSpeed) {
+ this.mOverallTotal = overallTotal;
+ this.mOverallProgress = overallProgress;
+ this.mTimeRemaining = timeRemaining;
+ this.mCurrentSpeed = currentSpeed;
+ }
- public DownloadProgressInfo(long overallTotal, long overallProgress,
- long timeRemaining,
- float currentSpeed) {
- this.mOverallTotal = overallTotal;
- this.mOverallProgress = overallProgress;
- this.mTimeRemaining = timeRemaining;
- this.mCurrentSpeed = currentSpeed;
- }
+ public static final Creator<DownloadProgressInfo> CREATOR = new Creator<DownloadProgressInfo>() {
+ @Override
+ public DownloadProgressInfo createFromParcel(Parcel parcel) {
+ return new DownloadProgressInfo(parcel);
+ }
- public static final Creator<DownloadProgressInfo> CREATOR = new Creator<DownloadProgressInfo>() {
- @Override
- public DownloadProgressInfo createFromParcel(Parcel parcel) {
- return new DownloadProgressInfo(parcel);
- }
+ @Override
+ public DownloadProgressInfo[] newArray(int i) {
+ return new DownloadProgressInfo[i];
+ }
+ };
- @Override
- public DownloadProgressInfo[] newArray(int i) {
- return new DownloadProgressInfo[i];
- }
- };
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java
index 146426ef83..452c7d1483 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java
@@ -32,7 +32,10 @@ import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
+// -- GODOT start --
import java.lang.ref.WeakReference;
+// -- GODOT end --
+
/**
* This class binds the service API to your application client. It contains the IDownloaderClient proxy,
@@ -58,172 +61,175 @@ import java.lang.ref.WeakReference;
* interface.
*/
public class DownloaderClientMarshaller {
- public static final int MSG_ONDOWNLOADSTATE_CHANGED = 10;
- public static final int MSG_ONDOWNLOADPROGRESS = 11;
- public static final int MSG_ONSERVICECONNECTED = 12;
+ public static final int MSG_ONDOWNLOADSTATE_CHANGED = 10;
+ public static final int MSG_ONDOWNLOADPROGRESS = 11;
+ public static final int MSG_ONSERVICECONNECTED = 12;
- public static final String PARAM_NEW_STATE = "newState";
- public static final String PARAM_PROGRESS = "progress";
- public static final String PARAM_MESSENGER = DownloaderService.EXTRA_MESSAGE_HANDLER;
+ public static final String PARAM_NEW_STATE = "newState";
+ public static final String PARAM_PROGRESS = "progress";
+ public static final String PARAM_MESSENGER = DownloaderService.EXTRA_MESSAGE_HANDLER;
- public static final int NO_DOWNLOAD_REQUIRED = DownloaderService.NO_DOWNLOAD_REQUIRED;
- public static final int LVL_CHECK_REQUIRED = DownloaderService.LVL_CHECK_REQUIRED;
- public static final int DOWNLOAD_REQUIRED = DownloaderService.DOWNLOAD_REQUIRED;
+ public static final int NO_DOWNLOAD_REQUIRED = DownloaderService.NO_DOWNLOAD_REQUIRED;
+ public static final int LVL_CHECK_REQUIRED = DownloaderService.LVL_CHECK_REQUIRED;
+ public static final int DOWNLOAD_REQUIRED = DownloaderService.DOWNLOAD_REQUIRED;
- private static class Proxy implements IDownloaderClient {
- private Messenger mServiceMessenger;
+ private static class Proxy implements IDownloaderClient {
+ private Messenger mServiceMessenger;
- @Override
- public void onDownloadStateChanged(int newState) {
- Bundle params = new Bundle(1);
- params.putInt(PARAM_NEW_STATE, newState);
- send(MSG_ONDOWNLOADSTATE_CHANGED, params);
- }
+ @Override
+ public void onDownloadStateChanged(int newState) {
+ Bundle params = new Bundle(1);
+ params.putInt(PARAM_NEW_STATE, newState);
+ send(MSG_ONDOWNLOADSTATE_CHANGED, params);
+ }
- @Override
- public void onDownloadProgress(DownloadProgressInfo progress) {
- Bundle params = new Bundle(1);
- params.putParcelable(PARAM_PROGRESS, progress);
- send(MSG_ONDOWNLOADPROGRESS, params);
- }
+ @Override
+ public void onDownloadProgress(DownloadProgressInfo progress) {
+ Bundle params = new Bundle(1);
+ params.putParcelable(PARAM_PROGRESS, progress);
+ send(MSG_ONDOWNLOADPROGRESS, params);
+ }
- private void send(int method, Bundle params) {
- Message m = Message.obtain(null, method);
- m.setData(params);
- try {
- mServiceMessenger.send(m);
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
+ private void send(int method, Bundle params) {
+ Message m = Message.obtain(null, method);
+ m.setData(params);
+ try {
+ mServiceMessenger.send(m);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ }
- public Proxy(Messenger msg) {
- mServiceMessenger = msg;
- }
+ public Proxy(Messenger msg) {
+ mServiceMessenger = msg;
+ }
- @Override
- public void onServiceConnected(Messenger m) {
- /**
+ @Override
+ public void onServiceConnected(Messenger m) {
+ /**
* This is never called through the proxy.
*/
- }
- }
+ }
+ }
- private static class Stub implements IStub {
- private IDownloaderClient mItf = null;
- private Class<?> mDownloaderServiceClass;
- private boolean mBound;
- private Messenger mServiceMessenger;
- private Context mContext;
- /**
+ private static class Stub implements IStub {
+ private IDownloaderClient mItf = null;
+ private Class<?> mDownloaderServiceClass;
+ private boolean mBound;
+ private Messenger mServiceMessenger;
+ private Context mContext;
+ /**
* Target we publish for clients to send messages to IncomingHandler.
*/
- private final MessengerHandlerClient mMsgHandler = new MessengerHandlerClient(this);
- final Messenger mMessenger = new Messenger(mMsgHandler);
+ // -- GODOT start --
+ private final MessengerHandlerClient mMsgHandler = new MessengerHandlerClient(this);
+ final Messenger mMessenger = new Messenger(mMsgHandler);
- private static class MessengerHandlerClient extends Handler {
- private final WeakReference<Stub> mDownloader;
- public MessengerHandlerClient(Stub downloader) {
- mDownloader = new WeakReference<>(downloader);
- }
+ private static class MessengerHandlerClient extends Handler {
+ private final WeakReference<Stub> mDownloader;
+ public MessengerHandlerClient(Stub downloader) {
+ mDownloader = new WeakReference<>(downloader);
+ }
- @Override
- public void handleMessage(Message msg) {
- Stub downloader = mDownloader.get();
- if (downloader != null) {
- downloader.handleMessage(msg);
- }
- }
- }
+ @Override
+ public void handleMessage(Message msg) {
+ Stub downloader = mDownloader.get();
+ if (downloader != null) {
+ downloader.handleMessage(msg);
+ }
+ }
+ }
- private void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_ONDOWNLOADPROGRESS:
- Bundle bun = msg.getData();
- if (null != mContext) {
- bun.setClassLoader(mContext.getClassLoader());
- DownloadProgressInfo dpi = (DownloadProgressInfo)msg.getData()
- .getParcelable(PARAM_PROGRESS);
- mItf.onDownloadProgress(dpi);
- }
- break;
- case MSG_ONDOWNLOADSTATE_CHANGED:
- mItf.onDownloadStateChanged(msg.getData().getInt(PARAM_NEW_STATE));
- break;
- case MSG_ONSERVICECONNECTED:
- mItf.onServiceConnected(
- (Messenger)msg.getData().getParcelable(PARAM_MESSENGER));
- break;
- }
- }
+ private void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_ONDOWNLOADPROGRESS:
+ Bundle bun = msg.getData();
+ if (null != mContext) {
+ bun.setClassLoader(mContext.getClassLoader());
+ DownloadProgressInfo dpi = (DownloadProgressInfo)msg.getData()
+ .getParcelable(PARAM_PROGRESS);
+ mItf.onDownloadProgress(dpi);
+ }
+ break;
+ case MSG_ONDOWNLOADSTATE_CHANGED:
+ mItf.onDownloadStateChanged(msg.getData().getInt(PARAM_NEW_STATE));
+ break;
+ case MSG_ONSERVICECONNECTED:
+ mItf.onServiceConnected(
+ (Messenger)msg.getData().getParcelable(PARAM_MESSENGER));
+ break;
+ }
+ }
+ // -- GODOT end --
- public Stub(IDownloaderClient itf, Class<?> downloaderService) {
- mItf = itf;
- mDownloaderServiceClass = downloaderService;
- }
+ public Stub(IDownloaderClient itf, Class<?> downloaderService) {
+ mItf = itf;
+ mDownloaderServiceClass = downloaderService;
+ }
- /**
+ /**
* Class for interacting with the main interface of the service.
*/
- private ServiceConnection mConnection = new ServiceConnection() {
- public void onServiceConnected(ComponentName className, IBinder service) {
- // This is called when the connection with the service has been
- // established, giving us the object we can use to
- // interact with the service. We are communicating with the
- // service using a Messenger, so here we get a client-side
- // representation of that from the raw IBinder object.
- mServiceMessenger = new Messenger(service);
- mItf.onServiceConnected(
- mServiceMessenger);
- }
+ private ServiceConnection mConnection = new ServiceConnection() {
+ public void onServiceConnected(ComponentName className, IBinder service) {
+ // This is called when the connection with the service has been
+ // established, giving us the object we can use to
+ // interact with the service. We are communicating with the
+ // service using a Messenger, so here we get a client-side
+ // representation of that from the raw IBinder object.
+ mServiceMessenger = new Messenger(service);
+ mItf.onServiceConnected(
+ mServiceMessenger);
+ }
+
+ public void onServiceDisconnected(ComponentName className) {
+ // This is called when the connection with the service has been
+ // unexpectedly disconnected -- that is, its process crashed.
+ mServiceMessenger = null;
+ }
+ };
- public void onServiceDisconnected(ComponentName className) {
- // This is called when the connection with the service has been
- // unexpectedly disconnected -- that is, its process crashed.
- mServiceMessenger = null;
- }
- };
+ @Override
+ public void connect(Context c) {
+ mContext = c;
+ Intent bindIntent = new Intent(c, mDownloaderServiceClass);
+ bindIntent.putExtra(PARAM_MESSENGER, mMessenger);
+ if ( !c.bindService(bindIntent, mConnection, Context.BIND_DEBUG_UNBIND) ) {
+ if ( Constants.LOGVV ) {
+ Log.d(Constants.TAG, "Service Unbound");
+ }
+ } else {
+ mBound = true;
+ }
- @Override
- public void connect(Context c) {
- mContext = c;
- Intent bindIntent = new Intent(c, mDownloaderServiceClass);
- bindIntent.putExtra(PARAM_MESSENGER, mMessenger);
- if (!c.bindService(bindIntent, mConnection, Context.BIND_DEBUG_UNBIND)) {
- if (Constants.LOGVV) {
- Log.d(Constants.TAG, "Service Unbound");
- }
- } else {
- mBound = true;
- }
- }
+ }
- @Override
- public void disconnect(Context c) {
- if (mBound) {
- c.unbindService(mConnection);
- mBound = false;
- }
- mContext = null;
- }
+ @Override
+ public void disconnect(Context c) {
+ if (mBound) {
+ c.unbindService(mConnection);
+ mBound = false;
+ }
+ mContext = null;
+ }
- @Override
- public Messenger getMessenger() {
- return mMessenger;
- }
- }
+ @Override
+ public Messenger getMessenger() {
+ return mMessenger;
+ }
+ }
- /**
+ /**
* Returns a proxy that will marshal calls to IDownloaderClient methods
*
* @param msg
* @return
*/
- public static IDownloaderClient CreateProxy(Messenger msg) {
- return new Proxy(msg);
- }
+ public static IDownloaderClient CreateProxy(Messenger msg) {
+ return new Proxy(msg);
+ }
- /**
+ /**
* Returns a stub object that, when connected, will listen for marshaled
* {@link IDownloaderClient} methods and translate them into calls to the supplied
* interface.
@@ -235,11 +241,11 @@ public class DownloaderClientMarshaller {
* @return The {@link IStub} that allows you to connect to the service such that
* your {@link IDownloaderClient} receives status updates.
*/
- public static IStub CreateStub(IDownloaderClient itf, Class<?> downloaderService) {
- return new Stub(itf, downloaderService);
- }
+ public static IStub CreateStub(IDownloaderClient itf, Class<?> downloaderService) {
+ return new Stub(itf, downloaderService);
+ }
- /**
+ /**
* Starts the download if necessary. This function starts a flow that does `
* many things. 1) Checks to see if the APK version has been checked and
* the metadata database updated 2) If the APK version does not match,
@@ -262,14 +268,14 @@ public class DownloaderClientMarshaller {
* #DOWNLOAD_REQUIRED}.
* @throws NameNotFoundException
*/
- public static int startDownloadServiceIfRequired(Context context, PendingIntent notificationClient,
- Class<?> serviceClass)
- throws NameNotFoundException {
- return DownloaderService.startDownloadServiceIfRequired(context, notificationClient,
- serviceClass);
- }
+ public static int startDownloadServiceIfRequired(Context context, PendingIntent notificationClient,
+ Class<?> serviceClass)
+ throws NameNotFoundException {
+ return DownloaderService.startDownloadServiceIfRequired(context, notificationClient,
+ serviceClass);
+ }
- /**
+ /**
* This version assumes that the intent contains the pending intent as a parameter. This
* is used for responding to alarms.
* <p>The pending intent must be in an extra with the key {@link
@@ -281,10 +287,11 @@ public class DownloaderClientMarshaller {
* @return
* @throws NameNotFoundException
*/
- public static int startDownloadServiceIfRequired(Context context, Intent notificationClient,
- Class<?> serviceClass)
- throws NameNotFoundException {
- return DownloaderService.startDownloadServiceIfRequired(context, notificationClient,
- serviceClass);
- }
+ public static int startDownloadServiceIfRequired(Context context, Intent notificationClient,
+ Class<?> serviceClass)
+ throws NameNotFoundException {
+ return DownloaderService.startDownloadServiceIfRequired(context, notificationClient,
+ serviceClass);
+ }
+
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java
index f75debe32d..3771d19c9b 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java
@@ -25,7 +25,10 @@ import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
+// -- GODOT start --
import java.lang.ref.WeakReference;
+// -- GODOT end --
+
/**
* This class is used by the client activity to proxy requests to the Downloader
@@ -38,147 +41,151 @@ import java.lang.ref.WeakReference;
*/
public class DownloaderServiceMarshaller {
- public static final int MSG_REQUEST_ABORT_DOWNLOAD =
- 1;
- public static final int MSG_REQUEST_PAUSE_DOWNLOAD =
- 2;
- public static final int MSG_SET_DOWNLOAD_FLAGS =
- 3;
- public static final int MSG_REQUEST_CONTINUE_DOWNLOAD =
- 4;
- public static final int MSG_REQUEST_DOWNLOAD_STATE =
- 5;
- public static final int MSG_REQUEST_CLIENT_UPDATE =
- 6;
-
- public static final String PARAMS_FLAGS = "flags";
- public static final String PARAM_MESSENGER = DownloaderService.EXTRA_MESSAGE_HANDLER;
-
- private static class Proxy implements IDownloaderService {
- private Messenger mMsg;
-
- private void send(int method, Bundle params) {
- Message m = Message.obtain(null, method);
- m.setData(params);
- try {
- mMsg.send(m);
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
-
- public Proxy(Messenger msg) {
- mMsg = msg;
- }
-
- @Override
- public void requestAbortDownload() {
- send(MSG_REQUEST_ABORT_DOWNLOAD, new Bundle());
- }
-
- @Override
- public void requestPauseDownload() {
- send(MSG_REQUEST_PAUSE_DOWNLOAD, new Bundle());
- }
-
- @Override
- public void setDownloadFlags(int flags) {
- Bundle params = new Bundle();
- params.putInt(PARAMS_FLAGS, flags);
- send(MSG_SET_DOWNLOAD_FLAGS, params);
- }
-
- @Override
- public void requestContinueDownload() {
- send(MSG_REQUEST_CONTINUE_DOWNLOAD, new Bundle());
- }
-
- @Override
- public void requestDownloadStatus() {
- send(MSG_REQUEST_DOWNLOAD_STATE, new Bundle());
- }
-
- @Override
- public void onClientUpdated(Messenger clientMessenger) {
- Bundle bundle = new Bundle(1);
- bundle.putParcelable(PARAM_MESSENGER, clientMessenger);
- send(MSG_REQUEST_CLIENT_UPDATE, bundle);
- }
- }
-
- private static class Stub implements IStub {
- private IDownloaderService mItf = null;
- private final MessengerHandlerServer mMsgHandler = new MessengerHandlerServer(this);
- final Messenger mMessenger = new Messenger(mMsgHandler);
-
- private static class MessengerHandlerServer extends Handler {
- private final WeakReference<Stub> mDownloader;
- public MessengerHandlerServer(Stub downloader) {
- mDownloader = new WeakReference<>(downloader);
- }
-
- @Override
- public void handleMessage(Message msg) {
- Stub downloader = mDownloader.get();
- if (downloader != null) {
- downloader.handleMessage(msg);
- }
- }
- }
-
- private void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_REQUEST_ABORT_DOWNLOAD:
- mItf.requestAbortDownload();
- break;
- case MSG_REQUEST_CONTINUE_DOWNLOAD:
- mItf.requestContinueDownload();
- break;
- case MSG_REQUEST_PAUSE_DOWNLOAD:
- mItf.requestPauseDownload();
- break;
- case MSG_SET_DOWNLOAD_FLAGS:
- mItf.setDownloadFlags(msg.getData().getInt(PARAMS_FLAGS));
- break;
- case MSG_REQUEST_DOWNLOAD_STATE:
- mItf.requestDownloadStatus();
- break;
- case MSG_REQUEST_CLIENT_UPDATE:
- mItf.onClientUpdated((Messenger)msg.getData().getParcelable(
- PARAM_MESSENGER));
- break;
- }
- }
-
- public Stub(IDownloaderService itf) {
- mItf = itf;
- }
-
- @Override
- public Messenger getMessenger() {
- return mMessenger;
- }
-
- @Override
- public void connect(Context c) {
- }
-
- @Override
- public void disconnect(Context c) {
- }
- }
-
- /**
+ public static final int MSG_REQUEST_ABORT_DOWNLOAD =
+ 1;
+ public static final int MSG_REQUEST_PAUSE_DOWNLOAD =
+ 2;
+ public static final int MSG_SET_DOWNLOAD_FLAGS =
+ 3;
+ public static final int MSG_REQUEST_CONTINUE_DOWNLOAD =
+ 4;
+ public static final int MSG_REQUEST_DOWNLOAD_STATE =
+ 5;
+ public static final int MSG_REQUEST_CLIENT_UPDATE =
+ 6;
+
+ public static final String PARAMS_FLAGS = "flags";
+ public static final String PARAM_MESSENGER = DownloaderService.EXTRA_MESSAGE_HANDLER;
+
+ private static class Proxy implements IDownloaderService {
+ private Messenger mMsg;
+
+ private void send(int method, Bundle params) {
+ Message m = Message.obtain(null, method);
+ m.setData(params);
+ try {
+ mMsg.send(m);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public Proxy(Messenger msg) {
+ mMsg = msg;
+ }
+
+ @Override
+ public void requestAbortDownload() {
+ send(MSG_REQUEST_ABORT_DOWNLOAD, new Bundle());
+ }
+
+ @Override
+ public void requestPauseDownload() {
+ send(MSG_REQUEST_PAUSE_DOWNLOAD, new Bundle());
+ }
+
+ @Override
+ public void setDownloadFlags(int flags) {
+ Bundle params = new Bundle();
+ params.putInt(PARAMS_FLAGS, flags);
+ send(MSG_SET_DOWNLOAD_FLAGS, params);
+ }
+
+ @Override
+ public void requestContinueDownload() {
+ send(MSG_REQUEST_CONTINUE_DOWNLOAD, new Bundle());
+ }
+
+ @Override
+ public void requestDownloadStatus() {
+ send(MSG_REQUEST_DOWNLOAD_STATE, new Bundle());
+ }
+
+ @Override
+ public void onClientUpdated(Messenger clientMessenger) {
+ Bundle bundle = new Bundle(1);
+ bundle.putParcelable(PARAM_MESSENGER, clientMessenger);
+ send(MSG_REQUEST_CLIENT_UPDATE, bundle);
+ }
+ }
+
+ private static class Stub implements IStub {
+ private IDownloaderService mItf = null;
+ // -- GODOT start --
+ private final MessengerHandlerServer mMsgHandler = new MessengerHandlerServer(this);
+ final Messenger mMessenger = new Messenger(mMsgHandler);
+
+ private static class MessengerHandlerServer extends Handler {
+ private final WeakReference<Stub> mDownloader;
+ public MessengerHandlerServer(Stub downloader) {
+ mDownloader = new WeakReference<>(downloader);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ Stub downloader = mDownloader.get();
+ if (downloader != null) {
+ downloader.handleMessage(msg);
+ }
+ }
+ }
+
+ private void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_REQUEST_ABORT_DOWNLOAD:
+ mItf.requestAbortDownload();
+ break;
+ case MSG_REQUEST_CONTINUE_DOWNLOAD:
+ mItf.requestContinueDownload();
+ break;
+ case MSG_REQUEST_PAUSE_DOWNLOAD:
+ mItf.requestPauseDownload();
+ break;
+ case MSG_SET_DOWNLOAD_FLAGS:
+ mItf.setDownloadFlags(msg.getData().getInt(PARAMS_FLAGS));
+ break;
+ case MSG_REQUEST_DOWNLOAD_STATE:
+ mItf.requestDownloadStatus();
+ break;
+ case MSG_REQUEST_CLIENT_UPDATE:
+ mItf.onClientUpdated((Messenger)msg.getData().getParcelable(
+ PARAM_MESSENGER));
+ break;
+ }
+ }
+ // -- GODOT end --
+
+ public Stub(IDownloaderService itf) {
+ mItf = itf;
+ }
+
+ @Override
+ public Messenger getMessenger() {
+ return mMessenger;
+ }
+
+ @Override
+ public void connect(Context c) {
+
+ }
+
+ @Override
+ public void disconnect(Context c) {
+
+ }
+ }
+
+ /**
* Returns a proxy that will marshall calls to IDownloaderService methods
*
* @param ctx
* @return
*/
- public static IDownloaderService CreateProxy(Messenger msg) {
- return new Proxy(msg);
- }
+ public static IDownloaderService CreateProxy(Messenger msg) {
+ return new Proxy(msg);
+ }
- /**
+ /**
* Returns a stub object that, when connected, will listen for marshalled
* IDownloaderService methods and translate them into calls to the supplied
* interface.
@@ -187,7 +194,8 @@ public class DownloaderServiceMarshaller {
* when remote method calls are unmarshalled.
* @return
*/
- public static IStub CreateStub(IDownloaderService itf) {
- return new Stub(itf);
- }
+ public static IStub CreateStub(IDownloaderService itf) {
+ return new Stub(itf);
+ }
+
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java
index cd8726533f..36cd6aacfe 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java
@@ -24,7 +24,10 @@ import android.os.StatFs;
import android.os.SystemClock;
import android.util.Log;
+// -- GODOT start --
+//import com.android.vending.expansion.downloader.R;
import com.godot.game.R;
+// -- GODOT end --
import java.io.File;
import java.text.SimpleDateFormat;
@@ -40,95 +43,96 @@ import java.util.regex.Pattern;
*/
public class Helpers {
- public static Random sRandom = new Random(SystemClock.uptimeMillis());
+ public static Random sRandom = new Random(SystemClock.uptimeMillis());
- /** Regex used to parse content-disposition headers */
- private static final Pattern CONTENT_DISPOSITION_PATTERN = Pattern
- .compile("attachment;\\s*filename\\s*=\\s*\"([^\"]*)\"");
+ /** Regex used to parse content-disposition headers */
+ private static final Pattern CONTENT_DISPOSITION_PATTERN = Pattern
+ .compile("attachment;\\s*filename\\s*=\\s*\"([^\"]*)\"");
- private Helpers() {
- }
+ private Helpers() {
+ }
- /*
+ /*
* Parse the Content-Disposition HTTP Header. The format of the header is defined here:
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html This header provides a filename for
* content that is going to be downloaded to the file system. We only support the attachment
* type.
*/
- static String parseContentDisposition(String contentDisposition) {
- try {
- Matcher m = CONTENT_DISPOSITION_PATTERN.matcher(contentDisposition);
- if (m.find()) {
- return m.group(1);
- }
- } catch (IllegalStateException ex) {
- // This function is defined as returning null when it can't parse
- // the header
- }
- return null;
- }
+ static String parseContentDisposition(String contentDisposition) {
+ try {
+ Matcher m = CONTENT_DISPOSITION_PATTERN.matcher(contentDisposition);
+ if (m.find()) {
+ return m.group(1);
+ }
+ } catch (IllegalStateException ex) {
+ // This function is defined as returning null when it can't parse
+ // the header
+ }
+ return null;
+ }
- /**
+ /**
* @return the root of the filesystem containing the given path
*/
- public static File getFilesystemRoot(String path) {
- File cache = Environment.getDownloadCacheDirectory();
- if (path.startsWith(cache.getPath())) {
- return cache;
- }
- File external = Environment.getExternalStorageDirectory();
- if (path.startsWith(external.getPath())) {
- return external;
- }
- throw new IllegalArgumentException(
- "Cannot determine filesystem root for " + path);
- }
+ public static File getFilesystemRoot(String path) {
+ File cache = Environment.getDownloadCacheDirectory();
+ if (path.startsWith(cache.getPath())) {
+ return cache;
+ }
+ File external = Environment.getExternalStorageDirectory();
+ if (path.startsWith(external.getPath())) {
+ return external;
+ }
+ throw new IllegalArgumentException(
+ "Cannot determine filesystem root for " + path);
+ }
- public static boolean isExternalMediaMounted() {
- if (!Environment.getExternalStorageState().equals(
- Environment.MEDIA_MOUNTED)) {
- // No SD card found.
- if (Constants.LOGVV) {
- Log.d(Constants.TAG, "no external storage");
- }
- return false;
- }
- return true;
- }
+ public static boolean isExternalMediaMounted() {
+ if (!Environment.getExternalStorageState().equals(
+ Environment.MEDIA_MOUNTED)) {
+ // No SD card found.
+ if (Constants.LOGVV) {
+ Log.d(Constants.TAG, "no external storage");
+ }
+ return false;
+ }
+ return true;
+ }
- /**
+ /**
* @return the number of bytes available on the filesystem rooted at the given File
*/
- public static long getAvailableBytes(File root) {
- StatFs stat = new StatFs(root.getPath());
- // put a bit of margin (in case creating the file grows the system by a
- // few blocks)
- long availableBlocks = (long)stat.getAvailableBlocks() - 4;
- return stat.getBlockSize() * availableBlocks;
- }
+ public static long getAvailableBytes(File root) {
+ StatFs stat = new StatFs(root.getPath());
+ // put a bit of margin (in case creating the file grows the system by a
+ // few blocks)
+ long availableBlocks = (long) stat.getAvailableBlocks() - 4;
+ return stat.getBlockSize() * availableBlocks;
+ }
- /**
+ /**
* Checks whether the filename looks legitimate
*/
- public static boolean isFilenameValid(String filename) {
- filename = filename.replaceFirst("/+", "/"); // normalize leading
- // slashes
- return filename.startsWith(Environment.getDownloadCacheDirectory().toString()) || filename.startsWith(Environment.getExternalStorageDirectory().toString());
- }
+ public static boolean isFilenameValid(String filename) {
+ filename = filename.replaceFirst("/+", "/"); // normalize leading
+ // slashes
+ return filename.startsWith(Environment.getDownloadCacheDirectory().toString())
+ || filename.startsWith(Environment.getExternalStorageDirectory().toString());
+ }
- /*
+ /*
* Delete the given file from device
*/
- /* package */ static void deleteFile(String path) {
- try {
- File file = new File(path);
- file.delete();
- } catch (Exception e) {
- Log.w(Constants.TAG, "file: '" + path + "' couldn't be deleted", e);
- }
- }
+ /* package */static void deleteFile(String path) {
+ try {
+ File file = new File(path);
+ file.delete();
+ } catch (Exception e) {
+ Log.w(Constants.TAG, "file: '" + path + "' couldn't be deleted", e);
+ }
+ }
- /**
+ /**
* Showing progress in MB here. It would be nice to choose the unit (KB, MB, GB) based on total
* file size, but given what we know about the expected ranges of file sizes for APK expansion
* files, it's probably not necessary.
@@ -138,63 +142,69 @@ public class Helpers {
* @return
*/
- static public String getDownloadProgressString(long overallProgress, long overallTotal) {
- if (overallTotal == 0) {
- if (Constants.LOGVV) {
- Log.e(Constants.TAG, "Notification called when total is zero");
- }
- return "";
- }
- return String.format(Locale.ENGLISH, "%.2f",
- (float)overallProgress / (1024.0f * 1024.0f)) +
- "MB /" +
- String.format(Locale.ENGLISH, "%.2f", (float)overallTotal / (1024.0f * 1024.0f)) + "MB";
- }
+ static public String getDownloadProgressString(long overallProgress, long overallTotal) {
+ if (overallTotal == 0) {
+ if (Constants.LOGVV) {
+ Log.e(Constants.TAG, "Notification called when total is zero");
+ }
+ return "";
+ }
+ // -- GODOT start --
+ return String.format(Locale.ENGLISH, "%.2f",
+ (float) overallProgress / (1024.0f * 1024.0f))
+ + "MB /" +
+ String.format(Locale.ENGLISH, "%.2f", (float) overallTotal /
+ (1024.0f * 1024.0f))
+ + "MB";
+ // -- GODOT end --
+ }
- /**
+ /**
* Adds a percentile to getDownloadProgressString.
*
* @param overallProgress
* @param overallTotal
* @return
*/
- static public String getDownloadProgressStringNotification(long overallProgress,
- long overallTotal) {
- if (overallTotal == 0) {
- if (Constants.LOGVV) {
- Log.e(Constants.TAG, "Notification called when total is zero");
- }
- return "";
- }
- return getDownloadProgressString(overallProgress, overallTotal) + " (" +
- getDownloadProgressPercent(overallProgress, overallTotal) + ")";
- }
+ static public String getDownloadProgressStringNotification(long overallProgress,
+ long overallTotal) {
+ if (overallTotal == 0) {
+ if (Constants.LOGVV) {
+ Log.e(Constants.TAG, "Notification called when total is zero");
+ }
+ return "";
+ }
+ return getDownloadProgressString(overallProgress, overallTotal) + " (" +
+ getDownloadProgressPercent(overallProgress, overallTotal) + ")";
+ }
- public static String getDownloadProgressPercent(long overallProgress, long overallTotal) {
- if (overallTotal == 0) {
- if (Constants.LOGVV) {
- Log.e(Constants.TAG, "Notification called when total is zero");
- }
- return "";
- }
- return Long.toString(overallProgress * 100 / overallTotal) + "%";
- }
+ public static String getDownloadProgressPercent(long overallProgress, long overallTotal) {
+ if (overallTotal == 0) {
+ if (Constants.LOGVV) {
+ Log.e(Constants.TAG, "Notification called when total is zero");
+ }
+ return "";
+ }
+ return Long.toString(overallProgress * 100 / overallTotal) + "%";
+ }
- public static String getSpeedString(float bytesPerMillisecond) {
- return String.format(Locale.ENGLISH, "%.2f", bytesPerMillisecond * 1000 / 1024);
- }
+ public static String getSpeedString(float bytesPerMillisecond) {
+ // -- GODOT start --
+ return String.format(Locale.ENGLISH, "%.2f", bytesPerMillisecond * 1000 / 1024);
+ // -- GODOT end --
+ }
- public static String getTimeRemaining(long durationInMilliseconds) {
- SimpleDateFormat sdf;
- if (durationInMilliseconds > 1000 * 60 * 60) {
- sdf = new SimpleDateFormat("HH:mm", Locale.getDefault());
- } else {
- sdf = new SimpleDateFormat("mm:ss", Locale.getDefault());
- }
- return sdf.format(new Date(durationInMilliseconds - TimeZone.getDefault().getRawOffset()));
- }
+ public static String getTimeRemaining(long durationInMilliseconds) {
+ SimpleDateFormat sdf;
+ if (durationInMilliseconds > 1000 * 60 * 60) {
+ sdf = new SimpleDateFormat("HH:mm", Locale.getDefault());
+ } else {
+ sdf = new SimpleDateFormat("mm:ss", Locale.getDefault());
+ }
+ return sdf.format(new Date(durationInMilliseconds - TimeZone.getDefault().getRawOffset()));
+ }
- /**
+ /**
* Returns the file name (without full path) for an Expansion APK file from the given context.
*
* @param c the context
@@ -202,33 +212,34 @@ public class Helpers {
* @param versionCode the version of the file
* @return String the file name of the expansion file
*/
- public static String getExpansionAPKFileName(Context c, boolean mainFile, int versionCode) {
- return (mainFile ? "main." : "patch.") + versionCode + "." + c.getPackageName() + ".obb";
- }
+ public static String getExpansionAPKFileName(Context c, boolean mainFile, int versionCode) {
+ return (mainFile ? "main." : "patch.") + versionCode + "." + c.getPackageName() + ".obb";
+ }
- /**
+ /**
* Returns the filename (where the file should be saved) from info about a download
*/
- static public String generateSaveFileName(Context c, String fileName) {
- String path = getSaveFilePath(c) + File.separator + fileName;
- return path;
- }
+ static public String generateSaveFileName(Context c, String fileName) {
+ String path = getSaveFilePath(c)
+ + File.separator + fileName;
+ return path;
+ }
- @TargetApi(Build.VERSION_CODES.HONEYCOMB)
- static public String getSaveFilePath(Context c) {
- // This technically existed since Honeycomb, but it is critical
- // on KitKat and greater versions since it will create the
- // directory if needed
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
- return c.getObbDir().toString();
- } else {
- File root = Environment.getExternalStorageDirectory();
- String path = root.toString() + Constants.EXP_PATH + c.getPackageName();
- return path;
- }
- }
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ static public String getSaveFilePath(Context c) {
+ // This technically existed since Honeycomb, but it is critical
+ // on KitKat and greater versions since it will create the
+ // directory if needed
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ return c.getObbDir().toString();
+ } else {
+ File root = Environment.getExternalStorageDirectory();
+ String path = root.toString() + Constants.EXP_PATH + c.getPackageName();
+ return path;
+ }
+ }
- /**
+ /**
* Helper function to ascertain the existence of a file and return true/false appropriately
*
* @param c the app/activity/service context
@@ -237,72 +248,72 @@ public class Helpers {
* @param deleteFileOnMismatch if the file sizes do not match, delete the file
* @return true if it does exist, false otherwise
*/
- static public boolean doesFileExist(Context c, String fileName, long fileSize,
- boolean deleteFileOnMismatch) {
- // the file may have been delivered by Play --- let's make sure
- // it's the size we expect
- File fileForNewFile = new File(Helpers.generateSaveFileName(c, fileName));
- if (fileForNewFile.exists()) {
- if (fileForNewFile.length() == fileSize) {
- return true;
- }
- if (deleteFileOnMismatch) {
- // delete the file --- we won't be able to resume
- // because we cannot confirm the integrity of the file
- fileForNewFile.delete();
- }
- }
- return false;
- }
+ static public boolean doesFileExist(Context c, String fileName, long fileSize,
+ boolean deleteFileOnMismatch) {
+ // the file may have been delivered by Play --- let's make sure
+ // it's the size we expect
+ File fileForNewFile = new File(Helpers.generateSaveFileName(c, fileName));
+ if (fileForNewFile.exists()) {
+ if (fileForNewFile.length() == fileSize) {
+ return true;
+ }
+ if (deleteFileOnMismatch) {
+ // delete the file --- we won't be able to resume
+ // because we cannot confirm the integrity of the file
+ fileForNewFile.delete();
+ }
+ }
+ return false;
+ }
- public static final int FS_READABLE = 0;
- public static final int FS_DOES_NOT_EXIST = 1;
- public static final int FS_CANNOT_READ = 2;
+ public static final int FS_READABLE = 0;
+ public static final int FS_DOES_NOT_EXIST = 1;
+ public static final int FS_CANNOT_READ = 2;
- /**
+ /**
* Helper function to ascertain whether a file can be read.
*
* @param c the app/activity/service context
* @param fileName the name (sans path) of the file to query
* @return true if it does exist, false otherwise
*/
- static public int getFileStatus(Context c, String fileName) {
- // the file may have been delivered by Play --- let's make sure
- // it's the size we expect
- File fileForNewFile = new File(Helpers.generateSaveFileName(c, fileName));
- int returnValue;
- if (fileForNewFile.exists()) {
- if (fileForNewFile.canRead()) {
- returnValue = FS_READABLE;
- } else {
- returnValue = FS_CANNOT_READ;
- }
- } else {
- returnValue = FS_DOES_NOT_EXIST;
- }
- return returnValue;
- }
+ static public int getFileStatus(Context c, String fileName) {
+ // the file may have been delivered by Play --- let's make sure
+ // it's the size we expect
+ File fileForNewFile = new File(Helpers.generateSaveFileName(c, fileName));
+ int returnValue;
+ if (fileForNewFile.exists()) {
+ if (fileForNewFile.canRead()) {
+ returnValue = FS_READABLE;
+ } else {
+ returnValue = FS_CANNOT_READ;
+ }
+ } else {
+ returnValue = FS_DOES_NOT_EXIST;
+ }
+ return returnValue;
+ }
- /**
+ /**
* Helper function to ascertain whether the application has the correct access to the OBB
* directory to allow an OBB file to be written.
*
* @param c the app/activity/service context
* @return true if the application can write an OBB file, false otherwise
*/
- static public boolean canWriteOBBFile(Context c) {
- String path = getSaveFilePath(c);
- File fileForNewFile = new File(path);
- boolean canWrite;
- if (fileForNewFile.exists()) {
- canWrite = fileForNewFile.isDirectory() && fileForNewFile.canWrite();
- } else {
- canWrite = fileForNewFile.mkdirs();
- }
- return canWrite;
- }
+ static public boolean canWriteOBBFile(Context c) {
+ String path = getSaveFilePath(c);
+ File fileForNewFile = new File(path);
+ boolean canWrite;
+ if (fileForNewFile.exists()) {
+ canWrite = fileForNewFile.isDirectory() && fileForNewFile.canWrite();
+ } else {
+ canWrite = fileForNewFile.mkdirs();
+ }
+ return canWrite;
+ }
- /**
+ /**
* Converts download states that are returned by the
* {@link IDownloaderClient#onDownloadStateChanged} callback into usable strings. This is useful
* if using the state strings built into the library to display user messages.
@@ -310,46 +321,47 @@ public class Helpers {
* @param state One of the STATE_* constants from {@link IDownloaderClient}.
* @return string resource ID for the corresponding string.
*/
- static public int getDownloaderStringResourceIDFromState(int state) {
- switch (state) {
- case IDownloaderClient.STATE_IDLE:
- return R.string.state_idle;
- case IDownloaderClient.STATE_FETCHING_URL:
- return R.string.state_fetching_url;
- case IDownloaderClient.STATE_CONNECTING:
- return R.string.state_connecting;
- case IDownloaderClient.STATE_DOWNLOADING:
- return R.string.state_downloading;
- case IDownloaderClient.STATE_COMPLETED:
- return R.string.state_completed;
- case IDownloaderClient.STATE_PAUSED_NETWORK_UNAVAILABLE:
- return R.string.state_paused_network_unavailable;
- case IDownloaderClient.STATE_PAUSED_BY_REQUEST:
- return R.string.state_paused_by_request;
- case IDownloaderClient.STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION:
- return R.string.state_paused_wifi_disabled;
- case IDownloaderClient.STATE_PAUSED_NEED_CELLULAR_PERMISSION:
- return R.string.state_paused_wifi_unavailable;
- case IDownloaderClient.STATE_PAUSED_WIFI_DISABLED:
- return R.string.state_paused_wifi_disabled;
- case IDownloaderClient.STATE_PAUSED_NEED_WIFI:
- return R.string.state_paused_wifi_unavailable;
- case IDownloaderClient.STATE_PAUSED_ROAMING:
- return R.string.state_paused_roaming;
- case IDownloaderClient.STATE_PAUSED_NETWORK_SETUP_FAILURE:
- return R.string.state_paused_network_setup_failure;
- case IDownloaderClient.STATE_PAUSED_SDCARD_UNAVAILABLE:
- return R.string.state_paused_sdcard_unavailable;
- case IDownloaderClient.STATE_FAILED_UNLICENSED:
- return R.string.state_failed_unlicensed;
- case IDownloaderClient.STATE_FAILED_FETCHING_URL:
- return R.string.state_failed_fetching_url;
- case IDownloaderClient.STATE_FAILED_SDCARD_FULL:
- return R.string.state_failed_sdcard_full;
- case IDownloaderClient.STATE_FAILED_CANCELED:
- return R.string.state_failed_cancelled;
- default:
- return R.string.state_unknown;
- }
- }
+ static public int getDownloaderStringResourceIDFromState(int state) {
+ switch (state) {
+ case IDownloaderClient.STATE_IDLE:
+ return R.string.state_idle;
+ case IDownloaderClient.STATE_FETCHING_URL:
+ return R.string.state_fetching_url;
+ case IDownloaderClient.STATE_CONNECTING:
+ return R.string.state_connecting;
+ case IDownloaderClient.STATE_DOWNLOADING:
+ return R.string.state_downloading;
+ case IDownloaderClient.STATE_COMPLETED:
+ return R.string.state_completed;
+ case IDownloaderClient.STATE_PAUSED_NETWORK_UNAVAILABLE:
+ return R.string.state_paused_network_unavailable;
+ case IDownloaderClient.STATE_PAUSED_BY_REQUEST:
+ return R.string.state_paused_by_request;
+ case IDownloaderClient.STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION:
+ return R.string.state_paused_wifi_disabled;
+ case IDownloaderClient.STATE_PAUSED_NEED_CELLULAR_PERMISSION:
+ return R.string.state_paused_wifi_unavailable;
+ case IDownloaderClient.STATE_PAUSED_WIFI_DISABLED:
+ return R.string.state_paused_wifi_disabled;
+ case IDownloaderClient.STATE_PAUSED_NEED_WIFI:
+ return R.string.state_paused_wifi_unavailable;
+ case IDownloaderClient.STATE_PAUSED_ROAMING:
+ return R.string.state_paused_roaming;
+ case IDownloaderClient.STATE_PAUSED_NETWORK_SETUP_FAILURE:
+ return R.string.state_paused_network_setup_failure;
+ case IDownloaderClient.STATE_PAUSED_SDCARD_UNAVAILABLE:
+ return R.string.state_paused_sdcard_unavailable;
+ case IDownloaderClient.STATE_FAILED_UNLICENSED:
+ return R.string.state_failed_unlicensed;
+ case IDownloaderClient.STATE_FAILED_FETCHING_URL:
+ return R.string.state_failed_fetching_url;
+ case IDownloaderClient.STATE_FAILED_SDCARD_FULL:
+ return R.string.state_failed_sdcard_full;
+ case IDownloaderClient.STATE_FAILED_CANCELED:
+ return R.string.state_failed_cancelled;
+ default:
+ return R.string.state_unknown;
+ }
+ }
+
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java
index bae93f633a..cef3794701 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java
@@ -23,26 +23,26 @@ import android.os.Messenger;
* downloader. It is used to pass status from the service to the client.
*/
public interface IDownloaderClient {
- static final int STATE_IDLE = 1;
- static final int STATE_FETCHING_URL = 2;
- static final int STATE_CONNECTING = 3;
- static final int STATE_DOWNLOADING = 4;
- static final int STATE_COMPLETED = 5;
+ static final int STATE_IDLE = 1;
+ static final int STATE_FETCHING_URL = 2;
+ static final int STATE_CONNECTING = 3;
+ static final int STATE_DOWNLOADING = 4;
+ static final int STATE_COMPLETED = 5;
- static final int STATE_PAUSED_NETWORK_UNAVAILABLE = 6;
- static final int STATE_PAUSED_BY_REQUEST = 7;
+ static final int STATE_PAUSED_NETWORK_UNAVAILABLE = 6;
+ static final int STATE_PAUSED_BY_REQUEST = 7;
- /**
+ /**
* Both STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION and
* STATE_PAUSED_NEED_CELLULAR_PERMISSION imply that Wi-Fi is unavailable and
* cellular permission will restart the service. Wi-Fi disabled means that
* the Wi-Fi manager is returning that Wi-Fi is not enabled, while in the
* other case Wi-Fi is enabled but not available.
*/
- static final int STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION = 8;
- static final int STATE_PAUSED_NEED_CELLULAR_PERMISSION = 9;
+ static final int STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION = 8;
+ static final int STATE_PAUSED_NEED_CELLULAR_PERMISSION = 9;
- /**
+ /**
* Both STATE_PAUSED_WIFI_DISABLED and STATE_PAUSED_NEED_WIFI imply that
* Wi-Fi is unavailable and cellular permission will NOT restart the
* service. Wi-Fi disabled means that the Wi-Fi manager is returning that
@@ -53,27 +53,27 @@ public interface IDownloaderClient {
* developers with very large payloads do not allow these payloads to be
* downloaded over cellular connections.
*/
- static final int STATE_PAUSED_WIFI_DISABLED = 10;
- static final int STATE_PAUSED_NEED_WIFI = 11;
+ static final int STATE_PAUSED_WIFI_DISABLED = 10;
+ static final int STATE_PAUSED_NEED_WIFI = 11;
- static final int STATE_PAUSED_ROAMING = 12;
+ static final int STATE_PAUSED_ROAMING = 12;
- /**
+ /**
* Scary case. We were on a network that redirected us to another website
* that delivered us the wrong file.
*/
- static final int STATE_PAUSED_NETWORK_SETUP_FAILURE = 13;
+ static final int STATE_PAUSED_NETWORK_SETUP_FAILURE = 13;
- static final int STATE_PAUSED_SDCARD_UNAVAILABLE = 14;
+ static final int STATE_PAUSED_SDCARD_UNAVAILABLE = 14;
- static final int STATE_FAILED_UNLICENSED = 15;
- static final int STATE_FAILED_FETCHING_URL = 16;
- static final int STATE_FAILED_SDCARD_FULL = 17;
- static final int STATE_FAILED_CANCELED = 18;
+ static final int STATE_FAILED_UNLICENSED = 15;
+ static final int STATE_FAILED_FETCHING_URL = 16;
+ static final int STATE_FAILED_SDCARD_FULL = 17;
+ static final int STATE_FAILED_CANCELED = 18;
- static final int STATE_FAILED = 19;
+ static final int STATE_FAILED = 19;
- /**
+ /**
* Called internally by the stub when the service is bound to the client.
* <p>
* Critical implementation detail. In onServiceConnected we create the
@@ -90,9 +90,9 @@ public interface IDownloaderClient {
* @param m the service Messenger. This Messenger is used to call the
* service API from the client.
*/
- void onServiceConnected(Messenger m);
+ void onServiceConnected(Messenger m);
- /**
+ /**
* Called when the download state changes. Depending on the state, there may
* be user requests. The service is free to change the download state in the
* middle of a user request, so the client should be able to handle this.
@@ -112,9 +112,9 @@ public interface IDownloaderClient {
*
* @param newState one of the STATE_* values defined in IDownloaderClient
*/
- void onDownloadStateChanged(int newState);
+ void onDownloadStateChanged(int newState);
- /**
+ /**
* Shows the download progress. This is intended to be used to fill out a
* client UI. This progress should only be shown in a few states such as
* STATE_DOWNLOADING.
@@ -122,5 +122,5 @@ public interface IDownloaderClient {
* @param progress the DownloadProgressInfo object containing the current
* progress of all downloads.
*/
- void onDownloadProgress(DownloadProgressInfo progress);
+ void onDownloadProgress(DownloadProgressInfo progress);
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderService.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderService.java
index a84fb32728..4de9de0c62 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderService.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderService.java
@@ -31,47 +31,47 @@ import android.os.Messenger;
* should immediately call {@link #onClientUpdated}.
*/
public interface IDownloaderService {
- /**
+ /**
* Set this flag in response to the
* IDownloaderClient.STATE_PAUSED_NEED_CELLULAR_PERMISSION state and then
* call RequestContinueDownload to resume a download
*/
- public static final int FLAGS_DOWNLOAD_OVER_CELLULAR = 1;
+ public static final int FLAGS_DOWNLOAD_OVER_CELLULAR = 1;
- /**
+ /**
* Request that the service abort the current download. The service should
* respond by changing the state to {@link IDownloaderClient.STATE_ABORTED}.
*/
- void requestAbortDownload();
+ void requestAbortDownload();
- /**
+ /**
* Request that the service pause the current download. The service should
* respond by changing the state to
* {@link IDownloaderClient.STATE_PAUSED_BY_REQUEST}.
*/
- void requestPauseDownload();
+ void requestPauseDownload();
- /**
+ /**
* Request that the service continue a paused download, when in any paused
* or failed state, including
* {@link IDownloaderClient.STATE_PAUSED_BY_REQUEST}.
*/
- void requestContinueDownload();
+ void requestContinueDownload();
- /**
+ /**
* Set the flags for this download (e.g.
* {@link DownloaderService.FLAGS_DOWNLOAD_OVER_CELLULAR}).
*
* @param flags
*/
- void setDownloadFlags(int flags);
+ void setDownloadFlags(int flags);
- /**
+ /**
* Requests that the download status be sent to the client.
*/
- void requestDownloadStatus();
+ void requestDownloadStatus();
- /**
+ /**
* Call this when you get {@link
* IDownloaderClient.onServiceConnected(Messenger m)} from the
* DownloaderClient to register the client with the service. It will
@@ -79,5 +79,5 @@ public interface IDownloaderService {
*
* @param clientMessenger
*/
- void onClientUpdated(Messenger clientMessenger);
+ void onClientUpdated(Messenger clientMessenger);
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/IStub.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/IStub.java
index dcdef1bfcf..d5bc3a843e 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/IStub.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/IStub.java
@@ -33,9 +33,9 @@ import android.os.Messenger;
* {@link IDownloaderService#onClientUpdated}.
*/
public interface IStub {
- Messenger getMessenger();
+ Messenger getMessenger();
- void connect(Context c);
+ void connect(Context c);
- void disconnect(Context c);
+ void disconnect(Context c);
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java
index c5577d4c2a..a0e1165cc4 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java
@@ -16,7 +16,6 @@
package com.google.android.vending.expansion.downloader;
-import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
@@ -27,100 +26,104 @@ import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
import android.util.Log;
+// -- GODOT start --
+import android.annotation.SuppressLint;
+// -- GODOT end --
+
/**
* Contains useful helper functions, typically tied to the application context.
*/
class SystemFacade {
- private Context mContext;
- private NotificationManager mNotificationManager;
-
- public SystemFacade(Context context) {
- mContext = context;
- mNotificationManager = (NotificationManager)
- mContext.getSystemService(Context.NOTIFICATION_SERVICE);
- }
-
- public long currentTimeMillis() {
- return System.currentTimeMillis();
- }
-
- public Integer getActiveNetworkType() {
- ConnectivityManager connectivity =
- (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
- if (connectivity == null) {
- Log.w(Constants.TAG, "couldn't get connectivity manager");
- return null;
- }
-
- @SuppressLint("MissingPermission")
- NetworkInfo activeInfo = connectivity.getActiveNetworkInfo();
- if (activeInfo == null) {
- if (Constants.LOGVV) {
- Log.v(Constants.TAG, "network is not available");
- }
- return null;
- }
- return activeInfo.getType();
- }
-
- public boolean isNetworkRoaming() {
- ConnectivityManager connectivity =
- (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
- if (connectivity == null) {
- Log.w(Constants.TAG, "couldn't get connectivity manager");
- return false;
- }
-
- @SuppressLint("MissingPermission")
- NetworkInfo info = connectivity.getActiveNetworkInfo();
- boolean isMobile = (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE);
- TelephonyManager tm = (TelephonyManager)mContext
- .getSystemService(Context.TELEPHONY_SERVICE);
- if (null == tm) {
- Log.w(Constants.TAG, "couldn't get telephony manager");
- return false;
- }
- boolean isRoaming = isMobile && tm.isNetworkRoaming();
- if (Constants.LOGVV && isRoaming) {
- Log.v(Constants.TAG, "network is roaming");
- }
- return isRoaming;
- }
-
- public Long getMaxBytesOverMobile() {
- return (long)Integer.MAX_VALUE;
- }
-
- public Long getRecommendedMaxBytesOverMobile() {
- return 2097152L;
- }
-
- public void sendBroadcast(Intent intent) {
- mContext.sendBroadcast(intent);
- }
-
- public boolean userOwnsPackage(int uid, String packageName) throws NameNotFoundException {
- return mContext.getPackageManager().getApplicationInfo(packageName, 0).uid == uid;
- }
-
- public void postNotification(long id, Notification notification) {
- /**
+ private Context mContext;
+ private NotificationManager mNotificationManager;
+
+ public SystemFacade(Context context) {
+ mContext = context;
+ mNotificationManager = (NotificationManager)
+ mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ }
+
+ public long currentTimeMillis() {
+ return System.currentTimeMillis();
+ }
+
+ public Integer getActiveNetworkType() {
+ ConnectivityManager connectivity =
+ (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+ if (connectivity == null) {
+ Log.w(Constants.TAG, "couldn't get connectivity manager");
+ return null;
+ }
+
+ @SuppressLint("MissingPermission")
+ NetworkInfo activeInfo = connectivity.getActiveNetworkInfo();
+ if (activeInfo == null) {
+ if (Constants.LOGVV) {
+ Log.v(Constants.TAG, "network is not available");
+ }
+ return null;
+ }
+ return activeInfo.getType();
+ }
+
+ public boolean isNetworkRoaming() {
+ ConnectivityManager connectivity =
+ (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+ if (connectivity == null) {
+ Log.w(Constants.TAG, "couldn't get connectivity manager");
+ return false;
+ }
+
+ @SuppressLint("MissingPermission")
+ NetworkInfo info = connectivity.getActiveNetworkInfo();
+ boolean isMobile = (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE);
+ TelephonyManager tm = (TelephonyManager) mContext
+ .getSystemService(Context.TELEPHONY_SERVICE);
+ if (null == tm) {
+ Log.w(Constants.TAG, "couldn't get telephony manager");
+ return false;
+ }
+ boolean isRoaming = isMobile && tm.isNetworkRoaming();
+ if (Constants.LOGVV && isRoaming) {
+ Log.v(Constants.TAG, "network is roaming");
+ }
+ return isRoaming;
+ }
+
+ public Long getMaxBytesOverMobile() {
+ return (long) Integer.MAX_VALUE;
+ }
+
+ public Long getRecommendedMaxBytesOverMobile() {
+ return 2097152L;
+ }
+
+ public void sendBroadcast(Intent intent) {
+ mContext.sendBroadcast(intent);
+ }
+
+ public boolean userOwnsPackage(int uid, String packageName) throws NameNotFoundException {
+ return mContext.getPackageManager().getApplicationInfo(packageName, 0).uid == uid;
+ }
+
+ public void postNotification(long id, Notification notification) {
+ /**
* TODO: The system notification manager takes ints, not longs, as IDs,
* but the download manager uses IDs take straight from the database,
* which are longs. This will have to be dealt with at some point.
*/
- mNotificationManager.notify((int)id, notification);
- }
+ mNotificationManager.notify((int) id, notification);
+ }
- public void cancelNotification(long id) {
- mNotificationManager.cancel((int)id);
- }
+ public void cancelNotification(long id) {
+ mNotificationManager.cancel((int) id);
+ }
- public void cancelAllNotifications() {
- mNotificationManager.cancelAll();
- }
+ public void cancelAllNotifications() {
+ mNotificationManager.cancelAll();
+ }
- public void startThread(Thread thread) {
- thread.start();
- }
+ public void startThread(Thread thread) {
+ thread.start();
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java
index 6346d7703a..3ccc191c60 100755..100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java
@@ -32,80 +32,81 @@ import android.util.Log;
* intent, it does not queue up batches of intents of the same type.
*/
public abstract class CustomIntentService extends Service {
- private String mName;
- private boolean mRedelivery;
- private volatile ServiceHandler mServiceHandler;
- private volatile Looper mServiceLooper;
- private static final String LOG_TAG = "CustomIntentService";
- private static final int WHAT_MESSAGE = -10;
+ private String mName;
+ private boolean mRedelivery;
+ private volatile ServiceHandler mServiceHandler;
+ private volatile Looper mServiceLooper;
+ private static final String LOG_TAG = "CustomIntentService";
+ private static final int WHAT_MESSAGE = -10;
- public CustomIntentService(String paramString) {
- this.mName = paramString;
- }
+ public CustomIntentService(String paramString) {
+ this.mName = paramString;
+ }
- @Override
- public IBinder onBind(Intent paramIntent) {
- return null;
- }
+ @Override
+ public IBinder onBind(Intent paramIntent) {
+ return null;
+ }
- @Override
- public void onCreate() {
- super.onCreate();
- HandlerThread localHandlerThread = new HandlerThread("IntentService[" + this.mName + "]");
- localHandlerThread.start();
- this.mServiceLooper = localHandlerThread.getLooper();
- this.mServiceHandler = new ServiceHandler(this.mServiceLooper);
- }
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ HandlerThread localHandlerThread = new HandlerThread("IntentService["
+ + this.mName + "]");
+ localHandlerThread.start();
+ this.mServiceLooper = localHandlerThread.getLooper();
+ this.mServiceHandler = new ServiceHandler(this.mServiceLooper);
+ }
- @Override
- public void onDestroy() {
- Thread localThread = this.mServiceLooper.getThread();
- if ((localThread != null) && (localThread.isAlive())) {
- localThread.interrupt();
- }
- this.mServiceLooper.quit();
- Log.d(LOG_TAG, "onDestroy");
- }
+ @Override
+ public void onDestroy() {
+ Thread localThread = this.mServiceLooper.getThread();
+ if ((localThread != null) && (localThread.isAlive())) {
+ localThread.interrupt();
+ }
+ this.mServiceLooper.quit();
+ Log.d(LOG_TAG, "onDestroy");
+ }
- protected abstract void onHandleIntent(Intent paramIntent);
+ protected abstract void onHandleIntent(Intent paramIntent);
- protected abstract boolean shouldStop();
+ protected abstract boolean shouldStop();
- @Override
- public void onStart(Intent paramIntent, int startId) {
- if (!this.mServiceHandler.hasMessages(WHAT_MESSAGE)) {
- Message localMessage = this.mServiceHandler.obtainMessage();
- localMessage.arg1 = startId;
- localMessage.obj = paramIntent;
- localMessage.what = WHAT_MESSAGE;
- this.mServiceHandler.sendMessage(localMessage);
- }
- }
+ @Override
+ public void onStart(Intent paramIntent, int startId) {
+ if (!this.mServiceHandler.hasMessages(WHAT_MESSAGE)) {
+ Message localMessage = this.mServiceHandler.obtainMessage();
+ localMessage.arg1 = startId;
+ localMessage.obj = paramIntent;
+ localMessage.what = WHAT_MESSAGE;
+ this.mServiceHandler.sendMessage(localMessage);
+ }
+ }
- @Override
- public int onStartCommand(Intent paramIntent, int flags, int startId) {
- onStart(paramIntent, startId);
- return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
- }
+ @Override
+ public int onStartCommand(Intent paramIntent, int flags, int startId) {
+ onStart(paramIntent, startId);
+ return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
+ }
- public void setIntentRedelivery(boolean enabled) {
- this.mRedelivery = enabled;
- }
+ public void setIntentRedelivery(boolean enabled) {
+ this.mRedelivery = enabled;
+ }
- private final class ServiceHandler extends Handler {
- public ServiceHandler(Looper looper) {
- super(looper);
- }
+ private final class ServiceHandler extends Handler {
+ public ServiceHandler(Looper looper) {
+ super(looper);
+ }
- @Override
- public void handleMessage(Message paramMessage) {
- CustomIntentService.this
- .onHandleIntent((Intent)paramMessage.obj);
- if (shouldStop()) {
- Log.d(LOG_TAG, "stopSelf");
- CustomIntentService.this.stopSelf(paramMessage.arg1);
- Log.d(LOG_TAG, "afterStopSelf");
- }
- }
- }
+ @Override
+ public void handleMessage(Message paramMessage) {
+ CustomIntentService.this
+ .onHandleIntent((Intent) paramMessage.obj);
+ if (shouldStop()) {
+ Log.d(LOG_TAG, "stopSelf");
+ CustomIntentService.this.stopSelf(paramMessage.arg1);
+ Log.d(LOG_TAG, "afterStopSelf");
+ }
+ }
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java
index 0e72b7ae77..45111b16a3 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java
@@ -25,68 +25,68 @@ import android.util.Log;
* Representation of information about an individual download from the database.
*/
public class DownloadInfo {
- public String mUri;
- public final int mIndex;
- public final String mFileName;
- public String mETag;
- public long mTotalBytes;
- public long mCurrentBytes;
- public long mLastMod;
- public int mStatus;
- public int mControl;
- public int mNumFailed;
- public int mRetryAfter;
- public int mRedirectCount;
+ public String mUri;
+ public final int mIndex;
+ public final String mFileName;
+ public String mETag;
+ public long mTotalBytes;
+ public long mCurrentBytes;
+ public long mLastMod;
+ public int mStatus;
+ public int mControl;
+ public int mNumFailed;
+ public int mRetryAfter;
+ public int mRedirectCount;
- boolean mInitialized;
+ boolean mInitialized;
- public int mFuzz;
+ public int mFuzz;
- public DownloadInfo(int index, String fileName, String pkg) {
- mFuzz = Helpers.sRandom.nextInt(1001);
- mFileName = fileName;
- mIndex = index;
- }
+ public DownloadInfo(int index, String fileName, String pkg) {
+ mFuzz = Helpers.sRandom.nextInt(1001);
+ mFileName = fileName;
+ mIndex = index;
+ }
- public void resetDownload() {
- mCurrentBytes = 0;
- mETag = "";
- mLastMod = 0;
- mStatus = 0;
- mControl = 0;
- mNumFailed = 0;
- mRetryAfter = 0;
- mRedirectCount = 0;
- }
+ public void resetDownload() {
+ mCurrentBytes = 0;
+ mETag = "";
+ mLastMod = 0;
+ mStatus = 0;
+ mControl = 0;
+ mNumFailed = 0;
+ mRetryAfter = 0;
+ mRedirectCount = 0;
+ }
- /**
+ /**
* Returns the time when a download should be restarted.
*/
- public long restartTime(long now) {
- if (mNumFailed == 0) {
- return now;
- }
- if (mRetryAfter > 0) {
- return mLastMod + mRetryAfter;
- }
- return mLastMod +
- Constants.RETRY_FIRST_DELAY *
- (1000 + mFuzz) * (1 << (mNumFailed - 1));
- }
+ public long restartTime(long now) {
+ if (mNumFailed == 0) {
+ return now;
+ }
+ if (mRetryAfter > 0) {
+ return mLastMod + mRetryAfter;
+ }
+ return mLastMod +
+ Constants.RETRY_FIRST_DELAY *
+ (1000 + mFuzz) * (1 << (mNumFailed - 1));
+ }
- public void logVerboseInfo() {
- Log.v(Constants.TAG, "Service adding new entry");
- Log.v(Constants.TAG, "FILENAME: " + mFileName);
- Log.v(Constants.TAG, "URI : " + mUri);
- Log.v(Constants.TAG, "FILENAME: " + mFileName);
- Log.v(Constants.TAG, "CONTROL : " + mControl);
- Log.v(Constants.TAG, "STATUS : " + mStatus);
- Log.v(Constants.TAG, "FAILED_C: " + mNumFailed);
- Log.v(Constants.TAG, "RETRY_AF: " + mRetryAfter);
- Log.v(Constants.TAG, "REDIRECT: " + mRedirectCount);
- Log.v(Constants.TAG, "LAST_MOD: " + mLastMod);
- Log.v(Constants.TAG, "TOTAL : " + mTotalBytes);
- Log.v(Constants.TAG, "CURRENT : " + mCurrentBytes);
- Log.v(Constants.TAG, "ETAG : " + mETag);
- }
+ public void logVerboseInfo() {
+ Log.v(Constants.TAG, "Service adding new entry");
+ Log.v(Constants.TAG, "FILENAME: " + mFileName);
+ Log.v(Constants.TAG, "URI : " + mUri);
+ Log.v(Constants.TAG, "FILENAME: " + mFileName);
+ Log.v(Constants.TAG, "CONTROL : " + mControl);
+ Log.v(Constants.TAG, "STATUS : " + mStatus);
+ Log.v(Constants.TAG, "FAILED_C: " + mNumFailed);
+ Log.v(Constants.TAG, "RETRY_AF: " + mRetryAfter);
+ Log.v(Constants.TAG, "REDIRECT: " + mRedirectCount);
+ Log.v(Constants.TAG, "LAST_MOD: " + mLastMod);
+ Log.v(Constants.TAG, "TOTAL : " + mTotalBytes);
+ Log.v(Constants.TAG, "CURRENT : " + mCurrentBytes);
+ Log.v(Constants.TAG, "ETAG : " + mETag);
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java
index 099e3f05b3..4b214b22d7 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java
@@ -16,7 +16,11 @@
package com.google.android.vending.expansion.downloader.impl;
+// -- GODOT start --
+//import com.android.vending.expansion.downloader.R;
import com.godot.game.R;
+// -- GODOT end --
+
import com.google.android.vending.expansion.downloader.DownloadProgressInfo;
import com.google.android.vending.expansion.downloader.DownloaderClientMarshaller;
import com.google.android.vending.expansion.downloader.Helpers;
@@ -42,183 +46,184 @@ import android.support.v4.app.NotificationCompat;
*/
public class DownloadNotification implements IDownloaderClient {
- private int mState;
- private final Context mContext;
- private final NotificationManager mNotificationManager;
- private CharSequence mCurrentTitle;
-
- private IDownloaderClient mClientProxy;
- private NotificationCompat.Builder mActiveDownloadBuilder;
- private NotificationCompat.Builder mBuilder;
- private NotificationCompat.Builder mCurrentBuilder;
- private CharSequence mLabel;
- private String mCurrentText;
- private DownloadProgressInfo mProgressInfo;
- private PendingIntent mContentIntent;
-
- static final String LOGTAG = "DownloadNotification";
- static final int NOTIFICATION_ID = LOGTAG.hashCode();
-
- public PendingIntent getClientIntent() {
- return mContentIntent;
- }
-
- public void setClientIntent(PendingIntent clientIntent) {
- this.mBuilder.setContentIntent(clientIntent);
- this.mActiveDownloadBuilder.setContentIntent(clientIntent);
- this.mContentIntent = clientIntent;
- }
-
- public void resendState() {
- if (null != mClientProxy) {
- mClientProxy.onDownloadStateChanged(mState);
- }
- }
-
- @Override
- public void onDownloadStateChanged(int newState) {
- if (null != mClientProxy) {
- mClientProxy.onDownloadStateChanged(newState);
- }
- if (newState != mState) {
- mState = newState;
- if (newState == IDownloaderClient.STATE_IDLE || null == mContentIntent) {
- return;
- }
- int stringDownloadID;
- int iconResource;
- boolean ongoingEvent;
-
- // get the new title string and paused text
- switch (newState) {
- case 0:
- iconResource = android.R.drawable.stat_sys_warning;
- stringDownloadID = R.string.state_unknown;
- ongoingEvent = false;
- break;
-
- case IDownloaderClient.STATE_DOWNLOADING:
- iconResource = android.R.drawable.stat_sys_download;
- stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
- ongoingEvent = true;
- break;
-
- case IDownloaderClient.STATE_FETCHING_URL:
- case IDownloaderClient.STATE_CONNECTING:
- iconResource = android.R.drawable.stat_sys_download_done;
- stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
- ongoingEvent = true;
- break;
-
- case IDownloaderClient.STATE_COMPLETED:
- case IDownloaderClient.STATE_PAUSED_BY_REQUEST:
- iconResource = android.R.drawable.stat_sys_download_done;
- stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
- ongoingEvent = false;
- break;
-
- case IDownloaderClient.STATE_FAILED:
- case IDownloaderClient.STATE_FAILED_CANCELED:
- case IDownloaderClient.STATE_FAILED_FETCHING_URL:
- case IDownloaderClient.STATE_FAILED_SDCARD_FULL:
- case IDownloaderClient.STATE_FAILED_UNLICENSED:
- iconResource = android.R.drawable.stat_sys_warning;
- stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
- ongoingEvent = false;
- break;
-
- default:
- iconResource = android.R.drawable.stat_sys_warning;
- stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
- ongoingEvent = true;
- break;
- }
-
- mCurrentText = mContext.getString(stringDownloadID);
- mCurrentTitle = mLabel;
- mCurrentBuilder.setTicker(mLabel + ": " + mCurrentText);
- mCurrentBuilder.setSmallIcon(iconResource);
- mCurrentBuilder.setContentTitle(mCurrentTitle);
- mCurrentBuilder.setContentText(mCurrentText);
- if (ongoingEvent) {
- mCurrentBuilder.setOngoing(true);
- } else {
- mCurrentBuilder.setOngoing(false);
- mCurrentBuilder.setAutoCancel(true);
- }
- mNotificationManager.notify(NOTIFICATION_ID, mCurrentBuilder.build());
- }
- }
-
- @Override
- public void onDownloadProgress(DownloadProgressInfo progress) {
- mProgressInfo = progress;
- if (null != mClientProxy) {
- mClientProxy.onDownloadProgress(progress);
- }
- if (progress.mOverallTotal <= 0) {
- // we just show the text
- mBuilder.setTicker(mCurrentTitle);
- mBuilder.setSmallIcon(android.R.drawable.stat_sys_download);
- mBuilder.setContentTitle(mCurrentTitle);
- mBuilder.setContentText(mCurrentText);
- mCurrentBuilder = mBuilder;
- } else {
- mActiveDownloadBuilder.setProgress((int)progress.mOverallTotal, (int)progress.mOverallProgress, false);
- mActiveDownloadBuilder.setContentText(Helpers.getDownloadProgressString(progress.mOverallProgress, progress.mOverallTotal));
- mActiveDownloadBuilder.setSmallIcon(android.R.drawable.stat_sys_download);
- mActiveDownloadBuilder.setTicker(mLabel + ": " + mCurrentText);
- mActiveDownloadBuilder.setContentTitle(mLabel);
- mActiveDownloadBuilder.setContentInfo(mContext.getString(R.string.time_remaining_notification,
- Helpers.getTimeRemaining(progress.mTimeRemaining)));
- mCurrentBuilder = mActiveDownloadBuilder;
- }
- mNotificationManager.notify(NOTIFICATION_ID, mCurrentBuilder.build());
- }
-
- /**
+ private int mState;
+ private final Context mContext;
+ private final NotificationManager mNotificationManager;
+ private CharSequence mCurrentTitle;
+
+ private IDownloaderClient mClientProxy;
+ private NotificationCompat.Builder mActiveDownloadBuilder;
+ private NotificationCompat.Builder mBuilder;
+ private NotificationCompat.Builder mCurrentBuilder;
+ private CharSequence mLabel;
+ private String mCurrentText;
+ private DownloadProgressInfo mProgressInfo;
+ private PendingIntent mContentIntent;
+
+ static final String LOGTAG = "DownloadNotification";
+ static final int NOTIFICATION_ID = LOGTAG.hashCode();
+
+ public PendingIntent getClientIntent() {
+ return mContentIntent;
+ }
+
+ public void setClientIntent(PendingIntent clientIntent) {
+ this.mBuilder.setContentIntent(clientIntent);
+ this.mActiveDownloadBuilder.setContentIntent(clientIntent);
+ this.mContentIntent = clientIntent;
+ }
+
+ public void resendState() {
+ if (null != mClientProxy) {
+ mClientProxy.onDownloadStateChanged(mState);
+ }
+ }
+
+ @Override
+ public void onDownloadStateChanged(int newState) {
+ if (null != mClientProxy) {
+ mClientProxy.onDownloadStateChanged(newState);
+ }
+ if (newState != mState) {
+ mState = newState;
+ if (newState == IDownloaderClient.STATE_IDLE || null == mContentIntent) {
+ return;
+ }
+ int stringDownloadID;
+ int iconResource;
+ boolean ongoingEvent;
+
+ // get the new title string and paused text
+ switch (newState) {
+ case 0:
+ iconResource = android.R.drawable.stat_sys_warning;
+ stringDownloadID = R.string.state_unknown;
+ ongoingEvent = false;
+ break;
+
+ case IDownloaderClient.STATE_DOWNLOADING:
+ iconResource = android.R.drawable.stat_sys_download;
+ stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
+ ongoingEvent = true;
+ break;
+
+ case IDownloaderClient.STATE_FETCHING_URL:
+ case IDownloaderClient.STATE_CONNECTING:
+ iconResource = android.R.drawable.stat_sys_download_done;
+ stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
+ ongoingEvent = true;
+ break;
+
+ case IDownloaderClient.STATE_COMPLETED:
+ case IDownloaderClient.STATE_PAUSED_BY_REQUEST:
+ iconResource = android.R.drawable.stat_sys_download_done;
+ stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
+ ongoingEvent = false;
+ break;
+
+ case IDownloaderClient.STATE_FAILED:
+ case IDownloaderClient.STATE_FAILED_CANCELED:
+ case IDownloaderClient.STATE_FAILED_FETCHING_URL:
+ case IDownloaderClient.STATE_FAILED_SDCARD_FULL:
+ case IDownloaderClient.STATE_FAILED_UNLICENSED:
+ iconResource = android.R.drawable.stat_sys_warning;
+ stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
+ ongoingEvent = false;
+ break;
+
+ default:
+ iconResource = android.R.drawable.stat_sys_warning;
+ stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
+ ongoingEvent = true;
+ break;
+ }
+
+ mCurrentText = mContext.getString(stringDownloadID);
+ mCurrentTitle = mLabel;
+ mCurrentBuilder.setTicker(mLabel + ": " + mCurrentText);
+ mCurrentBuilder.setSmallIcon(iconResource);
+ mCurrentBuilder.setContentTitle(mCurrentTitle);
+ mCurrentBuilder.setContentText(mCurrentText);
+ if (ongoingEvent) {
+ mCurrentBuilder.setOngoing(true);
+ } else {
+ mCurrentBuilder.setOngoing(false);
+ mCurrentBuilder.setAutoCancel(true);
+ }
+ mNotificationManager.notify(NOTIFICATION_ID, mCurrentBuilder.build());
+ }
+ }
+
+ @Override
+ public void onDownloadProgress(DownloadProgressInfo progress) {
+ mProgressInfo = progress;
+ if (null != mClientProxy) {
+ mClientProxy.onDownloadProgress(progress);
+ }
+ if (progress.mOverallTotal <= 0) {
+ // we just show the text
+ mBuilder.setTicker(mCurrentTitle);
+ mBuilder.setSmallIcon(android.R.drawable.stat_sys_download);
+ mBuilder.setContentTitle(mCurrentTitle);
+ mBuilder.setContentText(mCurrentText);
+ mCurrentBuilder = mBuilder;
+ } else {
+ mActiveDownloadBuilder.setProgress((int) progress.mOverallTotal, (int) progress.mOverallProgress, false);
+ mActiveDownloadBuilder.setContentText(Helpers.getDownloadProgressString(progress.mOverallProgress, progress.mOverallTotal));
+ mActiveDownloadBuilder.setSmallIcon(android.R.drawable.stat_sys_download);
+ mActiveDownloadBuilder.setTicker(mLabel + ": " + mCurrentText);
+ mActiveDownloadBuilder.setContentTitle(mLabel);
+ mActiveDownloadBuilder.setContentInfo(mContext.getString(R.string.time_remaining_notification,
+ Helpers.getTimeRemaining(progress.mTimeRemaining)));
+ mCurrentBuilder = mActiveDownloadBuilder;
+ }
+ mNotificationManager.notify(NOTIFICATION_ID, mCurrentBuilder.build());
+ }
+
+ /**
* Called in response to onClientUpdated. Creates a new proxy and notifies
* it of the current state.
*
* @param msg the client Messenger to notify
*/
- public void setMessenger(Messenger msg) {
- mClientProxy = DownloaderClientMarshaller.CreateProxy(msg);
- if (null != mProgressInfo) {
- mClientProxy.onDownloadProgress(mProgressInfo);
- }
- if (mState != -1) {
- mClientProxy.onDownloadStateChanged(mState);
- }
- }
-
- /**
+ public void setMessenger(Messenger msg) {
+ mClientProxy = DownloaderClientMarshaller.CreateProxy(msg);
+ if (null != mProgressInfo) {
+ mClientProxy.onDownloadProgress(mProgressInfo);
+ }
+ if (mState != -1) {
+ mClientProxy.onDownloadStateChanged(mState);
+ }
+ }
+
+ /**
* Constructor
*
* @param ctx The context to use to obtain access to the Notification
* Service
*/
- DownloadNotification(Context ctx, CharSequence applicationLabel) {
- mState = -1;
- mContext = ctx;
- mLabel = applicationLabel;
- mNotificationManager = (NotificationManager)
- mContext.getSystemService(Context.NOTIFICATION_SERVICE);
- mActiveDownloadBuilder = new NotificationCompat.Builder(ctx);
- mBuilder = new NotificationCompat.Builder(ctx);
-
- // Set Notification category and priorities to something that makes sense for a long
- // lived background task.
- mActiveDownloadBuilder.setPriority(NotificationCompat.PRIORITY_LOW);
- mActiveDownloadBuilder.setCategory(NotificationCompat.CATEGORY_PROGRESS);
-
- mBuilder.setPriority(NotificationCompat.PRIORITY_LOW);
- mBuilder.setCategory(NotificationCompat.CATEGORY_PROGRESS);
-
- mCurrentBuilder = mBuilder;
- }
-
- @Override
- public void onServiceConnected(Messenger m) {
- }
+ DownloadNotification(Context ctx, CharSequence applicationLabel) {
+ mState = -1;
+ mContext = ctx;
+ mLabel = applicationLabel;
+ mNotificationManager = (NotificationManager)
+ mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ mActiveDownloadBuilder = new NotificationCompat.Builder(ctx);
+ mBuilder = new NotificationCompat.Builder(ctx);
+
+ // Set Notification category and priorities to something that makes sense for a long
+ // lived background task.
+ mActiveDownloadBuilder.setPriority(NotificationCompat.PRIORITY_LOW);
+ mActiveDownloadBuilder.setCategory(NotificationCompat.CATEGORY_PROGRESS);
+
+ mBuilder.setPriority(NotificationCompat.PRIORITY_LOW);
+ mBuilder.setCategory(NotificationCompat.CATEGORY_PROGRESS);
+
+ mCurrentBuilder = mBuilder;
+ }
+
+ @Override
+ public void onServiceConnected(Messenger m) {
+ }
+
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java
index 2fa146408b..c114b8a64a 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java
@@ -40,435 +40,447 @@ import java.util.Locale;
*/
public class DownloadThread {
- private Context mContext;
- private DownloadInfo mInfo;
- private DownloaderService mService;
- private final DownloadsDB mDB;
- private final DownloadNotification mNotification;
- private String mUserAgent;
-
- public DownloadThread(DownloadInfo info, DownloaderService service,
- DownloadNotification notification) {
- mContext = service;
- mInfo = info;
- mService = service;
- mNotification = notification;
- mDB = DownloadsDB.getDB(service);
- mUserAgent = "APKXDL (Linux; U; Android " + android.os.Build.VERSION.RELEASE + ";" + Locale.getDefault().toString() + "; " + android.os.Build.DEVICE + "/" + android.os.Build.ID + ")" +
- service.getPackageName();
- }
-
- /**
+ private Context mContext;
+ private DownloadInfo mInfo;
+ private DownloaderService mService;
+ private final DownloadsDB mDB;
+ private final DownloadNotification mNotification;
+ private String mUserAgent;
+
+ public DownloadThread(DownloadInfo info, DownloaderService service,
+ DownloadNotification notification) {
+ mContext = service;
+ mInfo = info;
+ mService = service;
+ mNotification = notification;
+ mDB = DownloadsDB.getDB(service);
+ mUserAgent = "APKXDL (Linux; U; Android " + android.os.Build.VERSION.RELEASE + ";"
+ + Locale.getDefault().toString() + "; " + android.os.Build.DEVICE + "/"
+ + android.os.Build.ID + ")" +
+ service.getPackageName();
+ }
+
+ /**
* Returns the default user agent
*/
- private String userAgent() {
- return mUserAgent;
- }
+ private String userAgent() {
+ return mUserAgent;
+ }
- /**
+ /**
* State for the entire run() method.
*/
- private static class State {
- public String mFilename;
- public FileOutputStream mStream;
- public boolean mCountRetry = false;
- public int mRetryAfter = 0;
- public int mRedirectCount = 0;
- public String mNewUri;
- public boolean mGotData = false;
- public String mRequestUri;
-
- public State(DownloadInfo info, DownloaderService service) {
- mRedirectCount = info.mRedirectCount;
- mRequestUri = info.mUri;
- mFilename = service.generateTempSaveFileName(info.mFileName);
- }
- }
-
- /**
+ private static class State {
+ public String mFilename;
+ public FileOutputStream mStream;
+ public boolean mCountRetry = false;
+ public int mRetryAfter = 0;
+ public int mRedirectCount = 0;
+ public String mNewUri;
+ public boolean mGotData = false;
+ public String mRequestUri;
+
+ public State(DownloadInfo info, DownloaderService service) {
+ mRedirectCount = info.mRedirectCount;
+ mRequestUri = info.mUri;
+ mFilename = service.generateTempSaveFileName(info.mFileName);
+ }
+ }
+
+ /**
* State within executeDownload()
*/
- private static class InnerState {
- public int mBytesSoFar = 0;
- public int mBytesThisSession = 0;
- public String mHeaderETag;
- public boolean mContinuingDownload = false;
- public String mHeaderContentLength;
- public String mHeaderContentDisposition;
- public String mHeaderContentLocation;
- public int mBytesNotified = 0;
- public long mTimeLastNotification = 0;
- }
-
- /**
+ private static class InnerState {
+ public int mBytesSoFar = 0;
+ public int mBytesThisSession = 0;
+ public String mHeaderETag;
+ public boolean mContinuingDownload = false;
+ public String mHeaderContentLength;
+ public String mHeaderContentDisposition;
+ public String mHeaderContentLocation;
+ public int mBytesNotified = 0;
+ public long mTimeLastNotification = 0;
+ }
+
+ /**
* Raised from methods called by run() to indicate that the current request
* should be stopped immediately. Note the message passed to this exception
* will be logged and therefore must be guaranteed not to contain any PII,
* meaning it generally can't include any information about the request URI,
* headers, or destination filename.
*/
- private class StopRequest extends Throwable {
-
- private static final long serialVersionUID = 6338592678988347973L;
- public int mFinalStatus;
-
- public StopRequest(int finalStatus, String message) {
- super(message);
- mFinalStatus = finalStatus;
- }
-
- public StopRequest(int finalStatus, String message, Throwable throwable) {
- super(message, throwable);
- mFinalStatus = finalStatus;
- }
- }
-
- /**
+ private class StopRequest extends Throwable {
+
+ private static final long serialVersionUID = 6338592678988347973L;
+ public int mFinalStatus;
+
+ public StopRequest(int finalStatus, String message) {
+ super(message);
+ mFinalStatus = finalStatus;
+ }
+
+ public StopRequest(int finalStatus, String message, Throwable throwable) {
+ super(message, throwable);
+ mFinalStatus = finalStatus;
+ }
+ }
+
+ /**
* Raised from methods called by executeDownload() to indicate that the
* download should be retried immediately.
*/
- private class RetryDownload extends Throwable {
+ private class RetryDownload extends Throwable {
- private static final long serialVersionUID = 6196036036517540229L;
- }
+ private static final long serialVersionUID = 6196036036517540229L;
+ }
- /**
+ /**
* Executes the download in a separate thread
*/
- public void run() {
- Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-
- State state = new State(mInfo, mService);
- PowerManager.WakeLock wakeLock = null;
- int finalStatus = DownloaderService.STATUS_UNKNOWN_ERROR;
-
- try {
- PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
- wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "org.godot.game:wakelock");
- wakeLock.acquire(20 * 60 * 1000L /*20 minutes*/);
-
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "initiating download for " + mInfo.mFileName);
- Log.v(Constants.TAG, " at " + mInfo.mUri);
- }
-
- boolean finished = false;
- while (!finished) {
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "initiating download for " + mInfo.mFileName);
- Log.v(Constants.TAG, " at " + mInfo.mUri);
- }
- // Set or unset proxy, which may have changed since last GET
- // request.
- // setDefaultProxy() supports null as proxy parameter.
- URL url = new URL(state.mRequestUri);
- HttpURLConnection request = (HttpURLConnection)url.openConnection();
- request.setRequestProperty("User-Agent", userAgent());
- try {
- executeDownload(state, request);
- finished = true;
- } catch (RetryDownload exc) {
- // fall through
- } finally {
- request.disconnect();
- request = null;
- }
- }
-
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "download completed for " + mInfo.mFileName);
- Log.v(Constants.TAG, " at " + mInfo.mUri);
- }
- finalizeDestinationFile(state);
- finalStatus = DownloaderService.STATUS_SUCCESS;
- } catch (StopRequest error) {
- // remove the cause before printing, in case it contains PII
- Log.w(Constants.TAG,
- "Aborting request for download " + mInfo.mFileName + ": " + error.getMessage());
- error.printStackTrace();
- finalStatus = error.mFinalStatus;
- // fall through to finally block
- } catch (Throwable ex) { // sometimes the socket code throws unchecked
- // exceptions
- Log.w(Constants.TAG, "Exception for " + mInfo.mFileName + ": " + ex);
- finalStatus = DownloaderService.STATUS_UNKNOWN_ERROR;
- // falls through to the code that reports an error
- } finally {
- if (wakeLock != null) {
- wakeLock.release();
- wakeLock = null;
- }
- cleanupDestination(state, finalStatus);
- notifyDownloadCompleted(finalStatus, state.mCountRetry, state.mRetryAfter,
- state.mRedirectCount, state.mGotData, state.mFilename);
- }
- }
-
- /**
+ public void run() {
+ Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+
+ State state = new State(mInfo, mService);
+ PowerManager.WakeLock wakeLock = null;
+ int finalStatus = DownloaderService.STATUS_UNKNOWN_ERROR;
+
+ try {
+ PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ // -- GODOT start --
+ //wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Constants.TAG);
+ //wakeLock.acquire();
+ wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "org.godot.game:wakelock");
+ wakeLock.acquire(20 * 60 * 1000L /*20 minutes*/);
+ // -- GODOT end --
+
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "initiating download for " + mInfo.mFileName);
+ Log.v(Constants.TAG, " at " + mInfo.mUri);
+ }
+
+ boolean finished = false;
+ while (!finished) {
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "initiating download for " + mInfo.mFileName);
+ Log.v(Constants.TAG, " at " + mInfo.mUri);
+ }
+ // Set or unset proxy, which may have changed since last GET
+ // request.
+ // setDefaultProxy() supports null as proxy parameter.
+ URL url = new URL(state.mRequestUri);
+ HttpURLConnection request = (HttpURLConnection)url.openConnection();
+ request.setRequestProperty("User-Agent", userAgent());
+ try {
+ executeDownload(state, request);
+ finished = true;
+ } catch (RetryDownload exc) {
+ // fall through
+ } finally {
+ request.disconnect();
+ request = null;
+ }
+ }
+
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "download completed for " + mInfo.mFileName);
+ Log.v(Constants.TAG, " at " + mInfo.mUri);
+ }
+ finalizeDestinationFile(state);
+ finalStatus = DownloaderService.STATUS_SUCCESS;
+ } catch (StopRequest error) {
+ // remove the cause before printing, in case it contains PII
+ Log.w(Constants.TAG,
+ "Aborting request for download " + mInfo.mFileName + ": " + error.getMessage());
+ error.printStackTrace();
+ finalStatus = error.mFinalStatus;
+ // fall through to finally block
+ } catch (Throwable ex) { // sometimes the socket code throws unchecked
+ // exceptions
+ Log.w(Constants.TAG, "Exception for " + mInfo.mFileName + ": " + ex);
+ finalStatus = DownloaderService.STATUS_UNKNOWN_ERROR;
+ // falls through to the code that reports an error
+ } finally {
+ if (wakeLock != null) {
+ wakeLock.release();
+ wakeLock = null;
+ }
+ cleanupDestination(state, finalStatus);
+ notifyDownloadCompleted(finalStatus, state.mCountRetry, state.mRetryAfter,
+ state.mRedirectCount, state.mGotData, state.mFilename);
+ }
+ }
+
+ /**
* Fully execute a single download request - setup and send the request,
* handle the response, and transfer the data to the destination file.
*/
- private void executeDownload(State state, HttpURLConnection request)
- throws StopRequest, RetryDownload {
- InnerState innerState = new InnerState();
- byte data[] = new byte[Constants.BUFFER_SIZE];
+ private void executeDownload(State state, HttpURLConnection request)
+ throws StopRequest, RetryDownload {
+ InnerState innerState = new InnerState();
+ byte data[] = new byte[Constants.BUFFER_SIZE];
- checkPausedOrCanceled(state);
+ checkPausedOrCanceled(state);
- setupDestinationFile(state, innerState);
- addRequestHeaders(innerState, request);
+ setupDestinationFile(state, innerState);
+ addRequestHeaders(innerState, request);
- // check just before sending the request to avoid using an invalid
- // connection at all
- checkConnectivity(state);
+ // check just before sending the request to avoid using an invalid
+ // connection at all
+ checkConnectivity(state);
- mNotification.onDownloadStateChanged(IDownloaderClient.STATE_CONNECTING);
- int responseCode = sendRequest(state, request);
- handleExceptionalStatus(state, innerState, request, responseCode);
+ mNotification.onDownloadStateChanged(IDownloaderClient.STATE_CONNECTING);
+ int responseCode = sendRequest(state, request);
+ handleExceptionalStatus(state, innerState, request, responseCode);
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "received response for " + mInfo.mUri);
- }
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "received response for " + mInfo.mUri);
+ }
- processResponseHeaders(state, innerState, request);
- InputStream entityStream = openResponseEntity(state, request);
- mNotification.onDownloadStateChanged(IDownloaderClient.STATE_DOWNLOADING);
- transferData(state, innerState, data, entityStream);
- }
+ processResponseHeaders(state, innerState, request);
+ InputStream entityStream = openResponseEntity(state, request);
+ mNotification.onDownloadStateChanged(IDownloaderClient.STATE_DOWNLOADING);
+ transferData(state, innerState, data, entityStream);
+ }
- /**
+ /**
* Check if current connectivity is valid for this request.
*/
- private void checkConnectivity(State state) throws StopRequest {
- switch (mService.getNetworkAvailabilityState(mDB)) {
- case DownloaderService.NETWORK_OK:
- return;
- case DownloaderService.NETWORK_NO_CONNECTION:
- throw new StopRequest(DownloaderService.STATUS_WAITING_FOR_NETWORK,
- "waiting for network to return");
- case DownloaderService.NETWORK_TYPE_DISALLOWED_BY_REQUESTOR:
- throw new StopRequest(
- DownloaderService.STATUS_QUEUED_FOR_WIFI_OR_CELLULAR_PERMISSION,
- "waiting for wifi or for download over cellular to be authorized");
- case DownloaderService.NETWORK_CANNOT_USE_ROAMING:
- throw new StopRequest(DownloaderService.STATUS_WAITING_FOR_NETWORK,
- "roaming is not allowed");
- case DownloaderService.NETWORK_UNUSABLE_DUE_TO_SIZE:
- throw new StopRequest(DownloaderService.STATUS_QUEUED_FOR_WIFI, "waiting for wifi");
- }
- }
-
- /**
+ private void checkConnectivity(State state) throws StopRequest {
+ switch (mService.getNetworkAvailabilityState(mDB)) {
+ case DownloaderService.NETWORK_OK:
+ return;
+ case DownloaderService.NETWORK_NO_CONNECTION:
+ throw new StopRequest(DownloaderService.STATUS_WAITING_FOR_NETWORK,
+ "waiting for network to return");
+ case DownloaderService.NETWORK_TYPE_DISALLOWED_BY_REQUESTOR:
+ throw new StopRequest(
+ DownloaderService.STATUS_QUEUED_FOR_WIFI_OR_CELLULAR_PERMISSION,
+ "waiting for wifi or for download over cellular to be authorized");
+ case DownloaderService.NETWORK_CANNOT_USE_ROAMING:
+ throw new StopRequest(DownloaderService.STATUS_WAITING_FOR_NETWORK,
+ "roaming is not allowed");
+ case DownloaderService.NETWORK_UNUSABLE_DUE_TO_SIZE:
+ throw new StopRequest(DownloaderService.STATUS_QUEUED_FOR_WIFI, "waiting for wifi");
+ }
+ }
+
+ /**
* Transfer as much data as possible from the HTTP response to the
* destination file.
*
* @param data buffer to use to read data
* @param entityStream stream for reading the HTTP response entity
*/
- private void transferData(State state, InnerState innerState, byte[] data,
- InputStream entityStream) throws StopRequest {
- for (;;) {
- int bytesRead = readFromResponse(state, innerState, data, entityStream);
- if (bytesRead == -1) { // success, end of stream already reached
- handleEndOfStream(state, innerState);
- return;
- }
-
- state.mGotData = true;
- writeDataToDestination(state, data, bytesRead);
- innerState.mBytesSoFar += bytesRead;
- innerState.mBytesThisSession += bytesRead;
- reportProgress(state, innerState);
-
- checkPausedOrCanceled(state);
- }
- }
-
- /**
+ private void transferData(State state, InnerState innerState, byte[] data,
+ InputStream entityStream) throws StopRequest {
+ for (;;) {
+ int bytesRead = readFromResponse(state, innerState, data, entityStream);
+ if (bytesRead == -1) { // success, end of stream already reached
+ handleEndOfStream(state, innerState);
+ return;
+ }
+
+ state.mGotData = true;
+ writeDataToDestination(state, data, bytesRead);
+ innerState.mBytesSoFar += bytesRead;
+ innerState.mBytesThisSession += bytesRead;
+ reportProgress(state, innerState);
+
+ checkPausedOrCanceled(state);
+ }
+ }
+
+ /**
* Called after a successful completion to take any necessary action on the
* downloaded file.
*/
- private void finalizeDestinationFile(State state) throws StopRequest {
- syncDestination(state);
- String tempFilename = state.mFilename;
- String finalFilename = Helpers.generateSaveFileName(mService, mInfo.mFileName);
- if (!state.mFilename.equals(finalFilename)) {
- File startFile = new File(tempFilename);
- File destFile = new File(finalFilename);
- if (mInfo.mTotalBytes != -1 && mInfo.mCurrentBytes == mInfo.mTotalBytes) {
- if (!startFile.renameTo(destFile)) {
- throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
- "unable to finalize destination file");
- }
- } else {
- throw new StopRequest(DownloaderService.STATUS_FILE_DELIVERED_INCORRECTLY,
- "file delivered with incorrect size. probably due to network not browser configured");
- }
- }
- }
-
- /**
+ private void finalizeDestinationFile(State state) throws StopRequest {
+ syncDestination(state);
+ String tempFilename = state.mFilename;
+ String finalFilename = Helpers.generateSaveFileName(mService, mInfo.mFileName);
+ if (!state.mFilename.equals(finalFilename)) {
+ File startFile = new File(tempFilename);
+ File destFile = new File(finalFilename);
+ if (mInfo.mTotalBytes != -1 && mInfo.mCurrentBytes == mInfo.mTotalBytes) {
+ if (!startFile.renameTo(destFile)) {
+ throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
+ "unable to finalize destination file");
+ }
+ } else {
+ throw new StopRequest(DownloaderService.STATUS_FILE_DELIVERED_INCORRECTLY,
+ "file delivered with incorrect size. probably due to network not browser configured");
+ }
+ }
+ }
+
+ /**
* Called just before the thread finishes, regardless of status, to take any
* necessary action on the downloaded file.
*/
- private void cleanupDestination(State state, int finalStatus) {
- closeDestination(state);
- if (state.mFilename != null && DownloaderService.isStatusError(finalStatus)) {
- new File(state.mFilename).delete();
- state.mFilename = null;
- }
- }
-
- /**
+ private void cleanupDestination(State state, int finalStatus) {
+ closeDestination(state);
+ if (state.mFilename != null && DownloaderService.isStatusError(finalStatus)) {
+ new File(state.mFilename).delete();
+ state.mFilename = null;
+ }
+ }
+
+ /**
* Sync the destination file to storage.
*/
- private void syncDestination(State state) {
- FileOutputStream downloadedFileStream = null;
- try {
- downloadedFileStream = new FileOutputStream(state.mFilename, true);
- downloadedFileStream.getFD().sync();
- } catch (FileNotFoundException ex) {
- Log.w(Constants.TAG, "file " + state.mFilename + " not found: " + ex);
- } catch (SyncFailedException ex) {
- Log.w(Constants.TAG, "file " + state.mFilename + " sync failed: " + ex);
- } catch (IOException ex) {
- Log.w(Constants.TAG, "IOException trying to sync " + state.mFilename + ": " + ex);
- } catch (RuntimeException ex) {
- Log.w(Constants.TAG, "exception while syncing file: ", ex);
- } finally {
- if (downloadedFileStream != null) {
- try {
- downloadedFileStream.close();
- } catch (IOException ex) {
- Log.w(Constants.TAG, "IOException while closing synced file: ", ex);
- } catch (RuntimeException ex) {
- Log.w(Constants.TAG, "exception while closing file: ", ex);
- }
- }
- }
- }
-
- /**
+ private void syncDestination(State state) {
+ FileOutputStream downloadedFileStream = null;
+ try {
+ downloadedFileStream = new FileOutputStream(state.mFilename, true);
+ downloadedFileStream.getFD().sync();
+ } catch (FileNotFoundException ex) {
+ Log.w(Constants.TAG, "file " + state.mFilename + " not found: " + ex);
+ } catch (SyncFailedException ex) {
+ Log.w(Constants.TAG, "file " + state.mFilename + " sync failed: " + ex);
+ } catch (IOException ex) {
+ Log.w(Constants.TAG, "IOException trying to sync " + state.mFilename + ": " + ex);
+ } catch (RuntimeException ex) {
+ Log.w(Constants.TAG, "exception while syncing file: ", ex);
+ } finally {
+ if (downloadedFileStream != null) {
+ try {
+ downloadedFileStream.close();
+ } catch (IOException ex) {
+ Log.w(Constants.TAG, "IOException while closing synced file: ", ex);
+ } catch (RuntimeException ex) {
+ Log.w(Constants.TAG, "exception while closing file: ", ex);
+ }
+ }
+ }
+ }
+
+ /**
* Close the destination output stream.
*/
- private void closeDestination(State state) {
- try {
- // close the file
- if (state.mStream != null) {
- state.mStream.close();
- state.mStream = null;
- }
- } catch (IOException ex) {
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "exception when closing the file after download : " + ex);
- }
- // nothing can really be done if the file can't be closed
- }
- }
-
- /**
+ private void closeDestination(State state) {
+ try {
+ // close the file
+ if (state.mStream != null) {
+ state.mStream.close();
+ state.mStream = null;
+ }
+ } catch (IOException ex) {
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "exception when closing the file after download : " + ex);
+ }
+ // nothing can really be done if the file can't be closed
+ }
+ }
+
+ /**
* Check if the download has been paused or canceled, stopping the request
* appropriately if it has been.
*/
- private void checkPausedOrCanceled(State state) throws StopRequest {
- if (mService.getControl() == DownloaderService.CONTROL_PAUSED) {
- int status = mService.getStatus();
- switch (status) {
- case DownloaderService.STATUS_PAUSED_BY_APP:
- throw new StopRequest(mService.getStatus(),
- "download paused");
- }
- }
- }
-
- /**
+ private void checkPausedOrCanceled(State state) throws StopRequest {
+ if (mService.getControl() == DownloaderService.CONTROL_PAUSED) {
+ int status = mService.getStatus();
+ switch (status) {
+ case DownloaderService.STATUS_PAUSED_BY_APP:
+ throw new StopRequest(mService.getStatus(),
+ "download paused");
+ }
+ }
+ }
+
+ /**
* Report download progress through the database if necessary.
*/
- private void reportProgress(State state, InnerState innerState) {
- long now = System.currentTimeMillis();
- if (innerState.mBytesSoFar - innerState.mBytesNotified > Constants.MIN_PROGRESS_STEP && now - innerState.mTimeLastNotification > Constants.MIN_PROGRESS_TIME) {
- // we store progress updates to the database here
- mInfo.mCurrentBytes = innerState.mBytesSoFar;
- mDB.updateDownloadCurrentBytes(mInfo);
-
- innerState.mBytesNotified = innerState.mBytesSoFar;
- innerState.mTimeLastNotification = now;
-
- long totalBytesSoFar = innerState.mBytesThisSession + mService.mBytesSoFar;
-
- if (Constants.LOGVV) {
- Log.v(Constants.TAG, "downloaded " + mInfo.mCurrentBytes + " out of " + mInfo.mTotalBytes);
- Log.v(Constants.TAG, " total " + totalBytesSoFar + " out of " + mService.mTotalLength);
- }
-
- mService.notifyUpdateBytes(totalBytesSoFar);
- }
- }
-
- /**
+ private void reportProgress(State state, InnerState innerState) {
+ long now = System.currentTimeMillis();
+ if (innerState.mBytesSoFar - innerState.mBytesNotified
+ > Constants.MIN_PROGRESS_STEP
+ && now - innerState.mTimeLastNotification
+ > Constants.MIN_PROGRESS_TIME) {
+ // we store progress updates to the database here
+ mInfo.mCurrentBytes = innerState.mBytesSoFar;
+ mDB.updateDownloadCurrentBytes(mInfo);
+
+ innerState.mBytesNotified = innerState.mBytesSoFar;
+ innerState.mTimeLastNotification = now;
+
+ long totalBytesSoFar = innerState.mBytesThisSession + mService.mBytesSoFar;
+
+ if (Constants.LOGVV) {
+ Log.v(Constants.TAG, "downloaded " + mInfo.mCurrentBytes + " out of "
+ + mInfo.mTotalBytes);
+ Log.v(Constants.TAG, " total " + totalBytesSoFar + " out of "
+ + mService.mTotalLength);
+ }
+
+ mService.notifyUpdateBytes(totalBytesSoFar);
+ }
+ }
+
+ /**
* Write a data buffer to the destination file.
*
* @param data buffer containing the data to write
* @param bytesRead how many bytes to write from the buffer
*/
- private void writeDataToDestination(State state, byte[] data, int bytesRead)
- throws StopRequest {
- for (;;) {
- try {
- if (state.mStream == null) {
- state.mStream = new FileOutputStream(state.mFilename, true);
- }
- state.mStream.write(data, 0, bytesRead);
- // we close after every write --- this may be too inefficient
- closeDestination(state);
- return;
- } catch (IOException ex) {
- if (!Helpers.isExternalMediaMounted()) {
- throw new StopRequest(DownloaderService.STATUS_DEVICE_NOT_FOUND_ERROR,
- "external media not mounted while writing destination file");
- }
-
- long availableBytes =
- Helpers.getAvailableBytes(Helpers.getFilesystemRoot(state.mFilename));
- if (availableBytes < bytesRead) {
- throw new StopRequest(DownloaderService.STATUS_INSUFFICIENT_SPACE_ERROR,
- "insufficient space while writing destination file", ex);
- }
- throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
- "while writing destination file: " + ex.toString(), ex);
- }
- }
- }
-
- /**
+ private void writeDataToDestination(State state, byte[] data, int bytesRead)
+ throws StopRequest {
+ for (;;) {
+ try {
+ if (state.mStream == null) {
+ state.mStream = new FileOutputStream(state.mFilename, true);
+ }
+ state.mStream.write(data, 0, bytesRead);
+ // we close after every write --- this may be too inefficient
+ closeDestination(state);
+ return;
+ } catch (IOException ex) {
+ if (!Helpers.isExternalMediaMounted()) {
+ throw new StopRequest(DownloaderService.STATUS_DEVICE_NOT_FOUND_ERROR,
+ "external media not mounted while writing destination file");
+ }
+
+ long availableBytes =
+ Helpers.getAvailableBytes(Helpers.getFilesystemRoot(state.mFilename));
+ if (availableBytes < bytesRead) {
+ throw new StopRequest(DownloaderService.STATUS_INSUFFICIENT_SPACE_ERROR,
+ "insufficient space while writing destination file", ex);
+ }
+ throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
+ "while writing destination file: " + ex.toString(), ex);
+ }
+ }
+ }
+
+ /**
* Called when we've reached the end of the HTTP response stream, to update
* the database and check for consistency.
*/
- private void handleEndOfStream(State state, InnerState innerState) throws StopRequest {
- mInfo.mCurrentBytes = innerState.mBytesSoFar;
- // this should always be set from the market
- // if ( innerState.mHeaderContentLength == null ) {
- // mInfo.mTotalBytes = innerState.mBytesSoFar;
- // }
- mDB.updateDownload(mInfo);
-
- boolean lengthMismatched = (innerState.mHeaderContentLength != null) && (innerState.mBytesSoFar != Integer.parseInt(innerState.mHeaderContentLength));
- if (lengthMismatched) {
- if (cannotResume(innerState)) {
- throw new StopRequest(DownloaderService.STATUS_CANNOT_RESUME,
- "mismatched content length");
- } else {
- throw new StopRequest(getFinalStatusForHttpError(state),
- "closed socket before end of file");
- }
- }
- }
-
- private boolean cannotResume(InnerState innerState) {
- return innerState.mBytesSoFar > 0 && innerState.mHeaderETag == null;
- }
-
- /**
+ private void handleEndOfStream(State state, InnerState innerState) throws StopRequest {
+ mInfo.mCurrentBytes = innerState.mBytesSoFar;
+ // this should always be set from the market
+ // if ( innerState.mHeaderContentLength == null ) {
+ // mInfo.mTotalBytes = innerState.mBytesSoFar;
+ // }
+ mDB.updateDownload(mInfo);
+
+ boolean lengthMismatched = (innerState.mHeaderContentLength != null)
+ && (innerState.mBytesSoFar != Integer.parseInt(innerState.mHeaderContentLength));
+ if (lengthMismatched) {
+ if (cannotResume(innerState)) {
+ throw new StopRequest(DownloaderService.STATUS_CANNOT_RESUME,
+ "mismatched content length");
+ } else {
+ throw new StopRequest(getFinalStatusForHttpError(state),
+ "closed socket before end of file");
+ }
+ }
+ }
+
+ private boolean cannotResume(InnerState innerState) {
+ return innerState.mBytesSoFar > 0 && innerState.mHeaderETag == null;
+ }
+
+ /**
* Read some data from the HTTP response stream, handling I/O errors.
*
* @param data buffer to use to read data
@@ -476,358 +488,365 @@ public class DownloadThread {
* @return the number of bytes actually read or -1 if the end of the stream
* has been reached
*/
- private int readFromResponse(State state, InnerState innerState, byte[] data,
- InputStream entityStream) throws StopRequest {
- try {
- return entityStream.read(data);
- } catch (IOException ex) {
- logNetworkState();
- mInfo.mCurrentBytes = innerState.mBytesSoFar;
- mDB.updateDownload(mInfo);
- if (cannotResume(innerState)) {
- String message = "while reading response: " + ex.toString() + ", can't resume interrupted download with no ETag";
- throw new StopRequest(DownloaderService.STATUS_CANNOT_RESUME,
- message, ex);
- } else {
- throw new StopRequest(getFinalStatusForHttpError(state),
- "while reading response: " + ex.toString(), ex);
- }
- }
- }
-
- /**
+ private int readFromResponse(State state, InnerState innerState, byte[] data,
+ InputStream entityStream) throws StopRequest {
+ try {
+ return entityStream.read(data);
+ } catch (IOException ex) {
+ logNetworkState();
+ mInfo.mCurrentBytes = innerState.mBytesSoFar;
+ mDB.updateDownload(mInfo);
+ if (cannotResume(innerState)) {
+ String message = "while reading response: " + ex.toString()
+ + ", can't resume interrupted download with no ETag";
+ throw new StopRequest(DownloaderService.STATUS_CANNOT_RESUME,
+ message, ex);
+ } else {
+ throw new StopRequest(getFinalStatusForHttpError(state),
+ "while reading response: " + ex.toString(), ex);
+ }
+ }
+ }
+
+ /**
* Open a stream for the HTTP response entity, handling I/O errors.
*
* @return an InputStream to read the response entity
*/
- private InputStream openResponseEntity(State state, HttpURLConnection response)
- throws StopRequest {
- try {
- return response.getInputStream();
- } catch (IOException ex) {
- logNetworkState();
- throw new StopRequest(getFinalStatusForHttpError(state),
- "while getting entity: " + ex.toString(), ex);
- }
- }
-
- private void logNetworkState() {
- if (Constants.LOGX) {
- Log.i(Constants.TAG,
- "Net " + (mService.getNetworkAvailabilityState(mDB) == DownloaderService.NETWORK_OK ? "Up" : "Down"));
- }
- }
-
- /**
+ private InputStream openResponseEntity(State state, HttpURLConnection response)
+ throws StopRequest {
+ try {
+ return response.getInputStream();
+ } catch (IOException ex) {
+ logNetworkState();
+ throw new StopRequest(getFinalStatusForHttpError(state),
+ "while getting entity: " + ex.toString(), ex);
+ }
+ }
+
+ private void logNetworkState() {
+ if (Constants.LOGX) {
+ Log.i(Constants.TAG,
+ "Net "
+ + (mService.getNetworkAvailabilityState(mDB) == DownloaderService.NETWORK_OK ? "Up"
+ : "Down"));
+ }
+ }
+
+ /**
* Read HTTP response headers and take appropriate action, including setting
* up the destination file and updating the database.
*/
- private void processResponseHeaders(State state, InnerState innerState, HttpURLConnection response)
- throws StopRequest {
- if (innerState.mContinuingDownload) {
- // ignore response headers on resume requests
- return;
- }
-
- readResponseHeaders(state, innerState, response);
-
- try {
- state.mFilename = mService.generateSaveFile(mInfo.mFileName, mInfo.mTotalBytes);
- } catch (DownloaderService.GenerateSaveFileError exc) {
- throw new StopRequest(exc.mStatus, exc.mMessage);
- }
- try {
- state.mStream = new FileOutputStream(state.mFilename);
- } catch (FileNotFoundException exc) {
- // make sure the directory exists
- File pathFile = new File(Helpers.getSaveFilePath(mService));
- try {
- if (pathFile.mkdirs()) {
- state.mStream = new FileOutputStream(state.mFilename);
- }
- } catch (Exception ex) {
- throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
- "while opening destination file: " + exc.toString(), exc);
- }
- }
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "writing " + mInfo.mUri + " to " + state.mFilename);
- }
-
- updateDatabaseFromHeaders(state, innerState);
- // check connectivity again now that we know the total size
- checkConnectivity(state);
- }
-
- /**
+ private void processResponseHeaders(State state, InnerState innerState, HttpURLConnection response)
+ throws StopRequest {
+ if (innerState.mContinuingDownload) {
+ // ignore response headers on resume requests
+ return;
+ }
+
+ readResponseHeaders(state, innerState, response);
+
+ try {
+ state.mFilename = mService.generateSaveFile(mInfo.mFileName, mInfo.mTotalBytes);
+ } catch (DownloaderService.GenerateSaveFileError exc) {
+ throw new StopRequest(exc.mStatus, exc.mMessage);
+ }
+ try {
+ state.mStream = new FileOutputStream(state.mFilename);
+ } catch (FileNotFoundException exc) {
+ // make sure the directory exists
+ File pathFile = new File(Helpers.getSaveFilePath(mService));
+ try {
+ if (pathFile.mkdirs()) {
+ state.mStream = new FileOutputStream(state.mFilename);
+ }
+ } catch (Exception ex) {
+ throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
+ "while opening destination file: " + exc.toString(), exc);
+ }
+ }
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "writing " + mInfo.mUri + " to " + state.mFilename);
+ }
+
+ updateDatabaseFromHeaders(state, innerState);
+ // check connectivity again now that we know the total size
+ checkConnectivity(state);
+ }
+
+ /**
* Update necessary database fields based on values of HTTP response headers
* that have been read.
*/
- private void updateDatabaseFromHeaders(State state, InnerState innerState) {
- mInfo.mETag = innerState.mHeaderETag;
- mDB.updateDownload(mInfo);
- }
+ private void updateDatabaseFromHeaders(State state, InnerState innerState) {
+ mInfo.mETag = innerState.mHeaderETag;
+ mDB.updateDownload(mInfo);
+ }
- /**
+ /**
* Read headers from the HTTP response and store them into local state.
*/
- private void readResponseHeaders(State state, InnerState innerState, HttpURLConnection response)
- throws StopRequest {
- String value = response.getHeaderField("Content-Disposition");
- if (value != null) {
- innerState.mHeaderContentDisposition = value;
- }
- value = response.getHeaderField("Content-Location");
- if (value != null) {
- innerState.mHeaderContentLocation = value;
- }
- value = response.getHeaderField("ETag");
- if (value != null) {
- innerState.mHeaderETag = value;
- }
- String headerTransferEncoding = null;
- value = response.getHeaderField("Transfer-Encoding");
- if (value != null) {
- headerTransferEncoding = value;
- }
- String headerContentType = null;
- value = response.getHeaderField("Content-Type");
- if (value != null) {
- headerContentType = value;
- if (!headerContentType.equals("application/vnd.android.obb")) {
- throw new StopRequest(DownloaderService.STATUS_FILE_DELIVERED_INCORRECTLY,
- "file delivered with incorrect Mime type");
- }
- }
-
- if (headerTransferEncoding == null) {
- long contentLength = response.getContentLength();
- if (value != null) {
- // this is always set from Market
- if (contentLength != -1 && contentLength != mInfo.mTotalBytes) {
- // we're most likely on a bad wifi connection -- we should
- // probably
- // also look at the mime type --- but the size mismatch is
- // enough
- // to tell us that something is wrong here
- Log.e(Constants.TAG, "Incorrect file size delivered.");
- } else {
- innerState.mHeaderContentLength = Long.toString(contentLength);
- }
- }
- } else {
- // Ignore content-length with transfer-encoding - 2616 4.4 3
- if (Constants.LOGVV) {
- Log.v(Constants.TAG,
- "ignoring content-length because of xfer-encoding");
- }
- }
- if (Constants.LOGVV) {
- Log.v(Constants.TAG, "Content-Disposition: " +
- innerState.mHeaderContentDisposition);
- Log.v(Constants.TAG, "Content-Length: " + innerState.mHeaderContentLength);
- Log.v(Constants.TAG, "Content-Location: " + innerState.mHeaderContentLocation);
- Log.v(Constants.TAG, "ETag: " + innerState.mHeaderETag);
- Log.v(Constants.TAG, "Transfer-Encoding: " + headerTransferEncoding);
- }
-
- boolean noSizeInfo = innerState.mHeaderContentLength == null && (headerTransferEncoding == null || !headerTransferEncoding.equalsIgnoreCase("chunked"));
- if (noSizeInfo) {
- throw new StopRequest(DownloaderService.STATUS_HTTP_DATA_ERROR,
- "can't know size of download, giving up");
- }
- }
-
- /**
+ private void readResponseHeaders(State state, InnerState innerState, HttpURLConnection response)
+ throws StopRequest {
+ String value = response.getHeaderField("Content-Disposition");
+ if (value != null) {
+ innerState.mHeaderContentDisposition = value;
+ }
+ value = response.getHeaderField("Content-Location");
+ if (value != null) {
+ innerState.mHeaderContentLocation = value;
+ }
+ value = response.getHeaderField("ETag");
+ if (value != null) {
+ innerState.mHeaderETag = value;
+ }
+ String headerTransferEncoding = null;
+ value = response.getHeaderField("Transfer-Encoding");
+ if (value != null) {
+ headerTransferEncoding = value;
+ }
+ String headerContentType = null;
+ value = response.getHeaderField("Content-Type");
+ if (value != null) {
+ headerContentType = value;
+ if (!headerContentType.equals("application/vnd.android.obb")) {
+ throw new StopRequest(DownloaderService.STATUS_FILE_DELIVERED_INCORRECTLY,
+ "file delivered with incorrect Mime type");
+ }
+ }
+
+ if (headerTransferEncoding == null) {
+ long contentLength = response.getContentLength();
+ if (value != null) {
+ // this is always set from Market
+ if (contentLength != -1 && contentLength != mInfo.mTotalBytes) {
+ // we're most likely on a bad wifi connection -- we should
+ // probably
+ // also look at the mime type --- but the size mismatch is
+ // enough
+ // to tell us that something is wrong here
+ Log.e(Constants.TAG, "Incorrect file size delivered.");
+ } else {
+ innerState.mHeaderContentLength = Long.toString(contentLength);
+ }
+ }
+ } else {
+ // Ignore content-length with transfer-encoding - 2616 4.4 3
+ if (Constants.LOGVV) {
+ Log.v(Constants.TAG,
+ "ignoring content-length because of xfer-encoding");
+ }
+ }
+ if (Constants.LOGVV) {
+ Log.v(Constants.TAG, "Content-Disposition: " +
+ innerState.mHeaderContentDisposition);
+ Log.v(Constants.TAG, "Content-Length: " + innerState.mHeaderContentLength);
+ Log.v(Constants.TAG, "Content-Location: " + innerState.mHeaderContentLocation);
+ Log.v(Constants.TAG, "ETag: " + innerState.mHeaderETag);
+ Log.v(Constants.TAG, "Transfer-Encoding: " + headerTransferEncoding);
+ }
+
+ boolean noSizeInfo = innerState.mHeaderContentLength == null
+ && (headerTransferEncoding == null
+ || !headerTransferEncoding.equalsIgnoreCase("chunked"));
+ if (noSizeInfo) {
+ throw new StopRequest(DownloaderService.STATUS_HTTP_DATA_ERROR,
+ "can't know size of download, giving up");
+ }
+ }
+
+ /**
* Check the HTTP response status and handle anything unusual (e.g. not
* 200/206).
*/
- private void handleExceptionalStatus(State state, InnerState innerState, HttpURLConnection connection, int responseCode)
- throws StopRequest, RetryDownload {
- if (responseCode == 503 && mInfo.mNumFailed < Constants.MAX_RETRIES) {
- handleServiceUnavailable(state, connection);
- }
- int expectedStatus = innerState.mContinuingDownload ? 206 : DownloaderService.STATUS_SUCCESS;
- if (responseCode != expectedStatus) {
- handleOtherStatus(state, innerState, responseCode);
- } else {
- // no longer redirected
- state.mRedirectCount = 0;
- }
- }
-
- /**
+ private void handleExceptionalStatus(State state, InnerState innerState, HttpURLConnection connection, int responseCode)
+ throws StopRequest, RetryDownload {
+ if (responseCode == 503 && mInfo.mNumFailed < Constants.MAX_RETRIES) {
+ handleServiceUnavailable(state, connection);
+ }
+ int expectedStatus = innerState.mContinuingDownload ? 206
+ : DownloaderService.STATUS_SUCCESS;
+ if (responseCode != expectedStatus) {
+ handleOtherStatus(state, innerState, responseCode);
+ } else {
+ // no longer redirected
+ state.mRedirectCount = 0;
+ }
+ }
+
+ /**
* Handle a status that we don't know how to deal with properly.
*/
- private void handleOtherStatus(State state, InnerState innerState, int statusCode)
- throws StopRequest {
- int finalStatus;
- if (DownloaderService.isStatusError(statusCode)) {
- finalStatus = statusCode;
- } else if (statusCode >= 300 && statusCode < 400) {
- finalStatus = DownloaderService.STATUS_UNHANDLED_REDIRECT;
- } else if (innerState.mContinuingDownload && statusCode == DownloaderService.STATUS_SUCCESS) {
- finalStatus = DownloaderService.STATUS_CANNOT_RESUME;
- } else {
- finalStatus = DownloaderService.STATUS_UNHANDLED_HTTP_CODE;
- }
- throw new StopRequest(finalStatus, "http error " + statusCode);
- }
-
- /**
+ private void handleOtherStatus(State state, InnerState innerState, int statusCode)
+ throws StopRequest {
+ int finalStatus;
+ if (DownloaderService.isStatusError(statusCode)) {
+ finalStatus = statusCode;
+ } else if (statusCode >= 300 && statusCode < 400) {
+ finalStatus = DownloaderService.STATUS_UNHANDLED_REDIRECT;
+ } else if (innerState.mContinuingDownload && statusCode == DownloaderService.STATUS_SUCCESS) {
+ finalStatus = DownloaderService.STATUS_CANNOT_RESUME;
+ } else {
+ finalStatus = DownloaderService.STATUS_UNHANDLED_HTTP_CODE;
+ }
+ throw new StopRequest(finalStatus, "http error " + statusCode);
+ }
+
+ /**
* Add headers for this download to the HTTP request to allow for resume.
*/
- private void addRequestHeaders(InnerState innerState, HttpURLConnection request) {
- if (innerState.mContinuingDownload) {
- if (innerState.mHeaderETag != null) {
- request.setRequestProperty("If-Match", innerState.mHeaderETag);
- }
- request.setRequestProperty("Range", "bytes=" + innerState.mBytesSoFar + "-");
- }
- }
-
- /**
+ private void addRequestHeaders(InnerState innerState, HttpURLConnection request) {
+ if (innerState.mContinuingDownload) {
+ if (innerState.mHeaderETag != null) {
+ request.setRequestProperty("If-Match", innerState.mHeaderETag);
+ }
+ request.setRequestProperty("Range", "bytes=" + innerState.mBytesSoFar + "-");
+ }
+ }
+
+ /**
* Handle a 503 Service Unavailable status by processing the Retry-After
* header.
*/
- private void handleServiceUnavailable(State state, HttpURLConnection connection) throws StopRequest {
- if (Constants.LOGVV) {
- Log.v(Constants.TAG, "got HTTP response code 503");
- }
- state.mCountRetry = true;
- String retryAfterValue = connection.getHeaderField("Retry-After");
- if (retryAfterValue != null) {
- try {
- if (Constants.LOGVV) {
- Log.v(Constants.TAG, "Retry-After :" + retryAfterValue);
- }
- state.mRetryAfter = Integer.parseInt(retryAfterValue);
- if (state.mRetryAfter < 0) {
- state.mRetryAfter = 0;
- } else {
- if (state.mRetryAfter < Constants.MIN_RETRY_AFTER) {
- state.mRetryAfter = Constants.MIN_RETRY_AFTER;
- } else if (state.mRetryAfter > Constants.MAX_RETRY_AFTER) {
- state.mRetryAfter = Constants.MAX_RETRY_AFTER;
- }
- state.mRetryAfter += Helpers.sRandom.nextInt(Constants.MIN_RETRY_AFTER + 1);
- state.mRetryAfter *= 1000;
- }
- } catch (NumberFormatException ex) {
- // ignored - retryAfter stays 0 in this case.
- }
- }
- throw new StopRequest(DownloaderService.STATUS_WAITING_TO_RETRY,
- "got 503 Service Unavailable, will retry later");
- }
-
- /**
+ private void handleServiceUnavailable(State state, HttpURLConnection connection) throws StopRequest {
+ if (Constants.LOGVV) {
+ Log.v(Constants.TAG, "got HTTP response code 503");
+ }
+ state.mCountRetry = true;
+ String retryAfterValue = connection.getHeaderField("Retry-After");
+ if (retryAfterValue != null) {
+ try {
+ if (Constants.LOGVV) {
+ Log.v(Constants.TAG, "Retry-After :" + retryAfterValue);
+ }
+ state.mRetryAfter = Integer.parseInt(retryAfterValue);
+ if (state.mRetryAfter < 0) {
+ state.mRetryAfter = 0;
+ } else {
+ if (state.mRetryAfter < Constants.MIN_RETRY_AFTER) {
+ state.mRetryAfter = Constants.MIN_RETRY_AFTER;
+ } else if (state.mRetryAfter > Constants.MAX_RETRY_AFTER) {
+ state.mRetryAfter = Constants.MAX_RETRY_AFTER;
+ }
+ state.mRetryAfter += Helpers.sRandom.nextInt(Constants.MIN_RETRY_AFTER + 1);
+ state.mRetryAfter *= 1000;
+ }
+ } catch (NumberFormatException ex) {
+ // ignored - retryAfter stays 0 in this case.
+ }
+ }
+ throw new StopRequest(DownloaderService.STATUS_WAITING_TO_RETRY,
+ "got 503 Service Unavailable, will retry later");
+ }
+
+ /**
* Send the request to the server, handling any I/O exceptions.
*/
- private int sendRequest(State state, HttpURLConnection request)
- throws StopRequest {
- try {
- return request.getResponseCode();
- } catch (IllegalArgumentException ex) {
- throw new StopRequest(DownloaderService.STATUS_HTTP_DATA_ERROR,
- "while trying to execute request: " + ex.toString(), ex);
- } catch (IOException ex) {
- logNetworkState();
- throw new StopRequest(getFinalStatusForHttpError(state),
- "while trying to execute request: " + ex.toString(), ex);
- }
- }
-
- private int getFinalStatusForHttpError(State state) {
- if (mService.getNetworkAvailabilityState(mDB) != DownloaderService.NETWORK_OK) {
- return DownloaderService.STATUS_WAITING_FOR_NETWORK;
- } else if (mInfo.mNumFailed < Constants.MAX_RETRIES) {
- state.mCountRetry = true;
- return DownloaderService.STATUS_WAITING_TO_RETRY;
- } else {
- Log.w(Constants.TAG, "reached max retries for " + mInfo.mNumFailed);
- return DownloaderService.STATUS_HTTP_DATA_ERROR;
- }
- }
-
- /**
+ private int sendRequest(State state, HttpURLConnection request)
+ throws StopRequest {
+ try {
+ return request.getResponseCode();
+ } catch (IllegalArgumentException ex) {
+ throw new StopRequest(DownloaderService.STATUS_HTTP_DATA_ERROR,
+ "while trying to execute request: " + ex.toString(), ex);
+ } catch (IOException ex) {
+ logNetworkState();
+ throw new StopRequest(getFinalStatusForHttpError(state),
+ "while trying to execute request: " + ex.toString(), ex);
+ }
+ }
+
+ private int getFinalStatusForHttpError(State state) {
+ if (mService.getNetworkAvailabilityState(mDB) != DownloaderService.NETWORK_OK) {
+ return DownloaderService.STATUS_WAITING_FOR_NETWORK;
+ } else if (mInfo.mNumFailed < Constants.MAX_RETRIES) {
+ state.mCountRetry = true;
+ return DownloaderService.STATUS_WAITING_TO_RETRY;
+ } else {
+ Log.w(Constants.TAG, "reached max retries for " + mInfo.mNumFailed);
+ return DownloaderService.STATUS_HTTP_DATA_ERROR;
+ }
+ }
+
+ /**
* Prepare the destination file to receive data. If the file already exists,
* we'll set up appropriately for resumption.
*/
- private void setupDestinationFile(State state, InnerState innerState)
- throws StopRequest {
- if (state.mFilename != null) { // only true if we've already run a
- // thread for this download
- if (!Helpers.isFilenameValid(state.mFilename)) {
- // this should never happen
- throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
- "found invalid internal destination filename");
- }
- // We're resuming a download that got interrupted
- File f = new File(state.mFilename);
- if (f.exists()) {
- long fileLength = f.length();
- if (fileLength == 0) {
- // The download hadn't actually started, we can restart from
- // scratch
- f.delete();
- state.mFilename = null;
- } else if (mInfo.mETag == null) {
- // This should've been caught upon failure
- f.delete();
- throw new StopRequest(DownloaderService.STATUS_CANNOT_RESUME,
- "Trying to resume a download that can't be resumed");
- } else {
- // All right, we'll be able to resume this download
- try {
- state.mStream = new FileOutputStream(state.mFilename, true);
- } catch (FileNotFoundException exc) {
- throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
- "while opening destination for resuming: " + exc.toString(), exc);
- }
- innerState.mBytesSoFar = (int)fileLength;
- if (mInfo.mTotalBytes != -1) {
- innerState.mHeaderContentLength = Long.toString(mInfo.mTotalBytes);
- }
- innerState.mHeaderETag = mInfo.mETag;
- innerState.mContinuingDownload = true;
- }
- }
- }
-
- if (state.mStream != null) {
- closeDestination(state);
- }
- }
-
- /**
+ private void setupDestinationFile(State state, InnerState innerState)
+ throws StopRequest {
+ if (state.mFilename != null) { // only true if we've already run a
+ // thread for this download
+ if (!Helpers.isFilenameValid(state.mFilename)) {
+ // this should never happen
+ throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
+ "found invalid internal destination filename");
+ }
+ // We're resuming a download that got interrupted
+ File f = new File(state.mFilename);
+ if (f.exists()) {
+ long fileLength = f.length();
+ if (fileLength == 0) {
+ // The download hadn't actually started, we can restart from
+ // scratch
+ f.delete();
+ state.mFilename = null;
+ } else if (mInfo.mETag == null) {
+ // This should've been caught upon failure
+ f.delete();
+ throw new StopRequest(DownloaderService.STATUS_CANNOT_RESUME,
+ "Trying to resume a download that can't be resumed");
+ } else {
+ // All right, we'll be able to resume this download
+ try {
+ state.mStream = new FileOutputStream(state.mFilename, true);
+ } catch (FileNotFoundException exc) {
+ throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
+ "while opening destination for resuming: " + exc.toString(), exc);
+ }
+ innerState.mBytesSoFar = (int) fileLength;
+ if (mInfo.mTotalBytes != -1) {
+ innerState.mHeaderContentLength = Long.toString(mInfo.mTotalBytes);
+ }
+ innerState.mHeaderETag = mInfo.mETag;
+ innerState.mContinuingDownload = true;
+ }
+ }
+ }
+
+ if (state.mStream != null) {
+ closeDestination(state);
+ }
+ }
+
+ /**
* Stores information about the completed download, and notifies the
* initiating application.
*/
- private void notifyDownloadCompleted(
- int status, boolean countRetry, int retryAfter, int redirectCount, boolean gotData,
- String filename) {
- updateDownloadDatabase(
- status, countRetry, retryAfter, redirectCount, gotData, filename);
- if (DownloaderService.isStatusCompleted(status)) {
- // TBD: send status update?
- }
- }
-
- private void updateDownloadDatabase(
- int status, boolean countRetry, int retryAfter, int redirectCount, boolean gotData,
- String filename) {
- mInfo.mStatus = status;
- mInfo.mRetryAfter = retryAfter;
- mInfo.mRedirectCount = redirectCount;
- mInfo.mLastMod = System.currentTimeMillis();
- if (!countRetry) {
- mInfo.mNumFailed = 0;
- } else if (gotData) {
- mInfo.mNumFailed = 1;
- } else {
- mInfo.mNumFailed++;
- }
- mDB.updateDownload(mInfo);
- }
+ private void notifyDownloadCompleted(
+ int status, boolean countRetry, int retryAfter, int redirectCount, boolean gotData,
+ String filename) {
+ updateDownloadDatabase(
+ status, countRetry, retryAfter, redirectCount, gotData, filename);
+ if (DownloaderService.isStatusCompleted(status)) {
+ // TBD: send status update?
+ }
+ }
+
+ private void updateDownloadDatabase(
+ int status, boolean countRetry, int retryAfter, int redirectCount, boolean gotData,
+ String filename) {
+ mInfo.mStatus = status;
+ mInfo.mRetryAfter = retryAfter;
+ mInfo.mRedirectCount = redirectCount;
+ mInfo.mLastMod = System.currentTimeMillis();
+ if (!countRetry) {
+ mInfo.mNumFailed = 0;
+ } else if (gotData) {
+ mInfo.mNumFailed = 1;
+ } else {
+ mInfo.mNumFailed++;
+ }
+ mDB.updateDownload(mInfo);
+ }
+
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java
index 25a561ccd4..8d41a76900 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java
@@ -29,7 +29,6 @@ import com.google.android.vending.licensing.LicenseChecker;
import com.google.android.vending.licensing.LicenseCheckerCallback;
import com.google.android.vending.licensing.Policy;
-import android.annotation.SuppressLint;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
@@ -51,6 +50,10 @@ import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;
import android.util.Log;
+// -- GODOT start --
+import android.annotation.SuppressLint;
+// -- GODOT end --
+
import java.io.File;
/**
@@ -62,82 +65,82 @@ import java.io.File;
*/
public abstract class DownloaderService extends CustomIntentService implements IDownloaderService {
- public DownloaderService() {
- super("LVLDownloadService");
- }
+ public DownloaderService() {
+ super("LVLDownloadService");
+ }
- private static final String LOG_TAG = "LVLDL";
+ private static final String LOG_TAG = "LVLDL";
- // the following NETWORK_* constants are used to indicates specific reasons
- // for disallowing a
- // download from using a network, since specific causes can require special
- // handling
+ // the following NETWORK_* constants are used to indicates specific reasons
+ // for disallowing a
+ // download from using a network, since specific causes can require special
+ // handling
- /**
+ /**
* The network is usable for the given download.
*/
- public static final int NETWORK_OK = 1;
+ public static final int NETWORK_OK = 1;
- /**
+ /**
* There is no network connectivity.
*/
- public static final int NETWORK_NO_CONNECTION = 2;
+ public static final int NETWORK_NO_CONNECTION = 2;
- /**
+ /**
* The download exceeds the maximum size for this network.
*/
- public static final int NETWORK_UNUSABLE_DUE_TO_SIZE = 3;
+ public static final int NETWORK_UNUSABLE_DUE_TO_SIZE = 3;
- /**
+ /**
* The download exceeds the recommended maximum size for this network, the
* user must confirm for this download to proceed without WiFi.
*/
- public static final int NETWORK_RECOMMENDED_UNUSABLE_DUE_TO_SIZE = 4;
+ public static final int NETWORK_RECOMMENDED_UNUSABLE_DUE_TO_SIZE = 4;
- /**
+ /**
* The current connection is roaming, and the download can't proceed over a
* roaming connection.
*/
- public static final int NETWORK_CANNOT_USE_ROAMING = 5;
+ public static final int NETWORK_CANNOT_USE_ROAMING = 5;
- /**
+ /**
* The app requesting the download specific that it can't use the current
* network connection.
*/
- public static final int NETWORK_TYPE_DISALLOWED_BY_REQUESTOR = 6;
+ public static final int NETWORK_TYPE_DISALLOWED_BY_REQUESTOR = 6;
- /**
+ /**
* For intents used to notify the user that a download exceeds a size
* threshold, if this extra is true, WiFi is required for this download
* size; otherwise, it is only recommended.
*/
- public static final String EXTRA_IS_WIFI_REQUIRED = "isWifiRequired";
- public static final String EXTRA_FILE_NAME = "downloadId";
+ public static final String EXTRA_IS_WIFI_REQUIRED = "isWifiRequired";
+ public static final String EXTRA_FILE_NAME = "downloadId";
- /**
+ /**
* Used with DOWNLOAD_STATUS
*/
- public static final String EXTRA_STATUS_STATE = "ESS";
- public static final String EXTRA_STATUS_TOTAL_SIZE = "ETS";
- public static final String EXTRA_STATUS_CURRENT_FILE_SIZE = "CFS";
- public static final String EXTRA_STATUS_TOTAL_PROGRESS = "TFP";
- public static final String EXTRA_STATUS_CURRENT_PROGRESS = "CFP";
+ public static final String EXTRA_STATUS_STATE = "ESS";
+ public static final String EXTRA_STATUS_TOTAL_SIZE = "ETS";
+ public static final String EXTRA_STATUS_CURRENT_FILE_SIZE = "CFS";
+ public static final String EXTRA_STATUS_TOTAL_PROGRESS = "TFP";
+ public static final String EXTRA_STATUS_CURRENT_PROGRESS = "CFP";
- public static final String ACTION_DOWNLOADS_CHANGED = "downloadsChanged";
+ public static final String ACTION_DOWNLOADS_CHANGED = "downloadsChanged";
- /**
+ /**
* Broadcast intent action sent by the download manager when a download
* completes.
*/
- public final static String ACTION_DOWNLOAD_COMPLETE = "lvldownloader.intent.action.DOWNLOAD_COMPLETE";
+ public final static String ACTION_DOWNLOAD_COMPLETE = "lvldownloader.intent.action.DOWNLOAD_COMPLETE";
- /**
+ /**
* Broadcast intent action sent by the download manager when download status
* changes.
*/
- public final static String ACTION_DOWNLOAD_STATUS = "lvldownloader.intent.action.DOWNLOAD_STATUS";
+ public final static String ACTION_DOWNLOAD_STATUS = "lvldownloader.intent.action.DOWNLOAD_STATUS";
- /*
+ /*
* Lists the states that the download manager can set on a download to
* notify applications of the download progress. The codes follow the HTTP
* families:<br> 1xx: informational<br> 2xx: success<br> 3xx: redirects (not
@@ -145,130 +148,131 @@ public abstract class DownloaderService extends CustomIntentService implements I
* errors
*/
- /**
+ /**
* Returns whether the status is informational (i.e. 1xx).
*/
- public static boolean isStatusInformational(int status) {
- return (status >= 100 && status < 200);
- }
+ public static boolean isStatusInformational(int status) {
+ return (status >= 100 && status < 200);
+ }
- /**
+ /**
* Returns whether the status is a success (i.e. 2xx).
*/
- public static boolean isStatusSuccess(int status) {
- return (status >= 200 && status < 300);
- }
+ public static boolean isStatusSuccess(int status) {
+ return (status >= 200 && status < 300);
+ }
- /**
+ /**
* Returns whether the status is an error (i.e. 4xx or 5xx).
*/
- public static boolean isStatusError(int status) {
- return (status >= 400 && status < 600);
- }
+ public static boolean isStatusError(int status) {
+ return (status >= 400 && status < 600);
+ }
- /**
+ /**
* Returns whether the status is a client error (i.e. 4xx).
*/
- public static boolean isStatusClientError(int status) {
- return (status >= 400 && status < 500);
- }
+ public static boolean isStatusClientError(int status) {
+ return (status >= 400 && status < 500);
+ }
- /**
+ /**
* Returns whether the status is a server error (i.e. 5xx).
*/
- public static boolean isStatusServerError(int status) {
- return (status >= 500 && status < 600);
- }
+ public static boolean isStatusServerError(int status) {
+ return (status >= 500 && status < 600);
+ }
- /**
+ /**
* Returns whether the download has completed (either with success or
* error).
*/
- public static boolean isStatusCompleted(int status) {
- return (status >= 200 && status < 300) || (status >= 400 && status < 600);
- }
+ public static boolean isStatusCompleted(int status) {
+ return (status >= 200 && status < 300)
+ || (status >= 400 && status < 600);
+ }
- /**
+ /**
* This download hasn't stated yet
*/
- public static final int STATUS_PENDING = 190;
+ public static final int STATUS_PENDING = 190;
- /**
+ /**
* This download has started
*/
- public static final int STATUS_RUNNING = 192;
+ public static final int STATUS_RUNNING = 192;
- /**
+ /**
* This download has been paused by the owning app.
*/
- public static final int STATUS_PAUSED_BY_APP = 193;
+ public static final int STATUS_PAUSED_BY_APP = 193;
- /**
+ /**
* This download encountered some network error and is waiting before
* retrying the request.
*/
- public static final int STATUS_WAITING_TO_RETRY = 194;
+ public static final int STATUS_WAITING_TO_RETRY = 194;
- /**
+ /**
* This download is waiting for network connectivity to proceed.
*/
- public static final int STATUS_WAITING_FOR_NETWORK = 195;
+ public static final int STATUS_WAITING_FOR_NETWORK = 195;
- /**
+ /**
* This download is waiting for a Wi-Fi connection to proceed or for
* permission to download over cellular.
*/
- public static final int STATUS_QUEUED_FOR_WIFI_OR_CELLULAR_PERMISSION = 196;
+ public static final int STATUS_QUEUED_FOR_WIFI_OR_CELLULAR_PERMISSION = 196;
- /**
+ /**
* This download is waiting for a Wi-Fi connection to proceed.
*/
- public static final int STATUS_QUEUED_FOR_WIFI = 197;
+ public static final int STATUS_QUEUED_FOR_WIFI = 197;
- /**
+ /**
* This download has successfully completed. Warning: there might be other
* status values that indicate success in the future. Use isSucccess() to
* capture the entire category.
*
* @hide
*/
- public static final int STATUS_SUCCESS = 200;
+ public static final int STATUS_SUCCESS = 200;
- /**
+ /**
* The requested URL is no longer available
*/
- public static final int STATUS_FORBIDDEN = 403;
+ public static final int STATUS_FORBIDDEN = 403;
- /**
+ /**
* The file was delivered incorrectly
*/
- public static final int STATUS_FILE_DELIVERED_INCORRECTLY = 487;
+ public static final int STATUS_FILE_DELIVERED_INCORRECTLY = 487;
- /**
+ /**
* The requested destination file already exists.
*/
- public static final int STATUS_FILE_ALREADY_EXISTS_ERROR = 488;
+ public static final int STATUS_FILE_ALREADY_EXISTS_ERROR = 488;
- /**
+ /**
* Some possibly transient error occurred, but we can't resume the download.
*/
- public static final int STATUS_CANNOT_RESUME = 489;
+ public static final int STATUS_CANNOT_RESUME = 489;
- /**
+ /**
* This download was canceled
*
* @hide
*/
- public static final int STATUS_CANCELED = 490;
+ public static final int STATUS_CANCELED = 490;
- /**
+ /**
* This download has completed with an error. Warning: there will be other
* status values that indicate errors in the future. Use isStatusError() to
* capture the entire category.
*/
- public static final int STATUS_UNKNOWN_ERROR = 491;
+ public static final int STATUS_UNKNOWN_ERROR = 491;
- /**
+ /**
* This download couldn't be completed because of a storage issue.
* Typically, that's because the filesystem is missing or full. Use the more
* specific {@link #STATUS_INSUFFICIENT_SPACE_ERROR} and
@@ -276,367 +280,372 @@ public abstract class DownloaderService extends CustomIntentService implements I
*
* @hide
*/
- public static final int STATUS_FILE_ERROR = 492;
+ public static final int STATUS_FILE_ERROR = 492;
- /**
+ /**
* This download couldn't be completed because of an HTTP redirect response
* that the download manager couldn't handle.
*
* @hide
*/
- public static final int STATUS_UNHANDLED_REDIRECT = 493;
+ public static final int STATUS_UNHANDLED_REDIRECT = 493;
- /**
+ /**
* This download couldn't be completed because of an unspecified unhandled
* HTTP code.
*
* @hide
*/
- public static final int STATUS_UNHANDLED_HTTP_CODE = 494;
+ public static final int STATUS_UNHANDLED_HTTP_CODE = 494;
- /**
+ /**
* This download couldn't be completed because of an error receiving or
* processing data at the HTTP level.
*
* @hide
*/
- public static final int STATUS_HTTP_DATA_ERROR = 495;
+ public static final int STATUS_HTTP_DATA_ERROR = 495;
- /**
+ /**
* This download couldn't be completed because of an HttpException while
* setting up the request.
*
* @hide
*/
- public static final int STATUS_HTTP_EXCEPTION = 496;
+ public static final int STATUS_HTTP_EXCEPTION = 496;
- /**
+ /**
* This download couldn't be completed because there were too many
* redirects.
*
* @hide
*/
- public static final int STATUS_TOO_MANY_REDIRECTS = 497;
+ public static final int STATUS_TOO_MANY_REDIRECTS = 497;
- /**
+ /**
* This download couldn't be completed due to insufficient storage space.
* Typically, this is because the SD card is full.
*
* @hide
*/
- public static final int STATUS_INSUFFICIENT_SPACE_ERROR = 498;
+ public static final int STATUS_INSUFFICIENT_SPACE_ERROR = 498;
- /**
+ /**
* This download couldn't be completed because no external storage device
* was found. Typically, this is because the SD card is not mounted.
*
* @hide
*/
- public static final int STATUS_DEVICE_NOT_FOUND_ERROR = 499;
+ public static final int STATUS_DEVICE_NOT_FOUND_ERROR = 499;
- /**
+ /**
* This download is allowed to run.
*
* @hide
*/
- public static final int CONTROL_RUN = 0;
+ public static final int CONTROL_RUN = 0;
- /**
+ /**
* This download must pause at the first opportunity.
*
* @hide
*/
- public static final int CONTROL_PAUSED = 1;
+ public static final int CONTROL_PAUSED = 1;
- /**
+ /**
* This download is visible but only shows in the notifications while it's
* in progress.
*
* @hide
*/
- public static final int VISIBILITY_VISIBLE = 0;
+ public static final int VISIBILITY_VISIBLE = 0;
- /**
+ /**
* This download is visible and shows in the notifications while in progress
* and after completion.
*
* @hide
*/
- public static final int VISIBILITY_VISIBLE_NOTIFY_COMPLETED = 1;
+ public static final int VISIBILITY_VISIBLE_NOTIFY_COMPLETED = 1;
- /**
+ /**
* This download doesn't show in the UI or in the notifications.
*
* @hide
*/
- public static final int VISIBILITY_HIDDEN = 2;
+ public static final int VISIBILITY_HIDDEN = 2;
- /**
+ /**
* Bit flag for setAllowedNetworkTypes corresponding to
* {@link ConnectivityManager#TYPE_MOBILE}.
*/
- public static final int NETWORK_MOBILE = 1 << 0;
+ public static final int NETWORK_MOBILE = 1 << 0;
- /**
+ /**
* Bit flag for setAllowedNetworkTypes corresponding to
* {@link ConnectivityManager#TYPE_WIFI}.
*/
- public static final int NETWORK_WIFI = 1 << 1;
+ public static final int NETWORK_WIFI = 1 << 1;
- private final static String TEMP_EXT = ".tmp";
+ private final static String TEMP_EXT = ".tmp";
- /**
+ /**
* Service thread status
*/
- private static boolean sIsRunning;
+ private static boolean sIsRunning;
- @Override
- public IBinder onBind(Intent paramIntent) {
- Log.d(Constants.TAG, "Service Bound");
- return this.mServiceMessenger.getBinder();
- }
+ @Override
+ public IBinder onBind(Intent paramIntent) {
+ Log.d(Constants.TAG, "Service Bound");
+ return this.mServiceMessenger.getBinder();
+ }
- /**
+ /**
* Network state.
*/
- private boolean mIsConnected;
- private boolean mIsFailover;
- private boolean mIsCellularConnection;
- private boolean mIsRoaming;
- private boolean mIsAtLeast3G;
- private boolean mIsAtLeast4G;
- private boolean mStateChanged;
+ private boolean mIsConnected;
+ private boolean mIsFailover;
+ private boolean mIsCellularConnection;
+ private boolean mIsRoaming;
+ private boolean mIsAtLeast3G;
+ private boolean mIsAtLeast4G;
+ private boolean mStateChanged;
- /**
+ /**
* Download state
*/
- private int mControl;
- private int mStatus;
+ private int mControl;
+ private int mStatus;
- public boolean isWiFi() {
- return mIsConnected && !mIsCellularConnection;
- }
+ public boolean isWiFi() {
+ return mIsConnected && !mIsCellularConnection;
+ }
- /**
+ /**
* Bindings to important services
*/
- private ConnectivityManager mConnectivityManager;
- private WifiManager mWifiManager;
+ private ConnectivityManager mConnectivityManager;
+ private WifiManager mWifiManager;
- /**
+ /**
* Package we are downloading for (defaults to package of application)
*/
- private PackageInfo mPackageInfo;
+ private PackageInfo mPackageInfo;
- /**
+ /**
* Byte counts
*/
- long mBytesSoFar;
- long mTotalLength;
- int mFileCount;
+ long mBytesSoFar;
+ long mTotalLength;
+ int mFileCount;
- /**
+ /**
* Used for calculating time remaining and speed
*/
- long mBytesAtSample;
- long mMillisecondsAtSample;
- float mAverageDownloadSpeed;
+ long mBytesAtSample;
+ long mMillisecondsAtSample;
+ float mAverageDownloadSpeed;
- /**
+ /**
* Our binding to the network state broadcasts
*/
- private BroadcastReceiver mConnReceiver;
- final private IStub mServiceStub = DownloaderServiceMarshaller.CreateStub(this);
- final private Messenger mServiceMessenger = mServiceStub.getMessenger();
- private Messenger mClientMessenger;
- private DownloadNotification mNotification;
- private PendingIntent mPendingIntent;
- private PendingIntent mAlarmIntent;
+ private BroadcastReceiver mConnReceiver;
+ final private IStub mServiceStub = DownloaderServiceMarshaller.CreateStub(this);
+ final private Messenger mServiceMessenger = mServiceStub.getMessenger();
+ private Messenger mClientMessenger;
+ private DownloadNotification mNotification;
+ private PendingIntent mPendingIntent;
+ private PendingIntent mAlarmIntent;
- /**
+ /**
* Updates the network type based upon the type and subtype returned from
* the connectivity manager. Subtype is only used for cellular signals.
*
* @param type
* @param subType
*/
- private void updateNetworkType(int type, int subType) {
- switch (type) {
- case ConnectivityManager.TYPE_WIFI:
- case ConnectivityManager.TYPE_ETHERNET:
- case ConnectivityManager.TYPE_BLUETOOTH:
- mIsCellularConnection = false;
- mIsAtLeast3G = false;
- mIsAtLeast4G = false;
- break;
- case ConnectivityManager.TYPE_WIMAX:
- mIsCellularConnection = true;
- mIsAtLeast3G = true;
- mIsAtLeast4G = true;
- break;
- case ConnectivityManager.TYPE_MOBILE:
- mIsCellularConnection = true;
- switch (subType) {
- case TelephonyManager.NETWORK_TYPE_1xRTT:
- case TelephonyManager.NETWORK_TYPE_CDMA:
- case TelephonyManager.NETWORK_TYPE_EDGE:
- case TelephonyManager.NETWORK_TYPE_GPRS:
- case TelephonyManager.NETWORK_TYPE_IDEN:
- mIsAtLeast3G = false;
- mIsAtLeast4G = false;
- break;
- case TelephonyManager.NETWORK_TYPE_HSDPA:
- case TelephonyManager.NETWORK_TYPE_HSUPA:
- case TelephonyManager.NETWORK_TYPE_HSPA:
- case TelephonyManager.NETWORK_TYPE_EVDO_0:
- case TelephonyManager.NETWORK_TYPE_EVDO_A:
- case TelephonyManager.NETWORK_TYPE_UMTS:
- mIsAtLeast3G = true;
- mIsAtLeast4G = false;
- break;
- case TelephonyManager.NETWORK_TYPE_LTE: // 4G
- case TelephonyManager.NETWORK_TYPE_EHRPD: // 3G ++ interop
- // with 4G
- case TelephonyManager.NETWORK_TYPE_HSPAP: // 3G ++ but
- // marketed as
- // 4G
- mIsAtLeast3G = true;
- mIsAtLeast4G = true;
- break;
- default:
- mIsCellularConnection = false;
- mIsAtLeast3G = false;
- mIsAtLeast4G = false;
- }
- }
- }
-
- private void updateNetworkState(NetworkInfo info) {
- boolean isConnected = mIsConnected;
- boolean isFailover = mIsFailover;
- boolean isCellularConnection = mIsCellularConnection;
- boolean isRoaming = mIsRoaming;
- boolean isAtLeast3G = mIsAtLeast3G;
- if (null != info) {
- mIsRoaming = info.isRoaming();
- mIsFailover = info.isFailover();
- mIsConnected = info.isConnected();
- updateNetworkType(info.getType(), info.getSubtype());
- } else {
- mIsRoaming = false;
- mIsFailover = false;
- mIsConnected = false;
- updateNetworkType(-1, -1);
- }
- mStateChanged = (mStateChanged || isConnected != mIsConnected || isFailover != mIsFailover || isCellularConnection != mIsCellularConnection || isRoaming != mIsRoaming || isAtLeast3G != mIsAtLeast3G);
- if (Constants.LOGVV) {
- if (mStateChanged) {
- Log.v(LOG_TAG, "Network state changed: ");
- Log.v(LOG_TAG, "Starting State: " +
- (isConnected ? "Connected " : "Not Connected ") +
- (isCellularConnection ? "Cellular " : "WiFi ") +
- (isRoaming ? "Roaming " : "Local ") +
- (isAtLeast3G ? "3G+ " : "<3G "));
- Log.v(LOG_TAG, "Ending State: " +
- (mIsConnected ? "Connected " : "Not Connected ") +
- (mIsCellularConnection ? "Cellular " : "WiFi ") +
- (mIsRoaming ? "Roaming " : "Local ") +
- (mIsAtLeast3G ? "3G+ " : "<3G "));
-
- if (isServiceRunning()) {
- if (mIsRoaming) {
- mStatus = STATUS_WAITING_FOR_NETWORK;
- mControl = CONTROL_PAUSED;
- } else if (mIsCellularConnection) {
- DownloadsDB db = DownloadsDB.getDB(this);
- int flags = db.getFlags();
- if (0 == (flags & FLAGS_DOWNLOAD_OVER_CELLULAR)) {
- mStatus = STATUS_QUEUED_FOR_WIFI;
- mControl = CONTROL_PAUSED;
- }
- }
- }
- }
- }
- }
-
- /**
+ private void updateNetworkType(int type, int subType) {
+ switch (type) {
+ case ConnectivityManager.TYPE_WIFI:
+ case ConnectivityManager.TYPE_ETHERNET:
+ case ConnectivityManager.TYPE_BLUETOOTH:
+ mIsCellularConnection = false;
+ mIsAtLeast3G = false;
+ mIsAtLeast4G = false;
+ break;
+ case ConnectivityManager.TYPE_WIMAX:
+ mIsCellularConnection = true;
+ mIsAtLeast3G = true;
+ mIsAtLeast4G = true;
+ break;
+ case ConnectivityManager.TYPE_MOBILE:
+ mIsCellularConnection = true;
+ switch (subType) {
+ case TelephonyManager.NETWORK_TYPE_1xRTT:
+ case TelephonyManager.NETWORK_TYPE_CDMA:
+ case TelephonyManager.NETWORK_TYPE_EDGE:
+ case TelephonyManager.NETWORK_TYPE_GPRS:
+ case TelephonyManager.NETWORK_TYPE_IDEN:
+ mIsAtLeast3G = false;
+ mIsAtLeast4G = false;
+ break;
+ case TelephonyManager.NETWORK_TYPE_HSDPA:
+ case TelephonyManager.NETWORK_TYPE_HSUPA:
+ case TelephonyManager.NETWORK_TYPE_HSPA:
+ case TelephonyManager.NETWORK_TYPE_EVDO_0:
+ case TelephonyManager.NETWORK_TYPE_EVDO_A:
+ case TelephonyManager.NETWORK_TYPE_UMTS:
+ mIsAtLeast3G = true;
+ mIsAtLeast4G = false;
+ break;
+ case TelephonyManager.NETWORK_TYPE_LTE: // 4G
+ case TelephonyManager.NETWORK_TYPE_EHRPD: // 3G ++ interop
+ // with 4G
+ case TelephonyManager.NETWORK_TYPE_HSPAP: // 3G ++ but
+ // marketed as
+ // 4G
+ mIsAtLeast3G = true;
+ mIsAtLeast4G = true;
+ break;
+ default:
+ mIsCellularConnection = false;
+ mIsAtLeast3G = false;
+ mIsAtLeast4G = false;
+ }
+ }
+ }
+
+ private void updateNetworkState(NetworkInfo info) {
+ boolean isConnected = mIsConnected;
+ boolean isFailover = mIsFailover;
+ boolean isCellularConnection = mIsCellularConnection;
+ boolean isRoaming = mIsRoaming;
+ boolean isAtLeast3G = mIsAtLeast3G;
+ if (null != info) {
+ mIsRoaming = info.isRoaming();
+ mIsFailover = info.isFailover();
+ mIsConnected = info.isConnected();
+ updateNetworkType(info.getType(), info.getSubtype());
+ } else {
+ mIsRoaming = false;
+ mIsFailover = false;
+ mIsConnected = false;
+ updateNetworkType(-1, -1);
+ }
+ mStateChanged = (mStateChanged || isConnected != mIsConnected
+ || isFailover != mIsFailover
+ || isCellularConnection != mIsCellularConnection
+ || isRoaming != mIsRoaming || isAtLeast3G != mIsAtLeast3G);
+ if (Constants.LOGVV) {
+ if (mStateChanged) {
+ Log.v(LOG_TAG, "Network state changed: ");
+ Log.v(LOG_TAG, "Starting State: " +
+ (isConnected ? "Connected " : "Not Connected ") +
+ (isCellularConnection ? "Cellular " : "WiFi ") +
+ (isRoaming ? "Roaming " : "Local ") +
+ (isAtLeast3G ? "3G+ " : "<3G "));
+ Log.v(LOG_TAG, "Ending State: " +
+ (mIsConnected ? "Connected " : "Not Connected ") +
+ (mIsCellularConnection ? "Cellular " : "WiFi ") +
+ (mIsRoaming ? "Roaming " : "Local ") +
+ (mIsAtLeast3G ? "3G+ " : "<3G "));
+
+ if (isServiceRunning()) {
+ if (mIsRoaming) {
+ mStatus = STATUS_WAITING_FOR_NETWORK;
+ mControl = CONTROL_PAUSED;
+ } else if (mIsCellularConnection) {
+ DownloadsDB db = DownloadsDB.getDB(this);
+ int flags = db.getFlags();
+ if (0 == (flags & FLAGS_DOWNLOAD_OVER_CELLULAR)) {
+ mStatus = STATUS_QUEUED_FOR_WIFI;
+ mControl = CONTROL_PAUSED;
+ }
+ }
+ }
+
+ }
+ }
+ }
+
+ /**
* Polls the network state, setting the flags appropriately.
*/
- void pollNetworkState() {
- if (null == mConnectivityManager) {
- mConnectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
- }
- if (null == mWifiManager) {
- mWifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
- }
- if (mConnectivityManager == null) {
- Log.w(Constants.TAG,
- "couldn't get connectivity manager to poll network state");
- } else {
- @SuppressLint("MissingPermission")
- NetworkInfo activeInfo = mConnectivityManager
- .getActiveNetworkInfo();
- updateNetworkState(activeInfo);
- }
- }
-
- public static final int NO_DOWNLOAD_REQUIRED = 0;
- public static final int LVL_CHECK_REQUIRED = 1;
- public static final int DOWNLOAD_REQUIRED = 2;
-
- public static final String EXTRA_PACKAGE_NAME = "EPN";
- public static final String EXTRA_PENDING_INTENT = "EPI";
- public static final String EXTRA_MESSAGE_HANDLER = "EMH";
-
- /**
+ void pollNetworkState() {
+ if (null == mConnectivityManager) {
+ mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
+ }
+ if (null == mWifiManager) {
+ mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+ }
+ if (mConnectivityManager == null) {
+ Log.w(Constants.TAG,
+ "couldn't get connectivity manager to poll network state");
+ } else {
+ @SuppressLint("MissingPermission")
+ NetworkInfo activeInfo = mConnectivityManager
+ .getActiveNetworkInfo();
+ updateNetworkState(activeInfo);
+ }
+ }
+
+ public static final int NO_DOWNLOAD_REQUIRED = 0;
+ public static final int LVL_CHECK_REQUIRED = 1;
+ public static final int DOWNLOAD_REQUIRED = 2;
+
+ public static final String EXTRA_PACKAGE_NAME = "EPN";
+ public static final String EXTRA_PENDING_INTENT = "EPI";
+ public static final String EXTRA_MESSAGE_HANDLER = "EMH";
+
+ /**
* Returns true if the LVL check is required
*
* @param db a downloads DB synchronized with the latest state
* @param pi the package info for the project
* @return returns true if the filenames need to be returned
*/
- private static boolean isLVLCheckRequired(DownloadsDB db, PackageInfo pi) {
- // we need to update the LVL check and get a successful status to
- // proceed
- if (db.mVersionCode != pi.versionCode) {
- return true;
- }
- return false;
- }
+ private static boolean isLVLCheckRequired(DownloadsDB db, PackageInfo pi) {
+ // we need to update the LVL check and get a successful status to
+ // proceed
+ if (db.mVersionCode != pi.versionCode) {
+ return true;
+ }
+ return false;
+ }
- /**
+ /**
* Careful! Only use this internally.
*
* @return whether we think the service is running
*/
- private static synchronized boolean isServiceRunning() {
- return sIsRunning;
- }
-
- private static synchronized void setServiceRunning(boolean isRunning) {
- sIsRunning = isRunning;
- }
-
- public static int startDownloadServiceIfRequired(Context context,
- Intent intent, Class<?> serviceClass) throws NameNotFoundException {
- final PendingIntent pendingIntent = (PendingIntent)intent
- .getParcelableExtra(EXTRA_PENDING_INTENT);
- return startDownloadServiceIfRequired(context, pendingIntent,
- serviceClass);
- }
-
- public static int startDownloadServiceIfRequired(Context context,
- PendingIntent pendingIntent, Class<?> serviceClass)
- throws NameNotFoundException {
- String packageName = context.getPackageName();
- String className = serviceClass.getName();
-
- return startDownloadServiceIfRequired(context, pendingIntent,
- packageName, className);
- }
-
- /**
+ private static synchronized boolean isServiceRunning() {
+ return sIsRunning;
+ }
+
+ private static synchronized void setServiceRunning(boolean isRunning) {
+ sIsRunning = isRunning;
+ }
+
+ public static int startDownloadServiceIfRequired(Context context,
+ Intent intent, Class<?> serviceClass) throws NameNotFoundException {
+ final PendingIntent pendingIntent = (PendingIntent) intent
+ .getParcelableExtra(EXTRA_PENDING_INTENT);
+ return startDownloadServiceIfRequired(context, pendingIntent,
+ serviceClass);
+ }
+
+ public static int startDownloadServiceIfRequired(Context context,
+ PendingIntent pendingIntent, Class<?> serviceClass)
+ throws NameNotFoundException
+ {
+ String packageName = context.getPackageName();
+ String className = serviceClass.getName();
+
+ return startDownloadServiceIfRequired(context, pendingIntent,
+ packageName, className);
+ }
+
+ /**
* Starts the download if necessary. This function starts a flow that does `
* many things. 1) Checks to see if the APK version has been checked and the
* metadata database updated 2) If the APK version does not match, checks
@@ -655,246 +664,254 @@ public abstract class DownloaderService extends CustomIntentService implements I
* downloader, false if the app can continue
* @throws NameNotFoundException
*/
- public static int startDownloadServiceIfRequired(Context context,
- PendingIntent pendingIntent, String classPackage, String className)
- throws NameNotFoundException {
- // first: do we need to do an LVL update?
- // we begin by getting our APK version from the package manager
- final PackageInfo pi = context.getPackageManager().getPackageInfo(
- context.getPackageName(), 0);
-
- int status = NO_DOWNLOAD_REQUIRED;
-
- // the database automatically reads the metadata for version code
- // and download status when the instance is created
- DownloadsDB db = DownloadsDB.getDB(context);
-
- // we need to update the LVL check and get a successful status to
- // proceed
- if (isLVLCheckRequired(db, pi)) {
- status = LVL_CHECK_REQUIRED;
- }
- // we don't have to update LVL. do we still have a download to start?
- if (db.mStatus == 0) {
- DownloadInfo[] infos = db.getDownloads();
- if (null != infos) {
- for (DownloadInfo info : infos) {
- if (!Helpers.doesFileExist(context, info.mFileName, info.mTotalBytes, true)) {
- status = DOWNLOAD_REQUIRED;
- db.updateStatus(-1);
- break;
- }
- }
- }
- } else {
- status = DOWNLOAD_REQUIRED;
- }
- switch (status) {
- case DOWNLOAD_REQUIRED:
- case LVL_CHECK_REQUIRED:
- Intent fileIntent = new Intent();
- fileIntent.setClassName(classPackage, className);
- fileIntent.putExtra(EXTRA_PENDING_INTENT, pendingIntent);
- context.startService(fileIntent);
- break;
- }
- return status;
- }
-
- @Override
- public void requestAbortDownload() {
- mControl = CONTROL_PAUSED;
- mStatus = STATUS_CANCELED;
- }
-
- @Override
- public void requestPauseDownload() {
- mControl = CONTROL_PAUSED;
- mStatus = STATUS_PAUSED_BY_APP;
- }
-
- @Override
- public void setDownloadFlags(int flags) {
- DownloadsDB.getDB(this).updateFlags(flags);
- }
-
- @Override
- public void requestContinueDownload() {
- if (mControl == CONTROL_PAUSED) {
- mControl = CONTROL_RUN;
- }
- Intent fileIntent = new Intent(this, this.getClass());
- fileIntent.putExtra(EXTRA_PENDING_INTENT, mPendingIntent);
- this.startService(fileIntent);
- }
-
- public abstract String getPublicKey();
-
- public abstract byte[] getSALT();
-
- public abstract String getAlarmReceiverClassName();
-
- private class LVLRunnable implements Runnable {
- LVLRunnable(Context context, PendingIntent intent) {
- mContext = context;
- mPendingIntent = intent;
- }
-
- final Context mContext;
-
- @Override
- public void run() {
- setServiceRunning(true);
- mNotification.onDownloadStateChanged(IDownloaderClient.STATE_FETCHING_URL);
- String deviceId = Secure.ANDROID_ID;
-
- final APKExpansionPolicy aep = new APKExpansionPolicy(mContext,
- new AESObfuscator(getSALT(), mContext.getPackageName(), deviceId));
-
- // reset our policy back to the start of the world to force a
- // re-check
- aep.resetPolicy();
-
- // let's try and get the OBB file from LVL first
- // Construct the LicenseChecker with a Policy.
- final LicenseChecker checker = new LicenseChecker(mContext, aep,
- getPublicKey() // Your public licensing key.
- );
- checker.checkAccess(new LicenseCheckerCallback() {
- @Override
- public void allow(int reason) {
- try {
- int count = aep.getExpansionURLCount();
- DownloadsDB db = DownloadsDB.getDB(mContext);
- int status = 0;
- if (count != 0) {
- for (int i = 0; i < count; i++) {
- String currentFileName = aep
- .getExpansionFileName(i);
- if (null != currentFileName) {
- DownloadInfo di = new DownloadInfo(i,
- currentFileName, mContext.getPackageName());
-
- long fileSize = aep.getExpansionFileSize(i);
- if (handleFileUpdated(db, i, currentFileName,
- fileSize)) {
- status |= -1;
- di.resetDownload();
- di.mUri = aep.getExpansionURL(i);
- di.mTotalBytes = fileSize;
- di.mStatus = status;
- db.updateDownload(di);
- } else {
- // we need to read the download
- // information
- // from
- // the database
- DownloadInfo dbdi = db
- .getDownloadInfoByFileName(di.mFileName);
- if (null == dbdi) {
- // the file exists already and is
- // the
- // correct size
- // was delivered by Market or
- // through
- // another mechanism
- Log.d(LOG_TAG, "file " + di.mFileName + " found. Not downloading.");
- di.mStatus = STATUS_SUCCESS;
- di.mTotalBytes = fileSize;
- di.mCurrentBytes = fileSize;
- di.mUri = aep.getExpansionURL(i);
- db.updateDownload(di);
- } else if (dbdi.mStatus != STATUS_SUCCESS) {
- // we just update the URL
- dbdi.mUri = aep.getExpansionURL(i);
- db.updateDownload(dbdi);
- status |= -1;
- }
- }
- }
- }
- }
- // first: do we need to do an LVL update?
- // we begin by getting our APK version from the package
- // manager
- PackageInfo pi;
- try {
- pi = mContext.getPackageManager().getPackageInfo(
- mContext.getPackageName(), 0);
- db.updateMetadata(pi.versionCode, status);
- Class<?> serviceClass = DownloaderService.this.getClass();
- switch (startDownloadServiceIfRequired(mContext, mPendingIntent,
- serviceClass)) {
- case NO_DOWNLOAD_REQUIRED:
- mNotification
- .onDownloadStateChanged(IDownloaderClient.STATE_COMPLETED);
- break;
- case LVL_CHECK_REQUIRED:
- // DANGER WILL ROBINSON!
- Log.e(LOG_TAG, "In LVL checking loop!");
- mNotification
- .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_UNLICENSED);
- throw new RuntimeException(
- "Error with LVL checking and database integrity");
- case DOWNLOAD_REQUIRED:
- // do nothing. the download will notify the
- // application
- // when things are done
- break;
- }
- } catch (NameNotFoundException e1) {
- e1.printStackTrace();
- throw new RuntimeException(
- "Error with getting information from package name");
- }
- } finally {
- setServiceRunning(false);
- }
- }
-
- @Override
- public void dontAllow(int reason) {
- try {
- switch (reason) {
- case Policy.NOT_LICENSED:
- mNotification
- .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_UNLICENSED);
- break;
- case Policy.RETRY:
- mNotification
- .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_FETCHING_URL);
- break;
- }
- } finally {
- setServiceRunning(false);
- }
- }
-
- @Override
- public void applicationError(int errorCode) {
- try {
- mNotification
- .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_FETCHING_URL);
- } finally {
- setServiceRunning(false);
- }
- }
- });
- }
- };
-
- /**
+ public static int startDownloadServiceIfRequired(Context context,
+ PendingIntent pendingIntent, String classPackage, String className)
+ throws NameNotFoundException {
+ // first: do we need to do an LVL update?
+ // we begin by getting our APK version from the package manager
+ final PackageInfo pi = context.getPackageManager().getPackageInfo(
+ context.getPackageName(), 0);
+
+ int status = NO_DOWNLOAD_REQUIRED;
+
+ // the database automatically reads the metadata for version code
+ // and download status when the instance is created
+ DownloadsDB db = DownloadsDB.getDB(context);
+
+ // we need to update the LVL check and get a successful status to
+ // proceed
+ if (isLVLCheckRequired(db, pi)) {
+ status = LVL_CHECK_REQUIRED;
+ }
+ // we don't have to update LVL. do we still have a download to start?
+ if (db.mStatus == 0) {
+ DownloadInfo[] infos = db.getDownloads();
+ if (null != infos) {
+ for (DownloadInfo info : infos) {
+ if (!Helpers.doesFileExist(context, info.mFileName, info.mTotalBytes, true)) {
+ status = DOWNLOAD_REQUIRED;
+ db.updateStatus(-1);
+ break;
+ }
+ }
+ }
+ } else {
+ status = DOWNLOAD_REQUIRED;
+ }
+ switch (status) {
+ case DOWNLOAD_REQUIRED:
+ case LVL_CHECK_REQUIRED:
+ Intent fileIntent = new Intent();
+ fileIntent.setClassName(classPackage, className);
+ fileIntent.putExtra(EXTRA_PENDING_INTENT, pendingIntent);
+ context.startService(fileIntent);
+ break;
+ }
+ return status;
+ }
+
+ @Override
+ public void requestAbortDownload() {
+ mControl = CONTROL_PAUSED;
+ mStatus = STATUS_CANCELED;
+ }
+
+ @Override
+ public void requestPauseDownload() {
+ mControl = CONTROL_PAUSED;
+ mStatus = STATUS_PAUSED_BY_APP;
+ }
+
+ @Override
+ public void setDownloadFlags(int flags) {
+ DownloadsDB.getDB(this).updateFlags(flags);
+ }
+
+ @Override
+ public void requestContinueDownload() {
+ if (mControl == CONTROL_PAUSED) {
+ mControl = CONTROL_RUN;
+ }
+ Intent fileIntent = new Intent(this, this.getClass());
+ fileIntent.putExtra(EXTRA_PENDING_INTENT, mPendingIntent);
+ this.startService(fileIntent);
+ }
+
+ public abstract String getPublicKey();
+
+ public abstract byte[] getSALT();
+
+ public abstract String getAlarmReceiverClassName();
+
+ private class LVLRunnable implements Runnable {
+ LVLRunnable(Context context, PendingIntent intent) {
+ mContext = context;
+ mPendingIntent = intent;
+ }
+
+ final Context mContext;
+
+ @Override
+ public void run() {
+ setServiceRunning(true);
+ mNotification.onDownloadStateChanged(IDownloaderClient.STATE_FETCHING_URL);
+ String deviceId = Secure.getString(mContext.getContentResolver(),
+ Secure.ANDROID_ID);
+
+ final APKExpansionPolicy aep = new APKExpansionPolicy(mContext,
+ new AESObfuscator(getSALT(), mContext.getPackageName(), deviceId));
+
+ // reset our policy back to the start of the world to force a
+ // re-check
+ aep.resetPolicy();
+
+ // let's try and get the OBB file from LVL first
+ // Construct the LicenseChecker with a Policy.
+ final LicenseChecker checker = new LicenseChecker(mContext, aep,
+ getPublicKey() // Your public licensing key.
+ );
+ checker.checkAccess(new LicenseCheckerCallback() {
+
+ @Override
+ public void allow(int reason) {
+ try {
+ int count = aep.getExpansionURLCount();
+ DownloadsDB db = DownloadsDB.getDB(mContext);
+ int status = 0;
+ if (count != 0) {
+ for (int i = 0; i < count; i++) {
+ String currentFileName = aep
+ .getExpansionFileName(i);
+ if (null != currentFileName) {
+ DownloadInfo di = new DownloadInfo(i,
+ currentFileName, mContext.getPackageName());
+
+ long fileSize = aep.getExpansionFileSize(i);
+ if (handleFileUpdated(db, i, currentFileName,
+ fileSize)) {
+ status |= -1;
+ di.resetDownload();
+ di.mUri = aep.getExpansionURL(i);
+ di.mTotalBytes = fileSize;
+ di.mStatus = status;
+ db.updateDownload(di);
+ } else {
+ // we need to read the download
+ // information
+ // from
+ // the database
+ DownloadInfo dbdi = db
+ .getDownloadInfoByFileName(di.mFileName);
+ if (null == dbdi) {
+ // the file exists already and is
+ // the
+ // correct size
+ // was delivered by Market or
+ // through
+ // another mechanism
+ Log.d(LOG_TAG, "file " + di.mFileName
+ + " found. Not downloading.");
+ di.mStatus = STATUS_SUCCESS;
+ di.mTotalBytes = fileSize;
+ di.mCurrentBytes = fileSize;
+ di.mUri = aep.getExpansionURL(i);
+ db.updateDownload(di);
+ } else if (dbdi.mStatus != STATUS_SUCCESS) {
+ // we just update the URL
+ dbdi.mUri = aep.getExpansionURL(i);
+ db.updateDownload(dbdi);
+ status |= -1;
+ }
+ }
+ }
+ }
+ }
+ // first: do we need to do an LVL update?
+ // we begin by getting our APK version from the package
+ // manager
+ PackageInfo pi;
+ try {
+ pi = mContext.getPackageManager().getPackageInfo(
+ mContext.getPackageName(), 0);
+ db.updateMetadata(pi.versionCode, status);
+ Class<?> serviceClass = DownloaderService.this.getClass();
+ switch (startDownloadServiceIfRequired(mContext, mPendingIntent,
+ serviceClass)) {
+ case NO_DOWNLOAD_REQUIRED:
+ mNotification
+ .onDownloadStateChanged(IDownloaderClient.STATE_COMPLETED);
+ break;
+ case LVL_CHECK_REQUIRED:
+ // DANGER WILL ROBINSON!
+ Log.e(LOG_TAG, "In LVL checking loop!");
+ mNotification
+ .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_UNLICENSED);
+ throw new RuntimeException(
+ "Error with LVL checking and database integrity");
+ case DOWNLOAD_REQUIRED:
+ // do nothing. the download will notify the
+ // application
+ // when things are done
+ break;
+ }
+ } catch (NameNotFoundException e1) {
+ e1.printStackTrace();
+ throw new RuntimeException(
+ "Error with getting information from package name");
+ }
+ } finally {
+ setServiceRunning(false);
+ }
+ }
+
+ @Override
+ public void dontAllow(int reason) {
+ try
+ {
+ switch (reason) {
+ case Policy.NOT_LICENSED:
+ mNotification
+ .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_UNLICENSED);
+ break;
+ case Policy.RETRY:
+ mNotification
+ .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_FETCHING_URL);
+ break;
+ }
+ } finally {
+ setServiceRunning(false);
+ }
+
+ }
+
+ @Override
+ public void applicationError(int errorCode) {
+ try {
+ mNotification
+ .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_FETCHING_URL);
+ } finally {
+ setServiceRunning(false);
+ }
+ }
+
+ });
+
+ }
+
+ };
+
+ /**
* Updates the LVL information from the server.
*
* @param context
*/
- public void updateLVL(final Context context) {
- Context c = context.getApplicationContext();
- Handler h = new Handler(c.getMainLooper());
- h.post(new LVLRunnable(c, mPendingIntent));
- }
+ public void updateLVL(final Context context) {
+ Context c = context.getApplicationContext();
+ Handler h = new Handler(c.getMainLooper());
+ h.post(new LVLRunnable(c, mPendingIntent));
+ }
- /**
+ /**
* The APK has been updated and a filename has been sent down from the
* Market call. If the file has the same name as the previous file, we do
* nothing as the file is guaranteed to be the same. If the file does not
@@ -906,415 +923,424 @@ public abstract class DownloaderService extends CustomIntentService implements I
* @param fileSize the size of the new file
* @return
*/
- public boolean handleFileUpdated(DownloadsDB db, int index,
- String filename, long fileSize) {
- DownloadInfo di = db.getDownloadInfoByFileName(filename);
- if (null != di) {
- String oldFile = di.mFileName;
- // cleanup
- if (null != oldFile) {
- if (filename.equals(oldFile)) {
- return false;
- }
-
- // remove partially downloaded file if it is there
- String deleteFile = Helpers.generateSaveFileName(this, oldFile);
- File f = new File(deleteFile);
- if (f.exists())
- f.delete();
- }
- }
- return !Helpers.doesFileExist(this, filename, fileSize, true);
- }
-
- private void scheduleAlarm(long wakeUp) {
- AlarmManager alarms = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
- if (alarms == null) {
- Log.e(Constants.TAG, "couldn't get alarm manager");
- return;
- }
-
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "scheduling retry in " + wakeUp + "ms");
- }
-
- String className = getAlarmReceiverClassName();
- Intent intent = new Intent(Constants.ACTION_RETRY);
- intent.putExtra(EXTRA_PENDING_INTENT, mPendingIntent);
- intent.setClassName(this.getPackageName(),
- className);
- mAlarmIntent = PendingIntent.getBroadcast(this, 0, intent,
- PendingIntent.FLAG_ONE_SHOT);
- alarms.set(
- AlarmManager.RTC_WAKEUP,
- System.currentTimeMillis() + wakeUp, mAlarmIntent);
- }
-
- private void cancelAlarms() {
- if (null != mAlarmIntent) {
- AlarmManager alarms = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
- if (alarms == null) {
- Log.e(Constants.TAG, "couldn't get alarm manager");
- return;
- }
- alarms.cancel(mAlarmIntent);
- mAlarmIntent = null;
- }
- }
-
- /**
+ public boolean handleFileUpdated(DownloadsDB db, int index,
+ String filename, long fileSize) {
+ DownloadInfo di = db.getDownloadInfoByFileName(filename);
+ if (null != di) {
+ String oldFile = di.mFileName;
+ // cleanup
+ if (null != oldFile) {
+ if (filename.equals(oldFile)) {
+ return false;
+ }
+
+ // remove partially downloaded file if it is there
+ String deleteFile = Helpers.generateSaveFileName(this, oldFile);
+ File f = new File(deleteFile);
+ if (f.exists())
+ f.delete();
+ }
+ }
+ return !Helpers.doesFileExist(this, filename, fileSize, true);
+ }
+
+ private void scheduleAlarm(long wakeUp) {
+ AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
+ if (alarms == null) {
+ Log.e(Constants.TAG, "couldn't get alarm manager");
+ return;
+ }
+
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "scheduling retry in " + wakeUp + "ms");
+ }
+
+ String className = getAlarmReceiverClassName();
+ Intent intent = new Intent(Constants.ACTION_RETRY);
+ intent.putExtra(EXTRA_PENDING_INTENT, mPendingIntent);
+ intent.setClassName(this.getPackageName(),
+ className);
+ mAlarmIntent = PendingIntent.getBroadcast(this, 0, intent,
+ PendingIntent.FLAG_ONE_SHOT);
+ alarms.set(
+ AlarmManager.RTC_WAKEUP,
+ System.currentTimeMillis() + wakeUp, mAlarmIntent
+ );
+ }
+
+ private void cancelAlarms() {
+ if (null != mAlarmIntent) {
+ AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
+ if (alarms == null) {
+ Log.e(Constants.TAG, "couldn't get alarm manager");
+ return;
+ }
+ alarms.cancel(mAlarmIntent);
+ mAlarmIntent = null;
+ }
+ }
+
+ /**
* We use this to track network state, such as when WiFi, Cellular, etc. is
* enabled when downloads are paused or in progress.
*/
- private class InnerBroadcastReceiver extends BroadcastReceiver {
- final Service mService;
-
- InnerBroadcastReceiver(Service service) {
- mService = service;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- pollNetworkState();
- if (mStateChanged && !isServiceRunning()) {
- Log.d(Constants.TAG, "InnerBroadcastReceiver Called");
- Intent fileIntent = new Intent(context, mService.getClass());
- fileIntent.putExtra(EXTRA_PENDING_INTENT, mPendingIntent);
- // send a new intent to the service
- context.startService(fileIntent);
- }
- }
- };
-
- /**
+ private class InnerBroadcastReceiver extends BroadcastReceiver {
+ final Service mService;
+
+ InnerBroadcastReceiver(Service service) {
+ mService = service;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ pollNetworkState();
+ if (mStateChanged
+ && !isServiceRunning()) {
+ Log.d(Constants.TAG, "InnerBroadcastReceiver Called");
+ Intent fileIntent = new Intent(context, mService.getClass());
+ fileIntent.putExtra(EXTRA_PENDING_INTENT, mPendingIntent);
+ // send a new intent to the service
+ context.startService(fileIntent);
+ }
+ }
+ };
+
+ /**
* This is the main thread for the Downloader. This thread is responsible
* for queuing up downloads and other goodness.
*/
- @Override
- protected void onHandleIntent(Intent intent) {
- setServiceRunning(true);
- try {
- // the database automatically reads the metadata for version code
- // and download status when the instance is created
- DownloadsDB db = DownloadsDB.getDB(this);
- final PendingIntent pendingIntent = (PendingIntent)intent
- .getParcelableExtra(EXTRA_PENDING_INTENT);
-
- if (null != pendingIntent) {
- mNotification.setClientIntent(pendingIntent);
- mPendingIntent = pendingIntent;
- } else if (null != mPendingIntent) {
- mNotification.setClientIntent(mPendingIntent);
- } else {
- Log.e(LOG_TAG, "Downloader started in bad state without notification intent.");
- return;
- }
-
- // when the LVL check completes, a successful response will update
- // the service
- if (isLVLCheckRequired(db, mPackageInfo)) {
- updateLVL(this);
- return;
- }
-
- // get each download
- DownloadInfo[] infos = db.getDownloads();
- mBytesSoFar = 0;
- mTotalLength = 0;
- mFileCount = infos.length;
- for (DownloadInfo info : infos) {
- // We do an (simple) integrity check on each file, just to make
- // sure
- if (info.mStatus == STATUS_SUCCESS) {
- // verify that the file matches the state
- if (!Helpers.doesFileExist(this, info.mFileName, info.mTotalBytes, true)) {
- info.mStatus = 0;
- info.mCurrentBytes = 0;
- }
- }
- // get aggregate data
- mTotalLength += info.mTotalBytes;
- mBytesSoFar += info.mCurrentBytes;
- }
-
- // loop through all downloads and fetch them
- pollNetworkState();
- if (null == mConnReceiver) {
-
- /**
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ setServiceRunning(true);
+ try {
+ // the database automatically reads the metadata for version code
+ // and download status when the instance is created
+ DownloadsDB db = DownloadsDB.getDB(this);
+ final PendingIntent pendingIntent = (PendingIntent) intent
+ .getParcelableExtra(EXTRA_PENDING_INTENT);
+
+ if (null != pendingIntent)
+ {
+ mNotification.setClientIntent(pendingIntent);
+ mPendingIntent = pendingIntent;
+ } else if (null != mPendingIntent) {
+ mNotification.setClientIntent(mPendingIntent);
+ } else {
+ Log.e(LOG_TAG, "Downloader started in bad state without notification intent.");
+ return;
+ }
+
+ // when the LVL check completes, a successful response will update
+ // the service
+ if (isLVLCheckRequired(db, mPackageInfo)) {
+ updateLVL(this);
+ return;
+ }
+
+ // get each download
+ DownloadInfo[] infos = db.getDownloads();
+ mBytesSoFar = 0;
+ mTotalLength = 0;
+ mFileCount = infos.length;
+ for (DownloadInfo info : infos) {
+ // We do an (simple) integrity check on each file, just to make
+ // sure
+ if (info.mStatus == STATUS_SUCCESS) {
+ // verify that the file matches the state
+ if (!Helpers.doesFileExist(this, info.mFileName, info.mTotalBytes, true)) {
+ info.mStatus = 0;
+ info.mCurrentBytes = 0;
+ }
+ }
+ // get aggregate data
+ mTotalLength += info.mTotalBytes;
+ mBytesSoFar += info.mCurrentBytes;
+ }
+
+ // loop through all downloads and fetch them
+ pollNetworkState();
+ if (null == mConnReceiver) {
+
+ /**
* We use this to track network state, such as when WiFi,
* Cellular, etc. is enabled when downloads are paused or in
* progress.
*/
- mConnReceiver = new InnerBroadcastReceiver(this);
- IntentFilter intentFilter = new IntentFilter(
- ConnectivityManager.CONNECTIVITY_ACTION);
- intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
- registerReceiver(mConnReceiver, intentFilter);
- }
-
- for (DownloadInfo info : infos) {
- long startingCount = info.mCurrentBytes;
-
- if (info.mStatus != STATUS_SUCCESS) {
- DownloadThread dt = new DownloadThread(info, this, mNotification);
- cancelAlarms();
- scheduleAlarm(Constants.ACTIVE_THREAD_WATCHDOG);
- dt.run();
- cancelAlarms();
- }
- db.updateFromDb(info);
- boolean setWakeWatchdog = false;
- int notifyStatus;
- switch (info.mStatus) {
- case STATUS_FORBIDDEN:
- // the URL is out of date
- updateLVL(this);
- return;
- case STATUS_SUCCESS:
- mBytesSoFar += info.mCurrentBytes - startingCount;
- db.updateMetadata(mPackageInfo.versionCode, 0);
- continue;
- case STATUS_FILE_DELIVERED_INCORRECTLY:
- // we may be on a network that is returning us a web
- // page on redirect
- notifyStatus = IDownloaderClient.STATE_PAUSED_NETWORK_SETUP_FAILURE;
- info.mCurrentBytes = 0;
- db.updateDownload(info);
- setWakeWatchdog = true;
- break;
- case STATUS_PAUSED_BY_APP:
- notifyStatus = IDownloaderClient.STATE_PAUSED_BY_REQUEST;
- break;
- case STATUS_WAITING_FOR_NETWORK:
- case STATUS_WAITING_TO_RETRY:
- notifyStatus = IDownloaderClient.STATE_PAUSED_NETWORK_UNAVAILABLE;
- setWakeWatchdog = true;
- break;
- case STATUS_QUEUED_FOR_WIFI_OR_CELLULAR_PERMISSION:
- case STATUS_QUEUED_FOR_WIFI:
- // look for more detail here
- if (null != mWifiManager) {
- if (!mWifiManager.isWifiEnabled()) {
- notifyStatus = IDownloaderClient.STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION;
- setWakeWatchdog = true;
- break;
- }
- }
- notifyStatus = IDownloaderClient.STATE_PAUSED_NEED_CELLULAR_PERMISSION;
- setWakeWatchdog = true;
- break;
- case STATUS_CANCELED:
- notifyStatus = IDownloaderClient.STATE_FAILED_CANCELED;
- setWakeWatchdog = true;
- break;
-
- case STATUS_INSUFFICIENT_SPACE_ERROR:
- notifyStatus = IDownloaderClient.STATE_FAILED_SDCARD_FULL;
- setWakeWatchdog = true;
- break;
-
- case STATUS_DEVICE_NOT_FOUND_ERROR:
- notifyStatus = IDownloaderClient.STATE_PAUSED_SDCARD_UNAVAILABLE;
- setWakeWatchdog = true;
- break;
-
- default:
- notifyStatus = IDownloaderClient.STATE_FAILED;
- break;
- }
- if (setWakeWatchdog) {
- scheduleAlarm(Constants.WATCHDOG_WAKE_TIMER);
- } else {
- cancelAlarms();
- }
- // failure or pause state
- mNotification.onDownloadStateChanged(notifyStatus);
- return;
- }
-
- // all downloads complete
- mNotification.onDownloadStateChanged(IDownloaderClient.STATE_COMPLETED);
- } finally {
- setServiceRunning(false);
- }
- }
-
- @Override
- public void onDestroy() {
- if (null != mConnReceiver) {
- unregisterReceiver(mConnReceiver);
- mConnReceiver = null;
- }
- mServiceStub.disconnect(this);
- super.onDestroy();
- }
-
- public int getNetworkAvailabilityState(DownloadsDB db) {
- if (mIsConnected) {
- if (!mIsCellularConnection)
- return NETWORK_OK;
- int flags = db.mFlags;
- if (mIsRoaming)
- return NETWORK_CANNOT_USE_ROAMING;
- if (0 != (flags & FLAGS_DOWNLOAD_OVER_CELLULAR)) {
- return NETWORK_OK;
- } else {
- return NETWORK_TYPE_DISALLOWED_BY_REQUESTOR;
- }
- }
- return NETWORK_NO_CONNECTION;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- try {
- mPackageInfo = getPackageManager().getPackageInfo(
- getPackageName(), 0);
- ApplicationInfo ai = getApplicationInfo();
- CharSequence applicationLabel = getPackageManager().getApplicationLabel(ai);
- mNotification = new DownloadNotification(this, applicationLabel);
-
- } catch (NameNotFoundException e) {
- e.printStackTrace();
- }
- }
-
- /**
+ mConnReceiver = new InnerBroadcastReceiver(this);
+ IntentFilter intentFilter = new IntentFilter(
+ ConnectivityManager.CONNECTIVITY_ACTION);
+ intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
+ registerReceiver(mConnReceiver, intentFilter);
+ }
+
+ for (DownloadInfo info : infos) {
+ long startingCount = info.mCurrentBytes;
+
+ if (info.mStatus != STATUS_SUCCESS) {
+ DownloadThread dt = new DownloadThread(info, this, mNotification);
+ cancelAlarms();
+ scheduleAlarm(Constants.ACTIVE_THREAD_WATCHDOG);
+ dt.run();
+ cancelAlarms();
+ }
+ db.updateFromDb(info);
+ boolean setWakeWatchdog = false;
+ int notifyStatus;
+ switch (info.mStatus) {
+ case STATUS_FORBIDDEN:
+ // the URL is out of date
+ updateLVL(this);
+ return;
+ case STATUS_SUCCESS:
+ mBytesSoFar += info.mCurrentBytes - startingCount;
+ db.updateMetadata(mPackageInfo.versionCode, 0);
+ continue;
+ case STATUS_FILE_DELIVERED_INCORRECTLY:
+ // we may be on a network that is returning us a web
+ // page on redirect
+ notifyStatus = IDownloaderClient.STATE_PAUSED_NETWORK_SETUP_FAILURE;
+ info.mCurrentBytes = 0;
+ db.updateDownload(info);
+ setWakeWatchdog = true;
+ break;
+ case STATUS_PAUSED_BY_APP:
+ notifyStatus = IDownloaderClient.STATE_PAUSED_BY_REQUEST;
+ break;
+ case STATUS_WAITING_FOR_NETWORK:
+ case STATUS_WAITING_TO_RETRY:
+ notifyStatus = IDownloaderClient.STATE_PAUSED_NETWORK_UNAVAILABLE;
+ setWakeWatchdog = true;
+ break;
+ case STATUS_QUEUED_FOR_WIFI_OR_CELLULAR_PERMISSION:
+ case STATUS_QUEUED_FOR_WIFI:
+ // look for more detail here
+ if (null != mWifiManager) {
+ if (!mWifiManager.isWifiEnabled()) {
+ notifyStatus = IDownloaderClient.STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION;
+ setWakeWatchdog = true;
+ break;
+ }
+ }
+ notifyStatus = IDownloaderClient.STATE_PAUSED_NEED_CELLULAR_PERMISSION;
+ setWakeWatchdog = true;
+ break;
+ case STATUS_CANCELED:
+ notifyStatus = IDownloaderClient.STATE_FAILED_CANCELED;
+ setWakeWatchdog = true;
+ break;
+
+ case STATUS_INSUFFICIENT_SPACE_ERROR:
+ notifyStatus = IDownloaderClient.STATE_FAILED_SDCARD_FULL;
+ setWakeWatchdog = true;
+ break;
+
+ case STATUS_DEVICE_NOT_FOUND_ERROR:
+ notifyStatus = IDownloaderClient.STATE_PAUSED_SDCARD_UNAVAILABLE;
+ setWakeWatchdog = true;
+ break;
+
+ default:
+ notifyStatus = IDownloaderClient.STATE_FAILED;
+ break;
+ }
+ if (setWakeWatchdog) {
+ scheduleAlarm(Constants.WATCHDOG_WAKE_TIMER);
+ } else {
+ cancelAlarms();
+ }
+ // failure or pause state
+ mNotification.onDownloadStateChanged(notifyStatus);
+ return;
+ }
+
+ // all downloads complete
+ mNotification.onDownloadStateChanged(IDownloaderClient.STATE_COMPLETED);
+ } finally {
+ setServiceRunning(false);
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ if (null != mConnReceiver) {
+ unregisterReceiver(mConnReceiver);
+ mConnReceiver = null;
+ }
+ mServiceStub.disconnect(this);
+ super.onDestroy();
+ }
+
+ public int getNetworkAvailabilityState(DownloadsDB db) {
+ if (mIsConnected) {
+ if (!mIsCellularConnection)
+ return NETWORK_OK;
+ int flags = db.mFlags;
+ if (mIsRoaming)
+ return NETWORK_CANNOT_USE_ROAMING;
+ if (0 != (flags & FLAGS_DOWNLOAD_OVER_CELLULAR)) {
+ return NETWORK_OK;
+ } else {
+ return NETWORK_TYPE_DISALLOWED_BY_REQUESTOR;
+ }
+ }
+ return NETWORK_NO_CONNECTION;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ try {
+ mPackageInfo = getPackageManager().getPackageInfo(
+ getPackageName(), 0);
+ ApplicationInfo ai = getApplicationInfo();
+ CharSequence applicationLabel = getPackageManager().getApplicationLabel(ai);
+ mNotification = new DownloadNotification(this, applicationLabel);
+
+ } catch (NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
* Exception thrown from methods called by generateSaveFile() for any fatal
* error.
*/
- public static class GenerateSaveFileError extends Exception {
- private static final long serialVersionUID = 3465966015408936540L;
- int mStatus;
- String mMessage;
+ public static class GenerateSaveFileError extends Exception {
+ private static final long serialVersionUID = 3465966015408936540L;
+ int mStatus;
+ String mMessage;
- public GenerateSaveFileError(int status, String message) {
- mStatus = status;
- mMessage = message;
- }
- }
+ public GenerateSaveFileError(int status, String message) {
+ mStatus = status;
+ mMessage = message;
+ }
+ }
- /**
+ /**
* Returns the filename (where the file should be saved) from info about a
* download
*/
- public String generateTempSaveFileName(String fileName) {
- String path = Helpers.getSaveFilePath(this) + File.separator + fileName + TEMP_EXT;
- return path;
- }
+ public String generateTempSaveFileName(String fileName) {
+ String path = Helpers.getSaveFilePath(this)
+ + File.separator + fileName + TEMP_EXT;
+ return path;
+ }
- /**
+ /**
* Creates a filename (where the file should be saved) from info about a
* download.
*/
- public String generateSaveFile(String filename, long filesize)
- throws GenerateSaveFileError {
- String path = generateTempSaveFileName(filename);
- File expPath = new File(path);
- if (!Helpers.isExternalMediaMounted()) {
- Log.d(Constants.TAG, "External media not mounted: " + path);
- throw new GenerateSaveFileError(STATUS_DEVICE_NOT_FOUND_ERROR,
- "external media is not yet mounted");
- }
- if (expPath.exists()) {
- Log.d(Constants.TAG, "File already exists: " + path);
- throw new GenerateSaveFileError(STATUS_FILE_ALREADY_EXISTS_ERROR,
- "requested destination file already exists");
- }
- if (Helpers.getAvailableBytes(Helpers.getFilesystemRoot(path)) < filesize) {
- throw new GenerateSaveFileError(STATUS_INSUFFICIENT_SPACE_ERROR,
- "insufficient space on external storage");
- }
- return path;
- }
-
- /**
+ public String generateSaveFile(String filename, long filesize)
+ throws GenerateSaveFileError {
+ String path = generateTempSaveFileName(filename);
+ File expPath = new File(path);
+ if (!Helpers.isExternalMediaMounted()) {
+ Log.d(Constants.TAG, "External media not mounted: " + path);
+ throw new GenerateSaveFileError(STATUS_DEVICE_NOT_FOUND_ERROR,
+ "external media is not yet mounted");
+
+ }
+ if (expPath.exists()) {
+ Log.d(Constants.TAG, "File already exists: " + path);
+ throw new GenerateSaveFileError(STATUS_FILE_ALREADY_EXISTS_ERROR,
+ "requested destination file already exists");
+ }
+ if (Helpers.getAvailableBytes(Helpers.getFilesystemRoot(path)) < filesize) {
+ throw new GenerateSaveFileError(STATUS_INSUFFICIENT_SPACE_ERROR,
+ "insufficient space on external storage");
+ }
+ return path;
+ }
+
+ /**
* @return a non-localized string appropriate for logging corresponding to
* one of the NETWORK_* constants.
*/
- public String getLogMessageForNetworkError(int networkError) {
- switch (networkError) {
- case NETWORK_RECOMMENDED_UNUSABLE_DUE_TO_SIZE:
- return "download size exceeds recommended limit for mobile network";
+ public String getLogMessageForNetworkError(int networkError) {
+ switch (networkError) {
+ case NETWORK_RECOMMENDED_UNUSABLE_DUE_TO_SIZE:
+ return "download size exceeds recommended limit for mobile network";
- case NETWORK_UNUSABLE_DUE_TO_SIZE:
- return "download size exceeds limit for mobile network";
+ case NETWORK_UNUSABLE_DUE_TO_SIZE:
+ return "download size exceeds limit for mobile network";
- case NETWORK_NO_CONNECTION:
- return "no network connection available";
+ case NETWORK_NO_CONNECTION:
+ return "no network connection available";
- case NETWORK_CANNOT_USE_ROAMING:
- return "download cannot use the current network connection because it is roaming";
+ case NETWORK_CANNOT_USE_ROAMING:
+ return "download cannot use the current network connection because it is roaming";
- case NETWORK_TYPE_DISALLOWED_BY_REQUESTOR:
- return "download was requested to not use the current network type";
+ case NETWORK_TYPE_DISALLOWED_BY_REQUESTOR:
+ return "download was requested to not use the current network type";
- default:
- return "unknown error with network connectivity";
- }
- }
+ default:
+ return "unknown error with network connectivity";
+ }
+ }
- public int getControl() {
- return mControl;
- }
+ public int getControl() {
+ return mControl;
+ }
- public int getStatus() {
- return mStatus;
- }
+ public int getStatus() {
+ return mStatus;
+ }
- /**
+ /**
* Calculating a moving average for the speed so we don't get jumpy
* calculations for time etc.
*/
- static private final float SMOOTHING_FACTOR = 0.005f;
-
- public void notifyUpdateBytes(long totalBytesSoFar) {
- long timeRemaining;
- long currentTime = SystemClock.uptimeMillis();
- if (0 != mMillisecondsAtSample) {
- // we have a sample.
- long timePassed = currentTime - mMillisecondsAtSample;
- long bytesInSample = totalBytesSoFar - mBytesAtSample;
- float currentSpeedSample = (float)bytesInSample / (float)timePassed;
- if (0 != mAverageDownloadSpeed) {
- mAverageDownloadSpeed = SMOOTHING_FACTOR * currentSpeedSample + (1 - SMOOTHING_FACTOR) * mAverageDownloadSpeed;
- } else {
- mAverageDownloadSpeed = currentSpeedSample;
- }
- timeRemaining = (long)((mTotalLength - totalBytesSoFar) / mAverageDownloadSpeed);
- } else {
- timeRemaining = -1;
- }
- mMillisecondsAtSample = currentTime;
- mBytesAtSample = totalBytesSoFar;
- mNotification.onDownloadProgress(
- new DownloadProgressInfo(mTotalLength,
- totalBytesSoFar,
- timeRemaining,
- mAverageDownloadSpeed));
- }
-
- @Override
- protected boolean shouldStop() {
- // the database automatically reads the metadata for version code
- // and download status when the instance is created
- DownloadsDB db = DownloadsDB.getDB(this);
- if (db.mStatus == 0) {
- return true;
- }
- return false;
- }
-
- @Override
- public void requestDownloadStatus() {
- mNotification.resendState();
- }
-
- @Override
- public void onClientUpdated(Messenger clientMessenger) {
- this.mClientMessenger = clientMessenger;
- mNotification.setMessenger(mClientMessenger);
- }
+ static private final float SMOOTHING_FACTOR = 0.005f;
+
+ public void notifyUpdateBytes(long totalBytesSoFar) {
+ long timeRemaining;
+ long currentTime = SystemClock.uptimeMillis();
+ if (0 != mMillisecondsAtSample) {
+ // we have a sample.
+ long timePassed = currentTime - mMillisecondsAtSample;
+ long bytesInSample = totalBytesSoFar - mBytesAtSample;
+ float currentSpeedSample = (float) bytesInSample / (float) timePassed;
+ if (0 != mAverageDownloadSpeed) {
+ mAverageDownloadSpeed = SMOOTHING_FACTOR * currentSpeedSample
+ + (1 - SMOOTHING_FACTOR) * mAverageDownloadSpeed;
+ } else {
+ mAverageDownloadSpeed = currentSpeedSample;
+ }
+ timeRemaining = (long) ((mTotalLength - totalBytesSoFar) / mAverageDownloadSpeed);
+ } else {
+ timeRemaining = -1;
+ }
+ mMillisecondsAtSample = currentTime;
+ mBytesAtSample = totalBytesSoFar;
+ mNotification.onDownloadProgress(
+ new DownloadProgressInfo(mTotalLength,
+ totalBytesSoFar,
+ timeRemaining,
+ mAverageDownloadSpeed)
+ );
+
+ }
+
+ @Override
+ protected boolean shouldStop() {
+ // the database automatically reads the metadata for version code
+ // and download status when the instance is created
+ DownloadsDB db = DownloadsDB.getDB(this);
+ if (db.mStatus == 0) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void requestDownloadStatus() {
+ mNotification.resendState();
+ }
+
+ @Override
+ public void onClientUpdated(Messenger clientMessenger) {
+ this.mClientMessenger = clientMessenger;
+ mNotification.setMessenger(mClientMessenger);
+ }
+
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java
index 5d8dce0bac..c658b4cc43 100755..100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java
@@ -27,443 +27,484 @@ import android.provider.BaseColumns;
import android.util.Log;
public class DownloadsDB {
- private static final String DATABASE_NAME = "DownloadsDB";
- private static final int DATABASE_VERSION = 7;
- public static final String LOG_TAG = DownloadsDB.class.getName();
- final SQLiteOpenHelper mHelper;
- SQLiteStatement mGetDownloadByIndex;
- SQLiteStatement mUpdateCurrentBytes;
- private static DownloadsDB mDownloadsDB;
- long mMetadataRowID = -1;
- int mVersionCode = -1;
- int mStatus = -1;
- int mFlags;
-
- static public synchronized DownloadsDB getDB(Context paramContext) {
- if (null == mDownloadsDB) {
- return new DownloadsDB(paramContext);
- }
- return mDownloadsDB;
- }
-
- private SQLiteStatement getDownloadByIndexStatement() {
- if (null == mGetDownloadByIndex) {
- mGetDownloadByIndex = mHelper.getReadableDatabase().compileStatement(
- "SELECT " + BaseColumns._ID + " FROM " + DownloadColumns.TABLE_NAME + " WHERE " + DownloadColumns.INDEX + " = ?");
- }
- return mGetDownloadByIndex;
- }
-
- private SQLiteStatement getUpdateCurrentBytesStatement() {
- if (null == mUpdateCurrentBytes) {
- mUpdateCurrentBytes = mHelper.getReadableDatabase().compileStatement(
- "UPDATE " + DownloadColumns.TABLE_NAME + " SET " + DownloadColumns.CURRENTBYTES + " = ?"
- +
- " WHERE " + DownloadColumns.INDEX + " = ?");
- }
- return mUpdateCurrentBytes;
- }
-
- private DownloadsDB(Context paramContext) {
- this.mHelper = new DownloadsContentDBHelper(paramContext);
- final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
- // Query for the version code, the row ID of the metadata (for future
- // updating) the status and the flags
- Cursor cur = sqldb.rawQuery("SELECT " +
- MetadataColumns.APKVERSION + "," +
- BaseColumns._ID + "," +
- MetadataColumns.DOWNLOAD_STATUS + "," +
- MetadataColumns.FLAGS +
- " FROM " + MetadataColumns.TABLE_NAME + " LIMIT 1",
- null);
- if (null != cur && cur.moveToFirst()) {
- mVersionCode = cur.getInt(0);
- mMetadataRowID = cur.getLong(1);
- mStatus = cur.getInt(2);
- mFlags = cur.getInt(3);
- cur.close();
- }
- mDownloadsDB = this;
- }
-
- protected DownloadInfo getDownloadInfoByFileName(String fileName) {
- final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
- Cursor itemcur = null;
- try {
- itemcur = sqldb.query(DownloadColumns.TABLE_NAME, DC_PROJECTION,
- DownloadColumns.FILENAME + " = ?",
- new String[] {
- fileName },
- null, null, null);
- if (null != itemcur && itemcur.moveToFirst()) {
- return getDownloadInfoFromCursor(itemcur);
- }
- } finally {
- if (null != itemcur)
- itemcur.close();
- }
- return null;
- }
-
- public long getIDForDownloadInfo(final DownloadInfo di) {
- return getIDByIndex(di.mIndex);
- }
-
- public long getIDByIndex(int index) {
- SQLiteStatement downloadByIndex = getDownloadByIndexStatement();
- downloadByIndex.clearBindings();
- downloadByIndex.bindLong(1, index);
- try {
- return downloadByIndex.simpleQueryForLong();
- } catch (SQLiteDoneException e) {
- return -1;
- }
- }
-
- public void updateDownloadCurrentBytes(final DownloadInfo di) {
- SQLiteStatement downloadCurrentBytes = getUpdateCurrentBytesStatement();
- downloadCurrentBytes.clearBindings();
- downloadCurrentBytes.bindLong(1, di.mCurrentBytes);
- downloadCurrentBytes.bindLong(2, di.mIndex);
- downloadCurrentBytes.execute();
- }
-
- public void close() {
- this.mHelper.close();
- }
-
- protected static class DownloadsContentDBHelper extends SQLiteOpenHelper {
- DownloadsContentDBHelper(Context paramContext) {
- super(paramContext, DATABASE_NAME, null, DATABASE_VERSION);
- }
-
- private String createTableQueryFromArray(String paramString,
- String[][] paramArrayOfString) {
- StringBuilder localStringBuilder = new StringBuilder();
- localStringBuilder.append("CREATE TABLE ");
- localStringBuilder.append(paramString);
- localStringBuilder.append(" (");
- int i = paramArrayOfString.length;
- for (int j = 0;; j++) {
- if (j >= i) {
- localStringBuilder
- .setLength(localStringBuilder.length() - 1);
- localStringBuilder.append(");");
- return localStringBuilder.toString();
- }
- String[] arrayOfString = paramArrayOfString[j];
- localStringBuilder.append(' ');
- localStringBuilder.append(arrayOfString[0]);
- localStringBuilder.append(' ');
- localStringBuilder.append(arrayOfString[1]);
- localStringBuilder.append(',');
- }
- }
-
- /**
+ private static final String DATABASE_NAME = "DownloadsDB";
+ private static final int DATABASE_VERSION = 7;
+ public static final String LOG_TAG = DownloadsDB.class.getName();
+ final SQLiteOpenHelper mHelper;
+ SQLiteStatement mGetDownloadByIndex;
+ SQLiteStatement mUpdateCurrentBytes;
+ private static DownloadsDB mDownloadsDB;
+ long mMetadataRowID = -1;
+ int mVersionCode = -1;
+ int mStatus = -1;
+ int mFlags;
+
+ static public synchronized DownloadsDB getDB(Context paramContext) {
+ if (null == mDownloadsDB) {
+ return new DownloadsDB(paramContext);
+ }
+ return mDownloadsDB;
+ }
+
+ private SQLiteStatement getDownloadByIndexStatement() {
+ if (null == mGetDownloadByIndex) {
+ mGetDownloadByIndex = mHelper.getReadableDatabase().compileStatement(
+ "SELECT " + BaseColumns._ID + " FROM "
+ + DownloadColumns.TABLE_NAME + " WHERE "
+ + DownloadColumns.INDEX + " = ?");
+ }
+ return mGetDownloadByIndex;
+ }
+
+ private SQLiteStatement getUpdateCurrentBytesStatement() {
+ if (null == mUpdateCurrentBytes) {
+ mUpdateCurrentBytes = mHelper.getReadableDatabase().compileStatement(
+ "UPDATE " + DownloadColumns.TABLE_NAME + " SET " + DownloadColumns.CURRENTBYTES
+ + " = ?" +
+ " WHERE " + DownloadColumns.INDEX + " = ?");
+ }
+ return mUpdateCurrentBytes;
+ }
+
+ private DownloadsDB(Context paramContext) {
+ this.mHelper = new DownloadsContentDBHelper(paramContext);
+ final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
+ // Query for the version code, the row ID of the metadata (for future
+ // updating) the status and the flags
+ Cursor cur = sqldb.rawQuery("SELECT " +
+ MetadataColumns.APKVERSION + "," +
+ BaseColumns._ID + "," +
+ MetadataColumns.DOWNLOAD_STATUS + "," +
+ MetadataColumns.FLAGS +
+ " FROM "
+ + MetadataColumns.TABLE_NAME + " LIMIT 1", null);
+ if (null != cur && cur.moveToFirst()) {
+ mVersionCode = cur.getInt(0);
+ mMetadataRowID = cur.getLong(1);
+ mStatus = cur.getInt(2);
+ mFlags = cur.getInt(3);
+ cur.close();
+ }
+ mDownloadsDB = this;
+ }
+
+ protected DownloadInfo getDownloadInfoByFileName(String fileName) {
+ final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
+ Cursor itemcur = null;
+ try {
+ itemcur = sqldb.query(DownloadColumns.TABLE_NAME, DC_PROJECTION,
+ DownloadColumns.FILENAME + " = ?",
+ new String[] {
+ fileName
+ }, null, null, null);
+ if (null != itemcur && itemcur.moveToFirst()) {
+ return getDownloadInfoFromCursor(itemcur);
+ }
+ } finally {
+ if (null != itemcur)
+ itemcur.close();
+ }
+ return null;
+ }
+
+ public long getIDForDownloadInfo(final DownloadInfo di) {
+ return getIDByIndex(di.mIndex);
+ }
+
+ public long getIDByIndex(int index) {
+ SQLiteStatement downloadByIndex = getDownloadByIndexStatement();
+ downloadByIndex.clearBindings();
+ downloadByIndex.bindLong(1, index);
+ try {
+ return downloadByIndex.simpleQueryForLong();
+ } catch (SQLiteDoneException e) {
+ return -1;
+ }
+ }
+
+ public void updateDownloadCurrentBytes(final DownloadInfo di) {
+ SQLiteStatement downloadCurrentBytes = getUpdateCurrentBytesStatement();
+ downloadCurrentBytes.clearBindings();
+ downloadCurrentBytes.bindLong(1, di.mCurrentBytes);
+ downloadCurrentBytes.bindLong(2, di.mIndex);
+ downloadCurrentBytes.execute();
+ }
+
+ public void close() {
+ this.mHelper.close();
+ }
+
+ protected static class DownloadsContentDBHelper extends SQLiteOpenHelper {
+ DownloadsContentDBHelper(Context paramContext) {
+ super(paramContext, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+
+ private String createTableQueryFromArray(String paramString,
+ String[][] paramArrayOfString) {
+ StringBuilder localStringBuilder = new StringBuilder();
+ localStringBuilder.append("CREATE TABLE ");
+ localStringBuilder.append(paramString);
+ localStringBuilder.append(" (");
+ int i = paramArrayOfString.length;
+ for (int j = 0;; j++) {
+ if (j >= i) {
+ localStringBuilder
+ .setLength(localStringBuilder.length() - 1);
+ localStringBuilder.append(");");
+ return localStringBuilder.toString();
+ }
+ String[] arrayOfString = paramArrayOfString[j];
+ localStringBuilder.append(' ');
+ localStringBuilder.append(arrayOfString[0]);
+ localStringBuilder.append(' ');
+ localStringBuilder.append(arrayOfString[1]);
+ localStringBuilder.append(',');
+ }
+ }
+
+ /**
* These two arrays must match and have the same order. For every Schema
* there must be a corresponding table name.
*/
- static final private String[][][] sSchemas = {
- DownloadColumns.SCHEMA, MetadataColumns.SCHEMA
- };
+ static final private String[][][] sSchemas = {
+ DownloadColumns.SCHEMA, MetadataColumns.SCHEMA
+ };
- static final private String[] sTables = {
- DownloadColumns.TABLE_NAME, MetadataColumns.TABLE_NAME
- };
+ static final private String[] sTables = {
+ DownloadColumns.TABLE_NAME, MetadataColumns.TABLE_NAME
+ };
- /**
+ /**
* Goes through all of the tables in sTables and drops each table if it
* exists. Altered to no longer make use of reflection.
*/
- private void dropTables(SQLiteDatabase paramSQLiteDatabase) {
- for (String table : sTables) {
- try {
- paramSQLiteDatabase.execSQL("DROP TABLE IF EXISTS " + table);
- } catch (Exception localException) {
- localException.printStackTrace();
- }
- }
- }
-
- /**
+ private void dropTables(SQLiteDatabase paramSQLiteDatabase) {
+ for (String table : sTables) {
+ try {
+ paramSQLiteDatabase.execSQL("DROP TABLE IF EXISTS " + table);
+ } catch (Exception localException) {
+ localException.printStackTrace();
+ }
+ }
+ }
+
+ /**
* Goes through all of the tables in sTables and creates a database with
* the corresponding schema described in sSchemas. Altered to no longer
* make use of reflection.
*/
- public void onCreate(SQLiteDatabase paramSQLiteDatabase) {
- int numSchemas = sSchemas.length;
- for (int i = 0; i < numSchemas; i++) {
- try {
- String[][] schema = (String[][])sSchemas[i];
- paramSQLiteDatabase.execSQL(createTableQueryFromArray(
- sTables[i], schema));
- } catch (Exception localException) {
- while (true)
- localException.printStackTrace();
- }
- }
- }
-
- public void onUpgrade(SQLiteDatabase paramSQLiteDatabase,
- int paramInt1, int paramInt2) {
- Log.w(DownloadsContentDBHelper.class.getName(),
- "Upgrading database from version " + paramInt1 + " to " + paramInt2 + ", which will destroy all old data");
- dropTables(paramSQLiteDatabase);
- onCreate(paramSQLiteDatabase);
- }
- }
-
- public static class MetadataColumns implements BaseColumns {
- public static final String APKVERSION = "APKVERSION";
- public static final String DOWNLOAD_STATUS = "DOWNLOADSTATUS";
- public static final String FLAGS = "DOWNLOADFLAGS";
-
- public static final String[][] SCHEMA = {
- { BaseColumns._ID, "INTEGER PRIMARY KEY" },
- { APKVERSION, "INTEGER" }, { DOWNLOAD_STATUS, "INTEGER" },
- { FLAGS, "INTEGER" }
- };
- public static final String TABLE_NAME = "MetadataColumns";
- public static final String _ID = "MetadataColumns._id";
- }
-
- public static class DownloadColumns implements BaseColumns {
- public static final String INDEX = "FILEIDX";
- public static final String URI = "URI";
- public static final String FILENAME = "FN";
- public static final String ETAG = "ETAG";
-
- public static final String TOTALBYTES = "TOTALBYTES";
- public static final String CURRENTBYTES = "CURRENTBYTES";
- public static final String LASTMOD = "LASTMOD";
-
- public static final String STATUS = "STATUS";
- public static final String CONTROL = "CONTROL";
- public static final String NUM_FAILED = "FAILCOUNT";
- public static final String RETRY_AFTER = "RETRYAFTER";
- public static final String REDIRECT_COUNT = "REDIRECTCOUNT";
-
- public static final String[][] SCHEMA = {
- { BaseColumns._ID, "INTEGER PRIMARY KEY" },
- { INDEX, "INTEGER UNIQUE" }, { URI, "TEXT" },
- { FILENAME, "TEXT UNIQUE" }, { ETAG, "TEXT" },
- { TOTALBYTES, "INTEGER" }, { CURRENTBYTES, "INTEGER" },
- { LASTMOD, "INTEGER" }, { STATUS, "INTEGER" },
- { CONTROL, "INTEGER" }, { NUM_FAILED, "INTEGER" },
- { RETRY_AFTER, "INTEGER" }, { REDIRECT_COUNT, "INTEGER" }
- };
- public static final String TABLE_NAME = "DownloadColumns";
- public static final String _ID = "DownloadColumns._id";
- }
-
- private static final String[] DC_PROJECTION = {
- DownloadColumns.FILENAME,
- DownloadColumns.URI, DownloadColumns.ETAG,
- DownloadColumns.TOTALBYTES, DownloadColumns.CURRENTBYTES,
- DownloadColumns.LASTMOD, DownloadColumns.STATUS,
- DownloadColumns.CONTROL, DownloadColumns.NUM_FAILED,
- DownloadColumns.RETRY_AFTER, DownloadColumns.REDIRECT_COUNT,
- DownloadColumns.INDEX
- };
-
- private static final int FILENAME_IDX = 0;
- private static final int URI_IDX = 1;
- private static final int ETAG_IDX = 2;
- private static final int TOTALBYTES_IDX = 3;
- private static final int CURRENTBYTES_IDX = 4;
- private static final int LASTMOD_IDX = 5;
- private static final int STATUS_IDX = 6;
- private static final int CONTROL_IDX = 7;
- private static final int NUM_FAILED_IDX = 8;
- private static final int RETRY_AFTER_IDX = 9;
- private static final int REDIRECT_COUNT_IDX = 10;
- private static final int INDEX_IDX = 11;
-
- /**
+ public void onCreate(SQLiteDatabase paramSQLiteDatabase) {
+ int numSchemas = sSchemas.length;
+ for (int i = 0; i < numSchemas; i++) {
+ try {
+ String[][] schema = (String[][]) sSchemas[i];
+ paramSQLiteDatabase.execSQL(createTableQueryFromArray(
+ sTables[i], schema));
+ } catch (Exception localException) {
+ while (true)
+ localException.printStackTrace();
+ }
+ }
+ }
+
+ public void onUpgrade(SQLiteDatabase paramSQLiteDatabase,
+ int paramInt1, int paramInt2) {
+ Log.w(DownloadsContentDBHelper.class.getName(),
+ "Upgrading database from version " + paramInt1 + " to "
+ + paramInt2 + ", which will destroy all old data");
+ dropTables(paramSQLiteDatabase);
+ onCreate(paramSQLiteDatabase);
+ }
+ }
+
+ public static class MetadataColumns implements BaseColumns {
+ public static final String APKVERSION = "APKVERSION";
+ public static final String DOWNLOAD_STATUS = "DOWNLOADSTATUS";
+ public static final String FLAGS = "DOWNLOADFLAGS";
+
+ public static final String[][] SCHEMA = {
+ {
+ BaseColumns._ID, "INTEGER PRIMARY KEY"
+ },
+ {
+ APKVERSION, "INTEGER"
+ }, {
+ DOWNLOAD_STATUS, "INTEGER"
+ },
+ {
+ FLAGS, "INTEGER"
+ }
+ };
+ public static final String TABLE_NAME = "MetadataColumns";
+ public static final String _ID = "MetadataColumns._id";
+ }
+
+ public static class DownloadColumns implements BaseColumns {
+ public static final String INDEX = "FILEIDX";
+ public static final String URI = "URI";
+ public static final String FILENAME = "FN";
+ public static final String ETAG = "ETAG";
+
+ public static final String TOTALBYTES = "TOTALBYTES";
+ public static final String CURRENTBYTES = "CURRENTBYTES";
+ public static final String LASTMOD = "LASTMOD";
+
+ public static final String STATUS = "STATUS";
+ public static final String CONTROL = "CONTROL";
+ public static final String NUM_FAILED = "FAILCOUNT";
+ public static final String RETRY_AFTER = "RETRYAFTER";
+ public static final String REDIRECT_COUNT = "REDIRECTCOUNT";
+
+ public static final String[][] SCHEMA = {
+ {
+ BaseColumns._ID, "INTEGER PRIMARY KEY"
+ },
+ {
+ INDEX, "INTEGER UNIQUE"
+ }, {
+ URI, "TEXT"
+ },
+ {
+ FILENAME, "TEXT UNIQUE"
+ }, {
+ ETAG, "TEXT"
+ },
+ {
+ TOTALBYTES, "INTEGER"
+ }, {
+ CURRENTBYTES, "INTEGER"
+ },
+ {
+ LASTMOD, "INTEGER"
+ }, {
+ STATUS, "INTEGER"
+ },
+ {
+ CONTROL, "INTEGER"
+ }, {
+ NUM_FAILED, "INTEGER"
+ },
+ {
+ RETRY_AFTER, "INTEGER"
+ }, {
+ REDIRECT_COUNT, "INTEGER"
+ }
+ };
+ public static final String TABLE_NAME = "DownloadColumns";
+ public static final String _ID = "DownloadColumns._id";
+ }
+
+ private static final String[] DC_PROJECTION = {
+ DownloadColumns.FILENAME,
+ DownloadColumns.URI, DownloadColumns.ETAG,
+ DownloadColumns.TOTALBYTES, DownloadColumns.CURRENTBYTES,
+ DownloadColumns.LASTMOD, DownloadColumns.STATUS,
+ DownloadColumns.CONTROL, DownloadColumns.NUM_FAILED,
+ DownloadColumns.RETRY_AFTER, DownloadColumns.REDIRECT_COUNT,
+ DownloadColumns.INDEX
+ };
+
+ private static final int FILENAME_IDX = 0;
+ private static final int URI_IDX = 1;
+ private static final int ETAG_IDX = 2;
+ private static final int TOTALBYTES_IDX = 3;
+ private static final int CURRENTBYTES_IDX = 4;
+ private static final int LASTMOD_IDX = 5;
+ private static final int STATUS_IDX = 6;
+ private static final int CONTROL_IDX = 7;
+ private static final int NUM_FAILED_IDX = 8;
+ private static final int RETRY_AFTER_IDX = 9;
+ private static final int REDIRECT_COUNT_IDX = 10;
+ private static final int INDEX_IDX = 11;
+
+ /**
* This function will add a new file to the database if it does not exist.
*
* @param di DownloadInfo that we wish to store
* @return the row id of the record to be updated/inserted, or -1
*/
- public boolean updateDownload(DownloadInfo di) {
- ContentValues cv = new ContentValues();
- cv.put(DownloadColumns.INDEX, di.mIndex);
- cv.put(DownloadColumns.FILENAME, di.mFileName);
- cv.put(DownloadColumns.URI, di.mUri);
- cv.put(DownloadColumns.ETAG, di.mETag);
- cv.put(DownloadColumns.TOTALBYTES, di.mTotalBytes);
- cv.put(DownloadColumns.CURRENTBYTES, di.mCurrentBytes);
- cv.put(DownloadColumns.LASTMOD, di.mLastMod);
- cv.put(DownloadColumns.STATUS, di.mStatus);
- cv.put(DownloadColumns.CONTROL, di.mControl);
- cv.put(DownloadColumns.NUM_FAILED, di.mNumFailed);
- cv.put(DownloadColumns.RETRY_AFTER, di.mRetryAfter);
- cv.put(DownloadColumns.REDIRECT_COUNT, di.mRedirectCount);
- return updateDownload(di, cv);
- }
-
- public boolean updateDownload(DownloadInfo di, ContentValues cv) {
- long id = di == null ? -1 : getIDForDownloadInfo(di);
- try {
- final SQLiteDatabase sqldb = mHelper.getWritableDatabase();
- if (id != -1) {
- if (1 != sqldb.update(DownloadColumns.TABLE_NAME,
- cv, DownloadColumns._ID + " = " + id, null)) {
- return false;
- }
- } else {
- return -1 != sqldb.insert(DownloadColumns.TABLE_NAME,
- DownloadColumns.URI, cv);
- }
- } catch (android.database.sqlite.SQLiteException ex) {
- ex.printStackTrace();
- }
- return false;
- }
-
- public int getLastCheckedVersionCode() {
- return mVersionCode;
- }
-
- public boolean isDownloadRequired() {
- final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
- Cursor cur = sqldb.rawQuery("SELECT Count(*) FROM " + DownloadColumns.TABLE_NAME + " WHERE " + DownloadColumns.STATUS + " <> 0", null);
- try {
- if (null != cur && cur.moveToFirst()) {
- return 0 == cur.getInt(0);
- }
- } finally {
- if (null != cur)
- cur.close();
- }
- return true;
- }
-
- public int getFlags() {
- return mFlags;
- }
-
- public boolean updateFlags(int flags) {
- if (mFlags != flags) {
- ContentValues cv = new ContentValues();
- cv.put(MetadataColumns.FLAGS, flags);
- if (updateMetadata(cv)) {
- mFlags = flags;
- return true;
- } else {
- return false;
- }
- } else {
- return true;
- }
- };
-
- public boolean updateStatus(int status) {
- if (mStatus != status) {
- ContentValues cv = new ContentValues();
- cv.put(MetadataColumns.DOWNLOAD_STATUS, status);
- if (updateMetadata(cv)) {
- mStatus = status;
- return true;
- } else {
- return false;
- }
- } else {
- return true;
- }
- };
-
- public boolean updateMetadata(ContentValues cv) {
- final SQLiteDatabase sqldb = mHelper.getWritableDatabase();
- if (-1 == this.mMetadataRowID) {
- long newID = sqldb.insert(MetadataColumns.TABLE_NAME,
- MetadataColumns.APKVERSION, cv);
- if (-1 == newID)
- return false;
- mMetadataRowID = newID;
- } else {
- if (0 == sqldb.update(MetadataColumns.TABLE_NAME, cv,
- BaseColumns._ID + " = " + mMetadataRowID, null))
- return false;
- }
- return true;
- }
-
- public boolean updateMetadata(int apkVersion, int downloadStatus) {
- ContentValues cv = new ContentValues();
- cv.put(MetadataColumns.APKVERSION, apkVersion);
- cv.put(MetadataColumns.DOWNLOAD_STATUS, downloadStatus);
- if (updateMetadata(cv)) {
- mVersionCode = apkVersion;
- mStatus = downloadStatus;
- return true;
- } else {
- return false;
- }
- };
-
- public boolean updateFromDb(DownloadInfo di) {
- final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
- Cursor cur = null;
- try {
- cur = sqldb.query(DownloadColumns.TABLE_NAME, DC_PROJECTION,
- DownloadColumns.FILENAME + "= ?",
- new String[] {
- di.mFileName },
- null, null, null);
- if (null != cur && cur.moveToFirst()) {
- setDownloadInfoFromCursor(di, cur);
- return true;
- }
- return false;
- } finally {
- if (null != cur) {
- cur.close();
- }
- }
- }
-
- public void setDownloadInfoFromCursor(DownloadInfo di, Cursor cur) {
- di.mUri = cur.getString(URI_IDX);
- di.mETag = cur.getString(ETAG_IDX);
- di.mTotalBytes = cur.getLong(TOTALBYTES_IDX);
- di.mCurrentBytes = cur.getLong(CURRENTBYTES_IDX);
- di.mLastMod = cur.getLong(LASTMOD_IDX);
- di.mStatus = cur.getInt(STATUS_IDX);
- di.mControl = cur.getInt(CONTROL_IDX);
- di.mNumFailed = cur.getInt(NUM_FAILED_IDX);
- di.mRetryAfter = cur.getInt(RETRY_AFTER_IDX);
- di.mRedirectCount = cur.getInt(REDIRECT_COUNT_IDX);
- }
-
- public DownloadInfo getDownloadInfoFromCursor(Cursor cur) {
- DownloadInfo di = new DownloadInfo(cur.getInt(INDEX_IDX),
- cur.getString(FILENAME_IDX), this.getClass().getPackage().getName());
- setDownloadInfoFromCursor(di, cur);
- return di;
- }
-
- public DownloadInfo[] getDownloads() {
- final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
- Cursor cur = null;
- try {
- cur = sqldb.query(DownloadColumns.TABLE_NAME, DC_PROJECTION, null,
- null, null, null, null);
- if (null != cur && cur.moveToFirst()) {
- DownloadInfo[] retInfos = new DownloadInfo[cur.getCount()];
- int idx = 0;
- do {
- DownloadInfo di = getDownloadInfoFromCursor(cur);
- retInfos[idx++] = di;
- } while (cur.moveToNext());
- return retInfos;
- }
- return null;
- } finally {
- if (null != cur) {
- cur.close();
- }
- }
- }
+ public boolean updateDownload(DownloadInfo di) {
+ ContentValues cv = new ContentValues();
+ cv.put(DownloadColumns.INDEX, di.mIndex);
+ cv.put(DownloadColumns.FILENAME, di.mFileName);
+ cv.put(DownloadColumns.URI, di.mUri);
+ cv.put(DownloadColumns.ETAG, di.mETag);
+ cv.put(DownloadColumns.TOTALBYTES, di.mTotalBytes);
+ cv.put(DownloadColumns.CURRENTBYTES, di.mCurrentBytes);
+ cv.put(DownloadColumns.LASTMOD, di.mLastMod);
+ cv.put(DownloadColumns.STATUS, di.mStatus);
+ cv.put(DownloadColumns.CONTROL, di.mControl);
+ cv.put(DownloadColumns.NUM_FAILED, di.mNumFailed);
+ cv.put(DownloadColumns.RETRY_AFTER, di.mRetryAfter);
+ cv.put(DownloadColumns.REDIRECT_COUNT, di.mRedirectCount);
+ return updateDownload(di, cv);
+ }
+
+ public boolean updateDownload(DownloadInfo di, ContentValues cv) {
+ long id = di == null ? -1 : getIDForDownloadInfo(di);
+ try {
+ final SQLiteDatabase sqldb = mHelper.getWritableDatabase();
+ if (id != -1) {
+ if (1 != sqldb.update(DownloadColumns.TABLE_NAME,
+ cv, DownloadColumns._ID + " = " + id, null)) {
+ return false;
+ }
+ } else {
+ return -1 != sqldb.insert(DownloadColumns.TABLE_NAME,
+ DownloadColumns.URI, cv);
+ }
+ } catch (android.database.sqlite.SQLiteException ex) {
+ ex.printStackTrace();
+ }
+ return false;
+ }
+
+ public int getLastCheckedVersionCode() {
+ return mVersionCode;
+ }
+
+ public boolean isDownloadRequired() {
+ final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
+ Cursor cur = sqldb.rawQuery("SELECT Count(*) FROM "
+ + DownloadColumns.TABLE_NAME + " WHERE "
+ + DownloadColumns.STATUS + " <> 0", null);
+ try {
+ if (null != cur && cur.moveToFirst()) {
+ return 0 == cur.getInt(0);
+ }
+ } finally {
+ if (null != cur)
+ cur.close();
+ }
+ return true;
+ }
+
+ public int getFlags() {
+ return mFlags;
+ }
+
+ public boolean updateFlags(int flags) {
+ if (mFlags != flags) {
+ ContentValues cv = new ContentValues();
+ cv.put(MetadataColumns.FLAGS, flags);
+ if (updateMetadata(cv)) {
+ mFlags = flags;
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ return true;
+ }
+ };
+
+ public boolean updateStatus(int status) {
+ if (mStatus != status) {
+ ContentValues cv = new ContentValues();
+ cv.put(MetadataColumns.DOWNLOAD_STATUS, status);
+ if (updateMetadata(cv)) {
+ mStatus = status;
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ return true;
+ }
+ };
+
+ public boolean updateMetadata(ContentValues cv) {
+ final SQLiteDatabase sqldb = mHelper.getWritableDatabase();
+ if (-1 == this.mMetadataRowID) {
+ long newID = sqldb.insert(MetadataColumns.TABLE_NAME,
+ MetadataColumns.APKVERSION, cv);
+ if (-1 == newID)
+ return false;
+ mMetadataRowID = newID;
+ } else {
+ if (0 == sqldb.update(MetadataColumns.TABLE_NAME, cv,
+ BaseColumns._ID + " = " + mMetadataRowID, null))
+ return false;
+ }
+ return true;
+ }
+
+ public boolean updateMetadata(int apkVersion, int downloadStatus) {
+ ContentValues cv = new ContentValues();
+ cv.put(MetadataColumns.APKVERSION, apkVersion);
+ cv.put(MetadataColumns.DOWNLOAD_STATUS, downloadStatus);
+ if (updateMetadata(cv)) {
+ mVersionCode = apkVersion;
+ mStatus = downloadStatus;
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ public boolean updateFromDb(DownloadInfo di) {
+ final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
+ Cursor cur = null;
+ try {
+ cur = sqldb.query(DownloadColumns.TABLE_NAME, DC_PROJECTION,
+ DownloadColumns.FILENAME + "= ?",
+ new String[] {
+ di.mFileName
+ }, null, null, null);
+ if (null != cur && cur.moveToFirst()) {
+ setDownloadInfoFromCursor(di, cur);
+ return true;
+ }
+ return false;
+ } finally {
+ if (null != cur) {
+ cur.close();
+ }
+ }
+ }
+
+ public void setDownloadInfoFromCursor(DownloadInfo di, Cursor cur) {
+ di.mUri = cur.getString(URI_IDX);
+ di.mETag = cur.getString(ETAG_IDX);
+ di.mTotalBytes = cur.getLong(TOTALBYTES_IDX);
+ di.mCurrentBytes = cur.getLong(CURRENTBYTES_IDX);
+ di.mLastMod = cur.getLong(LASTMOD_IDX);
+ di.mStatus = cur.getInt(STATUS_IDX);
+ di.mControl = cur.getInt(CONTROL_IDX);
+ di.mNumFailed = cur.getInt(NUM_FAILED_IDX);
+ di.mRetryAfter = cur.getInt(RETRY_AFTER_IDX);
+ di.mRedirectCount = cur.getInt(REDIRECT_COUNT_IDX);
+ }
+
+ public DownloadInfo getDownloadInfoFromCursor(Cursor cur) {
+ DownloadInfo di = new DownloadInfo(cur.getInt(INDEX_IDX),
+ cur.getString(FILENAME_IDX), this.getClass().getPackage()
+ .getName());
+ setDownloadInfoFromCursor(di, cur);
+ return di;
+ }
+
+ public DownloadInfo[] getDownloads() {
+ final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
+ Cursor cur = null;
+ try {
+ cur = sqldb.query(DownloadColumns.TABLE_NAME, DC_PROJECTION, null,
+ null, null, null, null);
+ if (null != cur && cur.moveToFirst()) {
+ DownloadInfo[] retInfos = new DownloadInfo[cur.getCount()];
+ int idx = 0;
+ do {
+ DownloadInfo di = getDownloadInfoFromCursor(cur);
+ retInfos[idx++] = di;
+ } while (cur.moveToNext());
+ return retInfos;
+ }
+ return null;
+ } finally {
+ if (null != cur) {
+ cur.close();
+ }
+ }
+ }
+
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java
index 02bd1f27f6..3f440e9893 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java
@@ -27,7 +27,7 @@ import java.util.regex.Pattern;
*/
public final class HttpDateTime {
- /*
+ /*
* Regular expression for parsing HTTP-date. Wdy, DD Mon YYYY HH:MM:SS GMT
* RFC 822, updated by RFC 1123 Weekday, DD-Mon-YY HH:MM:SS GMT RFC 850,
* obsoleted by RFC 1036 Wdy Mon DD HH:MM:SS YYYY ANSI C's asctime() format
@@ -37,155 +37,164 @@ public final class HttpDateTime {
* (SP)D HH:MM:SS YYYY Wdy Mon DD HH:MM:SS YYYY GMT HH can be H if the first
* digit is zero. Mon can be the full name of the month.
*/
- private static final String HTTP_DATE_RFC_REGEXP =
- "([0-9]{1,2})[- ]([A-Za-z]{3,9})[- ]([0-9]{2,4})[ ]"
- + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])";
+ private static final String HTTP_DATE_RFC_REGEXP =
+ "([0-9]{1,2})[- ]([A-Za-z]{3,9})[- ]([0-9]{2,4})[ ]"
+ + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])";
- private static final String HTTP_DATE_ANSIC_REGEXP =
- "[ ]([A-Za-z]{3,9})[ ]+([0-9]{1,2})[ ]"
- + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])[ ]([0-9]{2,4})";
+ private static final String HTTP_DATE_ANSIC_REGEXP =
+ "[ ]([A-Za-z]{3,9})[ ]+([0-9]{1,2})[ ]"
+ + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])[ ]([0-9]{2,4})";
- /**
+ /**
* The compiled version of the HTTP-date regular expressions.
*/
- private static final Pattern HTTP_DATE_RFC_PATTERN =
- Pattern.compile(HTTP_DATE_RFC_REGEXP);
- private static final Pattern HTTP_DATE_ANSIC_PATTERN =
- Pattern.compile(HTTP_DATE_ANSIC_REGEXP);
-
- private static class TimeOfDay {
- TimeOfDay(int h, int m, int s) {
- this.hour = h;
- this.minute = m;
- this.second = s;
- }
-
- int hour;
- int minute;
- int second;
- }
-
- public static long parse(String timeString)
- throws IllegalArgumentException {
-
- int date = 1;
- int month = Calendar.JANUARY;
- int year = 1970;
- TimeOfDay timeOfDay;
-
- Matcher rfcMatcher = HTTP_DATE_RFC_PATTERN.matcher(timeString);
- if (rfcMatcher.find()) {
- date = getDate(rfcMatcher.group(1));
- month = getMonth(rfcMatcher.group(2));
- year = getYear(rfcMatcher.group(3));
- timeOfDay = getTime(rfcMatcher.group(4));
- } else {
- Matcher ansicMatcher = HTTP_DATE_ANSIC_PATTERN.matcher(timeString);
- if (ansicMatcher.find()) {
- month = getMonth(ansicMatcher.group(1));
- date = getDate(ansicMatcher.group(2));
- timeOfDay = getTime(ansicMatcher.group(3));
- year = getYear(ansicMatcher.group(4));
- } else {
- throw new IllegalArgumentException();
- }
- }
-
- // FIXME: Y2038 BUG!
- if (year >= 2038) {
- year = 2038;
- month = Calendar.JANUARY;
- date = 1;
- }
-
- Time time = new Time(Time.TIMEZONE_UTC);
- time.set(timeOfDay.second, timeOfDay.minute, timeOfDay.hour, date,
- month, year);
- return time.toMillis(false /* use isDst */);
- }
-
- private static int getDate(String dateString) {
- if (dateString.length() == 2) {
- return (dateString.charAt(0) - '0') * 10 + (dateString.charAt(1) - '0');
- } else {
- return (dateString.charAt(0) - '0');
- }
- }
-
- /*
+ private static final Pattern HTTP_DATE_RFC_PATTERN =
+ Pattern.compile(HTTP_DATE_RFC_REGEXP);
+ private static final Pattern HTTP_DATE_ANSIC_PATTERN =
+ Pattern.compile(HTTP_DATE_ANSIC_REGEXP);
+
+ private static class TimeOfDay {
+ TimeOfDay(int h, int m, int s) {
+ this.hour = h;
+ this.minute = m;
+ this.second = s;
+ }
+
+ int hour;
+ int minute;
+ int second;
+ }
+
+ public static long parse(String timeString)
+ throws IllegalArgumentException {
+
+ int date = 1;
+ int month = Calendar.JANUARY;
+ int year = 1970;
+ TimeOfDay timeOfDay;
+
+ Matcher rfcMatcher = HTTP_DATE_RFC_PATTERN.matcher(timeString);
+ if (rfcMatcher.find()) {
+ date = getDate(rfcMatcher.group(1));
+ month = getMonth(rfcMatcher.group(2));
+ year = getYear(rfcMatcher.group(3));
+ timeOfDay = getTime(rfcMatcher.group(4));
+ } else {
+ Matcher ansicMatcher = HTTP_DATE_ANSIC_PATTERN.matcher(timeString);
+ if (ansicMatcher.find()) {
+ month = getMonth(ansicMatcher.group(1));
+ date = getDate(ansicMatcher.group(2));
+ timeOfDay = getTime(ansicMatcher.group(3));
+ year = getYear(ansicMatcher.group(4));
+ } else {
+ throw new IllegalArgumentException();
+ }
+ }
+
+ // FIXME: Y2038 BUG!
+ if (year >= 2038) {
+ year = 2038;
+ month = Calendar.JANUARY;
+ date = 1;
+ }
+
+ Time time = new Time(Time.TIMEZONE_UTC);
+ time.set(timeOfDay.second, timeOfDay.minute, timeOfDay.hour, date,
+ month, year);
+ return time.toMillis(false /* use isDst */);
+ }
+
+ private static int getDate(String dateString) {
+ if (dateString.length() == 2) {
+ return (dateString.charAt(0) - '0') * 10
+ + (dateString.charAt(1) - '0');
+ } else {
+ return (dateString.charAt(0) - '0');
+ }
+ }
+
+ /*
* jan = 9 + 0 + 13 = 22 feb = 5 + 4 + 1 = 10 mar = 12 + 0 + 17 = 29 apr = 0
* + 15 + 17 = 32 may = 12 + 0 + 24 = 36 jun = 9 + 20 + 13 = 42 jul = 9 + 20
* + 11 = 40 aug = 0 + 20 + 6 = 26 sep = 18 + 4 + 15 = 37 oct = 14 + 2 + 19
* = 35 nov = 13 + 14 + 21 = 48 dec = 3 + 4 + 2 = 9
*/
- private static int getMonth(String monthString) {
- int hash = Character.toLowerCase(monthString.charAt(0)) +
- Character.toLowerCase(monthString.charAt(1)) +
- Character.toLowerCase(monthString.charAt(2)) - 3 * 'a';
- switch (hash) {
- case 22:
- return Calendar.JANUARY;
- case 10:
- return Calendar.FEBRUARY;
- case 29:
- return Calendar.MARCH;
- case 32:
- return Calendar.APRIL;
- case 36:
- return Calendar.MAY;
- case 42:
- return Calendar.JUNE;
- case 40:
- return Calendar.JULY;
- case 26:
- return Calendar.AUGUST;
- case 37:
- return Calendar.SEPTEMBER;
- case 35:
- return Calendar.OCTOBER;
- case 48:
- return Calendar.NOVEMBER;
- case 9:
- return Calendar.DECEMBER;
- default:
- throw new IllegalArgumentException();
- }
- }
-
- private static int getYear(String yearString) {
- if (yearString.length() == 2) {
- int year = (yearString.charAt(0) - '0') * 10 + (yearString.charAt(1) - '0');
- if (year >= 70) {
- return year + 1900;
- } else {
- return year + 2000;
- }
- } else if (yearString.length() == 3) {
- // According to RFC 2822, three digit years should be added to 1900.
- int year = (yearString.charAt(0) - '0') * 100 + (yearString.charAt(1) - '0') * 10 + (yearString.charAt(2) - '0');
- return year + 1900;
- } else if (yearString.length() == 4) {
- return (yearString.charAt(0) - '0') * 1000 + (yearString.charAt(1) - '0') * 100 + (yearString.charAt(2) - '0') * 10 + (yearString.charAt(3) - '0');
- } else {
- return 1970;
- }
- }
-
- private static TimeOfDay getTime(String timeString) {
- // HH might be H
- int i = 0;
- int hour = timeString.charAt(i++) - '0';
- if (timeString.charAt(i) != ':')
- hour = hour * 10 + (timeString.charAt(i++) - '0');
- // Skip ':'
- i++;
-
- int minute = (timeString.charAt(i++) - '0') * 10 + (timeString.charAt(i++) - '0');
- // Skip ':'
- i++;
-
- int second = (timeString.charAt(i++) - '0') * 10 + (timeString.charAt(i++) - '0');
-
- return new TimeOfDay(hour, minute, second);
- }
+ private static int getMonth(String monthString) {
+ int hash = Character.toLowerCase(monthString.charAt(0)) +
+ Character.toLowerCase(monthString.charAt(1)) +
+ Character.toLowerCase(monthString.charAt(2)) - 3 * 'a';
+ switch (hash) {
+ case 22:
+ return Calendar.JANUARY;
+ case 10:
+ return Calendar.FEBRUARY;
+ case 29:
+ return Calendar.MARCH;
+ case 32:
+ return Calendar.APRIL;
+ case 36:
+ return Calendar.MAY;
+ case 42:
+ return Calendar.JUNE;
+ case 40:
+ return Calendar.JULY;
+ case 26:
+ return Calendar.AUGUST;
+ case 37:
+ return Calendar.SEPTEMBER;
+ case 35:
+ return Calendar.OCTOBER;
+ case 48:
+ return Calendar.NOVEMBER;
+ case 9:
+ return Calendar.DECEMBER;
+ default:
+ throw new IllegalArgumentException();
+ }
+ }
+
+ private static int getYear(String yearString) {
+ if (yearString.length() == 2) {
+ int year = (yearString.charAt(0) - '0') * 10
+ + (yearString.charAt(1) - '0');
+ if (year >= 70) {
+ return year + 1900;
+ } else {
+ return year + 2000;
+ }
+ } else if (yearString.length() == 3) {
+ // According to RFC 2822, three digit years should be added to 1900.
+ int year = (yearString.charAt(0) - '0') * 100
+ + (yearString.charAt(1) - '0') * 10
+ + (yearString.charAt(2) - '0');
+ return year + 1900;
+ } else if (yearString.length() == 4) {
+ return (yearString.charAt(0) - '0') * 1000
+ + (yearString.charAt(1) - '0') * 100
+ + (yearString.charAt(2) - '0') * 10
+ + (yearString.charAt(3) - '0');
+ } else {
+ return 1970;
+ }
+ }
+
+ private static TimeOfDay getTime(String timeString) {
+ // HH might be H
+ int i = 0;
+ int hour = timeString.charAt(i++) - '0';
+ if (timeString.charAt(i) != ':')
+ hour = hour * 10 + (timeString.charAt(i++) - '0');
+ // Skip ':'
+ i++;
+
+ int minute = (timeString.charAt(i++) - '0') * 10
+ + (timeString.charAt(i++) - '0');
+ // Skip ':'
+ i++;
+
+ int second = (timeString.charAt(i++) - '0') * 10
+ + (timeString.charAt(i++) - '0');
+
+ return new TimeOfDay(hour, minute, second);
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/AESObfuscator.java b/platform/android/java/src/com/google/android/vending/licensing/AESObfuscator.java
index feba3034c3..d6ccb0c5e4 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/AESObfuscator.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/AESObfuscator.java
@@ -36,75 +36,75 @@ import javax.crypto.spec.SecretKeySpec;
* An Obfuscator that uses AES to encrypt data.
*/
public class AESObfuscator implements Obfuscator {
- private static final String UTF8 = "UTF-8";
- private static final String KEYGEN_ALGORITHM = "PBEWITHSHAAND256BITAES-CBC-BC";
- private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
- private static final byte[] IV = { 16, 74, 71, -80, 32, 101, -47, 72, 117, -14, 0, -29, 70, 65, -12, 74 };
- private static final String header = "com.google.android.vending.licensing.AESObfuscator-1|";
+ private static final String UTF8 = "UTF-8";
+ private static final String KEYGEN_ALGORITHM = "PBEWITHSHAAND256BITAES-CBC-BC";
+ private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
+ private static final byte[] IV =
+ { 16, 74, 71, -80, 32, 101, -47, 72, 117, -14, 0, -29, 70, 65, -12, 74 };
+ private static final String header = "com.google.android.vending.licensing.AESObfuscator-1|";
- private Cipher mEncryptor;
- private Cipher mDecryptor;
+ private Cipher mEncryptor;
+ private Cipher mDecryptor;
- /**
+ /**
* @param salt an array of random bytes to use for each (un)obfuscation
* @param applicationId application identifier, e.g. the package name
* @param deviceId device identifier. Use as many sources as possible to
* create this unique identifier.
*/
- public AESObfuscator(byte[] salt, String applicationId, String deviceId) {
- try {
- SecretKeyFactory factory = SecretKeyFactory.getInstance(KEYGEN_ALGORITHM);
- KeySpec keySpec =
- new PBEKeySpec((applicationId + deviceId).toCharArray(), salt, 1024, 256);
- SecretKey tmp = factory.generateSecret(keySpec);
- SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
- mEncryptor = Cipher.getInstance(CIPHER_ALGORITHM);
- mEncryptor.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(IV));
- mDecryptor = Cipher.getInstance(CIPHER_ALGORITHM);
- mDecryptor.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(IV));
- } catch (GeneralSecurityException e) {
- // This can't happen on a compatible Android device.
- throw new RuntimeException("Invalid environment", e);
- }
- }
+ public AESObfuscator(byte[] salt, String applicationId, String deviceId) {
+ try {
+ SecretKeyFactory factory = SecretKeyFactory.getInstance(KEYGEN_ALGORITHM);
+ KeySpec keySpec =
+ new PBEKeySpec((applicationId + deviceId).toCharArray(), salt, 1024, 256);
+ SecretKey tmp = factory.generateSecret(keySpec);
+ SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
+ mEncryptor = Cipher.getInstance(CIPHER_ALGORITHM);
+ mEncryptor.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(IV));
+ mDecryptor = Cipher.getInstance(CIPHER_ALGORITHM);
+ mDecryptor.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(IV));
+ } catch (GeneralSecurityException e) {
+ // This can't happen on a compatible Android device.
+ throw new RuntimeException("Invalid environment", e);
+ }
+ }
- public String obfuscate(String original, String key) {
- if (original == null) {
- return null;
- }
- try {
- // Header is appended as an integrity check
- return Base64.encode(mEncryptor.doFinal((header + key + original).getBytes(UTF8)));
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException("Invalid environment", e);
- } catch (GeneralSecurityException e) {
- throw new RuntimeException("Invalid environment", e);
- }
- }
+ public String obfuscate(String original, String key) {
+ if (original == null) {
+ return null;
+ }
+ try {
+ // Header is appended as an integrity check
+ return Base64.encode(mEncryptor.doFinal((header + key + original).getBytes(UTF8)));
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException("Invalid environment", e);
+ } catch (GeneralSecurityException e) {
+ throw new RuntimeException("Invalid environment", e);
+ }
+ }
- public String unobfuscate(String obfuscated, String key) throws ValidationException {
- if (obfuscated == null) {
- return null;
- }
- try {
- String result = new String(mDecryptor.doFinal(Base64.decode(obfuscated)), UTF8);
- // Check for presence of header. This serves as a final integrity check, for cases
- // where the block size is correct during decryption.
- int headerIndex = result.indexOf(header + key);
- if (headerIndex != 0) {
- throw new ValidationException("Header not found (invalid data or key)"
- + ":" +
- obfuscated);
- }
- return result.substring(header.length() + key.length(), result.length());
- } catch (Base64DecoderException e) {
- throw new ValidationException(e.getMessage() + ":" + obfuscated);
- } catch (IllegalBlockSizeException e) {
- throw new ValidationException(e.getMessage() + ":" + obfuscated);
- } catch (BadPaddingException e) {
- throw new ValidationException(e.getMessage() + ":" + obfuscated);
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException("Invalid environment", e);
- }
- }
+ public String unobfuscate(String obfuscated, String key) throws ValidationException {
+ if (obfuscated == null) {
+ return null;
+ }
+ try {
+ String result = new String(mDecryptor.doFinal(Base64.decode(obfuscated)), UTF8);
+ // Check for presence of header. This serves as a final integrity check, for cases
+ // where the block size is correct during decryption.
+ int headerIndex = result.indexOf(header+key);
+ if (headerIndex != 0) {
+ throw new ValidationException("Header not found (invalid data or key)" + ":" +
+ obfuscated);
+ }
+ return result.substring(header.length()+key.length(), result.length());
+ } catch (Base64DecoderException e) {
+ throw new ValidationException(e.getMessage() + ":" + obfuscated);
+ } catch (IllegalBlockSizeException e) {
+ throw new ValidationException(e.getMessage() + ":" + obfuscated);
+ } catch (BadPaddingException e) {
+ throw new ValidationException(e.getMessage() + ":" + obfuscated);
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException("Invalid environment", e);
+ }
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/APKExpansionPolicy.java b/platform/android/java/src/com/google/android/vending/licensing/APKExpansionPolicy.java
index 2c60e7e4b8..37fad8926a 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/APKExpansionPolicy.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/APKExpansionPolicy.java
@@ -46,73 +46,73 @@ import java.util.Vector;
*/
public class APKExpansionPolicy implements Policy {
- private static final String TAG = "APKExpansionPolicy";
- private static final String PREFS_FILE = "com.google.android.vending.licensing.APKExpansionPolicy";
- private static final String PREF_LAST_RESPONSE = "lastResponse";
- private static final String PREF_VALIDITY_TIMESTAMP = "validityTimestamp";
- private static final String PREF_RETRY_UNTIL = "retryUntil";
- private static final String PREF_MAX_RETRIES = "maxRetries";
- private static final String PREF_RETRY_COUNT = "retryCount";
- private static final String PREF_LICENSING_URL = "licensingUrl";
- private static final String DEFAULT_VALIDITY_TIMESTAMP = "0";
- private static final String DEFAULT_RETRY_UNTIL = "0";
- private static final String DEFAULT_MAX_RETRIES = "0";
- private static final String DEFAULT_RETRY_COUNT = "0";
-
- private static final long MILLIS_PER_MINUTE = 60 * 1000;
-
- private long mValidityTimestamp;
- private long mRetryUntil;
- private long mMaxRetries;
- private long mRetryCount;
- private long mLastResponseTime = 0;
- private int mLastResponse;
- private String mLicensingUrl;
- private PreferenceObfuscator mPreferences;
- private Vector<String> mExpansionURLs = new Vector<String>();
- private Vector<String> mExpansionFileNames = new Vector<String>();
- private Vector<Long> mExpansionFileSizes = new Vector<Long>();
-
- /**
+ private static final String TAG = "APKExpansionPolicy";
+ private static final String PREFS_FILE = "com.google.android.vending.licensing.APKExpansionPolicy";
+ private static final String PREF_LAST_RESPONSE = "lastResponse";
+ private static final String PREF_VALIDITY_TIMESTAMP = "validityTimestamp";
+ private static final String PREF_RETRY_UNTIL = "retryUntil";
+ private static final String PREF_MAX_RETRIES = "maxRetries";
+ private static final String PREF_RETRY_COUNT = "retryCount";
+ private static final String PREF_LICENSING_URL = "licensingUrl";
+ private static final String DEFAULT_VALIDITY_TIMESTAMP = "0";
+ private static final String DEFAULT_RETRY_UNTIL = "0";
+ private static final String DEFAULT_MAX_RETRIES = "0";
+ private static final String DEFAULT_RETRY_COUNT = "0";
+
+ private static final long MILLIS_PER_MINUTE = 60 * 1000;
+
+ private long mValidityTimestamp;
+ private long mRetryUntil;
+ private long mMaxRetries;
+ private long mRetryCount;
+ private long mLastResponseTime = 0;
+ private int mLastResponse;
+ private String mLicensingUrl;
+ private PreferenceObfuscator mPreferences;
+ private Vector<String> mExpansionURLs = new Vector<String>();
+ private Vector<String> mExpansionFileNames = new Vector<String>();
+ private Vector<Long> mExpansionFileSizes = new Vector<Long>();
+
+ /**
* The design of the protocol supports n files. Currently the market can
* only deliver two files. To accommodate this, we have these two constants,
* but the order is the only relevant thing here.
*/
- public static final int MAIN_FILE_URL_INDEX = 0;
- public static final int PATCH_FILE_URL_INDEX = 1;
+ public static final int MAIN_FILE_URL_INDEX = 0;
+ public static final int PATCH_FILE_URL_INDEX = 1;
- /**
+ /**
* @param context The context for the current application
* @param obfuscator An obfuscator to be used with preferences.
*/
- public APKExpansionPolicy(Context context, Obfuscator obfuscator) {
- // Import old values
- SharedPreferences sp = context.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE);
- mPreferences = new PreferenceObfuscator(sp, obfuscator);
- mLastResponse = Integer.parseInt(
- mPreferences.getString(PREF_LAST_RESPONSE, Integer.toString(Policy.RETRY)));
- mValidityTimestamp = Long.parseLong(mPreferences.getString(PREF_VALIDITY_TIMESTAMP,
- DEFAULT_VALIDITY_TIMESTAMP));
- mRetryUntil = Long.parseLong(mPreferences.getString(PREF_RETRY_UNTIL, DEFAULT_RETRY_UNTIL));
- mMaxRetries = Long.parseLong(mPreferences.getString(PREF_MAX_RETRIES, DEFAULT_MAX_RETRIES));
- mRetryCount = Long.parseLong(mPreferences.getString(PREF_RETRY_COUNT, DEFAULT_RETRY_COUNT));
- mLicensingUrl = mPreferences.getString(PREF_LICENSING_URL, null);
- }
-
- /**
+ public APKExpansionPolicy(Context context, Obfuscator obfuscator) {
+ // Import old values
+ SharedPreferences sp = context.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE);
+ mPreferences = new PreferenceObfuscator(sp, obfuscator);
+ mLastResponse = Integer.parseInt(
+ mPreferences.getString(PREF_LAST_RESPONSE, Integer.toString(Policy.RETRY)));
+ mValidityTimestamp = Long.parseLong(mPreferences.getString(PREF_VALIDITY_TIMESTAMP,
+ DEFAULT_VALIDITY_TIMESTAMP));
+ mRetryUntil = Long.parseLong(mPreferences.getString(PREF_RETRY_UNTIL, DEFAULT_RETRY_UNTIL));
+ mMaxRetries = Long.parseLong(mPreferences.getString(PREF_MAX_RETRIES, DEFAULT_MAX_RETRIES));
+ mRetryCount = Long.parseLong(mPreferences.getString(PREF_RETRY_COUNT, DEFAULT_RETRY_COUNT));
+ mLicensingUrl = mPreferences.getString(PREF_LICENSING_URL, null);
+ }
+
+ /**
* We call this to guarantee that we fetch a fresh policy from the server.
* This is to be used if the URL is invalid.
*/
- public void resetPolicy() {
- mPreferences.putString(PREF_LAST_RESPONSE, Integer.toString(Policy.RETRY));
- setRetryUntil(DEFAULT_RETRY_UNTIL);
- setMaxRetries(DEFAULT_MAX_RETRIES);
- setRetryCount(Long.parseLong(DEFAULT_RETRY_COUNT));
- setValidityTimestamp(DEFAULT_VALIDITY_TIMESTAMP);
- mPreferences.commit();
- }
-
- /**
+ public void resetPolicy() {
+ mPreferences.putString(PREF_LAST_RESPONSE, Integer.toString(Policy.RETRY));
+ setRetryUntil(DEFAULT_RETRY_UNTIL);
+ setMaxRetries(DEFAULT_MAX_RETRIES);
+ setRetryCount(Long.parseLong(DEFAULT_RETRY_COUNT));
+ setValidityTimestamp(DEFAULT_VALIDITY_TIMESTAMP);
+ mPreferences.commit();
+ }
+
+ /**
* Process a new response from the license server.
* <p>
* This data will be used for computing future policy decisions. The
@@ -129,187 +129,187 @@ public class APKExpansionPolicy implements Policy {
* @param response the result from validating the server response
* @param rawData the raw server response data
*/
- public void processServerResponse(int response,
- com.google.android.vending.licensing.ResponseData rawData) {
-
- // Update retry counter
- if (response != Policy.RETRY) {
- setRetryCount(0);
- } else {
- setRetryCount(mRetryCount + 1);
- }
-
- // Update server policy data
- Map<String, String> extras = decodeExtras(rawData);
- if (response == Policy.LICENSED) {
- mLastResponse = response;
- // Reset the licensing URL since it is only applicable for NOT_LICENSED responses.
- setLicensingUrl(null);
- setValidityTimestamp(Long.toString(System.currentTimeMillis() + MILLIS_PER_MINUTE));
- Set<String> keys = extras.keySet();
- for (String key : keys) {
- if (key.equals("VT")) {
- setValidityTimestamp(extras.get(key));
- } else if (key.equals("GT")) {
- setRetryUntil(extras.get(key));
- } else if (key.equals("GR")) {
- setMaxRetries(extras.get(key));
- } else if (key.startsWith("FILE_URL")) {
- int index = Integer.parseInt(key.substring("FILE_URL".length())) - 1;
- setExpansionURL(index, extras.get(key));
- } else if (key.startsWith("FILE_NAME")) {
- int index = Integer.parseInt(key.substring("FILE_NAME".length())) - 1;
- setExpansionFileName(index, extras.get(key));
- } else if (key.startsWith("FILE_SIZE")) {
- int index = Integer.parseInt(key.substring("FILE_SIZE".length())) - 1;
- setExpansionFileSize(index, Long.parseLong(extras.get(key)));
- }
- }
- } else if (response == Policy.NOT_LICENSED) {
- // Clear out stale retry params
- setValidityTimestamp(DEFAULT_VALIDITY_TIMESTAMP);
- setRetryUntil(DEFAULT_RETRY_UNTIL);
- setMaxRetries(DEFAULT_MAX_RETRIES);
- // Update the licensing URL
- setLicensingUrl(extras.get("LU"));
- }
-
- setLastResponse(response);
- mPreferences.commit();
- }
-
- /**
+ public void processServerResponse(int response,
+ com.google.android.vending.licensing.ResponseData rawData) {
+
+ // Update retry counter
+ if (response != Policy.RETRY) {
+ setRetryCount(0);
+ } else {
+ setRetryCount(mRetryCount + 1);
+ }
+
+ // Update server policy data
+ Map<String, String> extras = decodeExtras(rawData);
+ if (response == Policy.LICENSED) {
+ mLastResponse = response;
+ // Reset the licensing URL since it is only applicable for NOT_LICENSED responses.
+ setLicensingUrl(null);
+ setValidityTimestamp(Long.toString(System.currentTimeMillis() + MILLIS_PER_MINUTE));
+ Set<String> keys = extras.keySet();
+ for (String key : keys) {
+ if (key.equals("VT")) {
+ setValidityTimestamp(extras.get(key));
+ } else if (key.equals("GT")) {
+ setRetryUntil(extras.get(key));
+ } else if (key.equals("GR")) {
+ setMaxRetries(extras.get(key));
+ } else if (key.startsWith("FILE_URL")) {
+ int index = Integer.parseInt(key.substring("FILE_URL".length())) - 1;
+ setExpansionURL(index, extras.get(key));
+ } else if (key.startsWith("FILE_NAME")) {
+ int index = Integer.parseInt(key.substring("FILE_NAME".length())) - 1;
+ setExpansionFileName(index, extras.get(key));
+ } else if (key.startsWith("FILE_SIZE")) {
+ int index = Integer.parseInt(key.substring("FILE_SIZE".length())) - 1;
+ setExpansionFileSize(index, Long.parseLong(extras.get(key)));
+ }
+ }
+ } else if (response == Policy.NOT_LICENSED) {
+ // Clear out stale retry params
+ setValidityTimestamp(DEFAULT_VALIDITY_TIMESTAMP);
+ setRetryUntil(DEFAULT_RETRY_UNTIL);
+ setMaxRetries(DEFAULT_MAX_RETRIES);
+ // Update the licensing URL
+ setLicensingUrl(extras.get("LU"));
+ }
+
+ setLastResponse(response);
+ mPreferences.commit();
+ }
+
+ /**
* Set the last license response received from the server and add to
* preferences. You must manually call PreferenceObfuscator.commit() to
* commit these changes to disk.
*
* @param l the response
*/
- private void setLastResponse(int l) {
- mLastResponseTime = System.currentTimeMillis();
- mLastResponse = l;
- mPreferences.putString(PREF_LAST_RESPONSE, Integer.toString(l));
- }
+ private void setLastResponse(int l) {
+ mLastResponseTime = System.currentTimeMillis();
+ mLastResponse = l;
+ mPreferences.putString(PREF_LAST_RESPONSE, Integer.toString(l));
+ }
- /**
+ /**
* Set the current retry count and add to preferences. You must manually
* call PreferenceObfuscator.commit() to commit these changes to disk.
*
* @param c the new retry count
*/
- private void setRetryCount(long c) {
- mRetryCount = c;
- mPreferences.putString(PREF_RETRY_COUNT, Long.toString(c));
- }
+ private void setRetryCount(long c) {
+ mRetryCount = c;
+ mPreferences.putString(PREF_RETRY_COUNT, Long.toString(c));
+ }
- public long getRetryCount() {
- return mRetryCount;
- }
+ public long getRetryCount() {
+ return mRetryCount;
+ }
- /**
+ /**
* Set the last validity timestamp (VT) received from the server and add to
* preferences. You must manually call PreferenceObfuscator.commit() to
* commit these changes to disk.
*
* @param validityTimestamp the VT string received
*/
- private void setValidityTimestamp(String validityTimestamp) {
- Long lValidityTimestamp;
- try {
- lValidityTimestamp = Long.parseLong(validityTimestamp);
- } catch (NumberFormatException e) {
- // No response or not parseable, expire in one minute.
- Log.w(TAG, "License validity timestamp (VT) missing, caching for a minute");
- lValidityTimestamp = System.currentTimeMillis() + MILLIS_PER_MINUTE;
- validityTimestamp = Long.toString(lValidityTimestamp);
- }
-
- mValidityTimestamp = lValidityTimestamp;
- mPreferences.putString(PREF_VALIDITY_TIMESTAMP, validityTimestamp);
- }
-
- public long getValidityTimestamp() {
- return mValidityTimestamp;
- }
-
- /**
+ private void setValidityTimestamp(String validityTimestamp) {
+ Long lValidityTimestamp;
+ try {
+ lValidityTimestamp = Long.parseLong(validityTimestamp);
+ } catch (NumberFormatException e) {
+ // No response or not parseable, expire in one minute.
+ Log.w(TAG, "License validity timestamp (VT) missing, caching for a minute");
+ lValidityTimestamp = System.currentTimeMillis() + MILLIS_PER_MINUTE;
+ validityTimestamp = Long.toString(lValidityTimestamp);
+ }
+
+ mValidityTimestamp = lValidityTimestamp;
+ mPreferences.putString(PREF_VALIDITY_TIMESTAMP, validityTimestamp);
+ }
+
+ public long getValidityTimestamp() {
+ return mValidityTimestamp;
+ }
+
+ /**
* Set the retry until timestamp (GT) received from the server and add to
* preferences. You must manually call PreferenceObfuscator.commit() to
* commit these changes to disk.
*
* @param retryUntil the GT string received
*/
- private void setRetryUntil(String retryUntil) {
- Long lRetryUntil;
- try {
- lRetryUntil = Long.parseLong(retryUntil);
- } catch (NumberFormatException e) {
- // No response or not parseable, expire immediately
- Log.w(TAG, "License retry timestamp (GT) missing, grace period disabled");
- retryUntil = "0";
- lRetryUntil = 0l;
- }
-
- mRetryUntil = lRetryUntil;
- mPreferences.putString(PREF_RETRY_UNTIL, retryUntil);
- }
-
- public long getRetryUntil() {
- return mRetryUntil;
- }
-
- /**
+ private void setRetryUntil(String retryUntil) {
+ Long lRetryUntil;
+ try {
+ lRetryUntil = Long.parseLong(retryUntil);
+ } catch (NumberFormatException e) {
+ // No response or not parseable, expire immediately
+ Log.w(TAG, "License retry timestamp (GT) missing, grace period disabled");
+ retryUntil = "0";
+ lRetryUntil = 0l;
+ }
+
+ mRetryUntil = lRetryUntil;
+ mPreferences.putString(PREF_RETRY_UNTIL, retryUntil);
+ }
+
+ public long getRetryUntil() {
+ return mRetryUntil;
+ }
+
+ /**
* Set the max retries value (GR) as received from the server and add to
* preferences. You must manually call PreferenceObfuscator.commit() to
* commit these changes to disk.
*
* @param maxRetries the GR string received
*/
- private void setMaxRetries(String maxRetries) {
- Long lMaxRetries;
- try {
- lMaxRetries = Long.parseLong(maxRetries);
- } catch (NumberFormatException e) {
- // No response or not parseable, expire immediately
- Log.w(TAG, "Licence retry count (GR) missing, grace period disabled");
- maxRetries = "0";
- lMaxRetries = 0l;
- }
-
- mMaxRetries = lMaxRetries;
- mPreferences.putString(PREF_MAX_RETRIES, maxRetries);
- }
-
- public long getMaxRetries() {
- return mMaxRetries;
- }
-
- /**
+ private void setMaxRetries(String maxRetries) {
+ Long lMaxRetries;
+ try {
+ lMaxRetries = Long.parseLong(maxRetries);
+ } catch (NumberFormatException e) {
+ // No response or not parseable, expire immediately
+ Log.w(TAG, "Licence retry count (GR) missing, grace period disabled");
+ maxRetries = "0";
+ lMaxRetries = 0l;
+ }
+
+ mMaxRetries = lMaxRetries;
+ mPreferences.putString(PREF_MAX_RETRIES, maxRetries);
+ }
+
+ public long getMaxRetries() {
+ return mMaxRetries;
+ }
+
+ /**
* Set the licensing URL that displays a Play Store UI for the user to regain app access.
*
* @param url the LU string received
*/
- private void setLicensingUrl(String url) {
- mLicensingUrl = url;
- mPreferences.putString(PREF_LICENSING_URL, url);
- }
+ private void setLicensingUrl(String url) {
+ mLicensingUrl = url;
+ mPreferences.putString(PREF_LICENSING_URL, url);
+ }
- public String getLicensingUrl() {
- return mLicensingUrl;
- }
+ public String getLicensingUrl() {
+ return mLicensingUrl;
+ }
- /**
+ /**
* Gets the count of expansion URLs. Since expansionURLs are not committed
* to preferences, this will return zero if there has been no LVL fetch
* in the current session.
*
* @return the number of expansion URLs. (0,1,2)
*/
- public int getExpansionURLCount() {
- return mExpansionURLs.size();
- }
+ public int getExpansionURLCount() {
+ return mExpansionURLs.size();
+ }
- /**
+ /**
* Gets the expansion URL. Since these URLs are not committed to
* preferences, this will always return null if there has not been an LVL
* fetch in the current session.
@@ -317,14 +317,14 @@ public class APKExpansionPolicy implements Policy {
* @param index the index of the URL to fetch. This value will be either
* MAIN_FILE_URL_INDEX or PATCH_FILE_URL_INDEX
*/
- public String getExpansionURL(int index) {
- if (index < mExpansionURLs.size()) {
- return mExpansionURLs.elementAt(index);
- }
- return null;
- }
-
- /**
+ public String getExpansionURL(int index) {
+ if (index < mExpansionURLs.size()) {
+ return mExpansionURLs.elementAt(index);
+ }
+ return null;
+ }
+
+ /**
* Sets the expansion URL. Expansion URL's are not committed to preferences,
* but are instead intended to be stored when the license response is
* processed by the front-end.
@@ -333,42 +333,42 @@ public class APKExpansionPolicy implements Policy {
* MAIN_FILE_URL_INDEX or PATCH_FILE_URL_INDEX
* @param URL the URL to set
*/
- public void setExpansionURL(int index, String URL) {
- if (index >= mExpansionURLs.size()) {
- mExpansionURLs.setSize(index + 1);
- }
- mExpansionURLs.set(index, URL);
- }
-
- public String getExpansionFileName(int index) {
- if (index < mExpansionFileNames.size()) {
- return mExpansionFileNames.elementAt(index);
- }
- return null;
- }
-
- public void setExpansionFileName(int index, String name) {
- if (index >= mExpansionFileNames.size()) {
- mExpansionFileNames.setSize(index + 1);
- }
- mExpansionFileNames.set(index, name);
- }
-
- public long getExpansionFileSize(int index) {
- if (index < mExpansionFileSizes.size()) {
- return mExpansionFileSizes.elementAt(index);
- }
- return -1;
- }
-
- public void setExpansionFileSize(int index, long size) {
- if (index >= mExpansionFileSizes.size()) {
- mExpansionFileSizes.setSize(index + 1);
- }
- mExpansionFileSizes.set(index, size);
- }
-
- /**
+ public void setExpansionURL(int index, String URL) {
+ if (index >= mExpansionURLs.size()) {
+ mExpansionURLs.setSize(index + 1);
+ }
+ mExpansionURLs.set(index, URL);
+ }
+
+ public String getExpansionFileName(int index) {
+ if (index < mExpansionFileNames.size()) {
+ return mExpansionFileNames.elementAt(index);
+ }
+ return null;
+ }
+
+ public void setExpansionFileName(int index, String name) {
+ if (index >= mExpansionFileNames.size()) {
+ mExpansionFileNames.setSize(index + 1);
+ }
+ mExpansionFileNames.set(index, name);
+ }
+
+ public long getExpansionFileSize(int index) {
+ if (index < mExpansionFileSizes.size()) {
+ return mExpansionFileSizes.elementAt(index);
+ }
+ return -1;
+ }
+
+ public void setExpansionFileSize(int index, long size) {
+ if (index >= mExpansionFileSizes.size()) {
+ mExpansionFileSizes.setSize(index + 1);
+ }
+ mExpansionFileSizes.set(index, size);
+ }
+
+ /**
* {@inheritDoc} This implementation allows access if either:<br>
* <ol>
* <li>a LICENSED response was received within the validity period
@@ -376,38 +376,39 @@ public class APKExpansionPolicy implements Policy {
* the RETRY count or in the RETRY period.
* </ol>
*/
- public boolean allowAccess() {
- long ts = System.currentTimeMillis();
- if (mLastResponse == Policy.LICENSED) {
- // Check if the LICENSED response occurred within the validity
- // timeout.
- if (ts <= mValidityTimestamp) {
- // Cached LICENSED response is still valid.
- return true;
- }
- } else if (mLastResponse == Policy.RETRY &&
- ts < mLastResponseTime + MILLIS_PER_MINUTE) {
- // Only allow access if we are within the retry period or we haven't
- // used up our
- // max retries.
- return (ts <= mRetryUntil || mRetryCount <= mMaxRetries);
- }
- return false;
- }
-
- private Map<String, String> decodeExtras(
- com.google.android.vending.licensing.ResponseData rawData) {
- Map<String, String> results = new HashMap<String, String>();
- if (rawData == null) {
- return results;
- }
-
- try {
- URI rawExtras = new URI("?" + rawData.extra);
- URIQueryDecoder.DecodeQuery(rawExtras, results);
- } catch (URISyntaxException e) {
- Log.w(TAG, "Invalid syntax error while decoding extras data from server.");
- }
- return results;
- }
+ public boolean allowAccess() {
+ long ts = System.currentTimeMillis();
+ if (mLastResponse == Policy.LICENSED) {
+ // Check if the LICENSED response occurred within the validity
+ // timeout.
+ if (ts <= mValidityTimestamp) {
+ // Cached LICENSED response is still valid.
+ return true;
+ }
+ } else if (mLastResponse == Policy.RETRY &&
+ ts < mLastResponseTime + MILLIS_PER_MINUTE) {
+ // Only allow access if we are within the retry period or we haven't
+ // used up our
+ // max retries.
+ return (ts <= mRetryUntil || mRetryCount <= mMaxRetries);
+ }
+ return false;
+ }
+
+ private Map<String, String> decodeExtras(
+ com.google.android.vending.licensing.ResponseData rawData) {
+ Map<String, String> results = new HashMap<String, String>();
+ if (rawData == null) {
+ return results;
+ }
+
+ try {
+ URI rawExtras = new URI("?" + rawData.extra);
+ URIQueryDecoder.DecodeQuery(rawExtras, results);
+ } catch (URISyntaxException e) {
+ Log.w(TAG, "Invalid syntax error while decoding extras data from server.");
+ }
+ return results;
+ }
+
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/DeviceLimiter.java b/platform/android/java/src/com/google/android/vending/licensing/DeviceLimiter.java
index 2384b8b82f..e5c5e2d7ca 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/DeviceLimiter.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/DeviceLimiter.java
@@ -37,11 +37,11 @@ package com.google.android.vending.licensing;
*/
public interface DeviceLimiter {
- /**
+ /**
* Checks if this device is allowed to use the given user's license.
*
* @param userId the user whose license the server responded with
* @return LICENSED if the device is allowed, NOT_LICENSED if not, RETRY if an error occurs
*/
- int isDeviceAllowed(String userId);
+ int isDeviceAllowed(String userId);
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.java b/platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.java
deleted file mode 100644
index 89edeae1b4..0000000000
--- a/platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
-
-/*
- * This file is auto-generated. DO NOT MODIFY.
- * Original file: aidl/ILicenseResultListener.aidl
- */
-package com.google.android.vending.licensing;
-import java.lang.String;
-import android.os.RemoteException;
-import android.os.IBinder;
-import android.os.IInterface;
-import android.os.Binder;
-import android.os.Parcel;
-public interface ILicenseResultListener extends android.os.IInterface {
- /** Local-side IPC implementation stub class. */
- public static abstract class Stub extends android.os.Binder implements com.google.android.vending.licensing.ILicenseResultListener {
- private static final java.lang.String DESCRIPTOR = "com.android.vending.licensing.ILicenseResultListener";
- /** Construct the stub at attach it to the interface. */
- public Stub() {
- this.attachInterface(this, DESCRIPTOR);
- }
- /**
- * Cast an IBinder object into an ILicenseResultListener interface,
- * generating a proxy if needed.
- */
- public static com.google.android.vending.licensing.ILicenseResultListener asInterface(android.os.IBinder obj) {
- if ((obj == null)) {
- return null;
- }
- android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR);
- if (((iin != null) && (iin instanceof com.google.android.vending.licensing.ILicenseResultListener))) {
- return ((com.google.android.vending.licensing.ILicenseResultListener)iin);
- }
- return new com.google.android.vending.licensing.ILicenseResultListener.Stub.Proxy(obj);
- }
- public android.os.IBinder asBinder() {
- return this;
- }
- public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
- switch (code) {
- case INTERFACE_TRANSACTION: {
- reply.writeString(DESCRIPTOR);
- return true;
- }
- case TRANSACTION_verifyLicense: {
- data.enforceInterface(DESCRIPTOR);
- int _arg0;
- _arg0 = data.readInt();
- java.lang.String _arg1;
- _arg1 = data.readString();
- java.lang.String _arg2;
- _arg2 = data.readString();
- this.verifyLicense(_arg0, _arg1, _arg2);
- return true;
- }
- }
- return super.onTransact(code, data, reply, flags);
- }
- private static class Proxy implements com.google.android.vending.licensing.ILicenseResultListener {
- private android.os.IBinder mRemote;
- Proxy(android.os.IBinder remote) {
- mRemote = remote;
- }
- public android.os.IBinder asBinder() {
- return mRemote;
- }
- public java.lang.String getInterfaceDescriptor() {
- return DESCRIPTOR;
- }
- public void verifyLicense(int responseCode, java.lang.String signedData, java.lang.String signature) throws android.os.RemoteException {
- android.os.Parcel _data = android.os.Parcel.obtain();
- try {
- _data.writeInterfaceToken(DESCRIPTOR);
- _data.writeInt(responseCode);
- _data.writeString(signedData);
- _data.writeString(signature);
- mRemote.transact(Stub.TRANSACTION_verifyLicense, _data, null, IBinder.FLAG_ONEWAY);
- } finally {
- _data.recycle();
- }
- }
- }
- static final int TRANSACTION_verifyLicense = (IBinder.FIRST_CALL_TRANSACTION + 0);
- }
- public void verifyLicense(int responseCode, java.lang.String signedData, java.lang.String signature) throws android.os.RemoteException;
-}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/ILicensingService.java b/platform/android/java/src/com/google/android/vending/licensing/ILicensingService.java
deleted file mode 100644
index 8b7cc83541..0000000000
--- a/platform/android/java/src/com/google/android/vending/licensing/ILicensingService.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
-
-/*
- * This file is auto-generated. DO NOT MODIFY.
- * Original file: aidl/ILicensingService.aidl
- */
-package com.google.android.vending.licensing;
-import java.lang.String;
-import android.os.RemoteException;
-import android.os.IBinder;
-import android.os.IInterface;
-import android.os.Binder;
-import android.os.Parcel;
-public interface ILicensingService extends android.os.IInterface {
- /** Local-side IPC implementation stub class. */
- public static abstract class Stub extends android.os.Binder implements com.google.android.vending.licensing.ILicensingService {
- private static final java.lang.String DESCRIPTOR = "com.android.vending.licensing.ILicensingService";
- /** Construct the stub at attach it to the interface. */
- public Stub() {
- this.attachInterface(this, DESCRIPTOR);
- }
- /**
- * Cast an IBinder object into an ILicensingService interface,
- * generating a proxy if needed.
- */
- public static com.google.android.vending.licensing.ILicensingService asInterface(android.os.IBinder obj) {
- if ((obj == null)) {
- return null;
- }
- android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR);
- if (((iin != null) && (iin instanceof com.google.android.vending.licensing.ILicensingService))) {
- return ((com.google.android.vending.licensing.ILicensingService)iin);
- }
- return new com.google.android.vending.licensing.ILicensingService.Stub.Proxy(obj);
- }
- public android.os.IBinder asBinder() {
- return this;
- }
- public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
- switch (code) {
- case INTERFACE_TRANSACTION: {
- reply.writeString(DESCRIPTOR);
- return true;
- }
- case TRANSACTION_checkLicense: {
- data.enforceInterface(DESCRIPTOR);
- long _arg0;
- _arg0 = data.readLong();
- java.lang.String _arg1;
- _arg1 = data.readString();
- com.google.android.vending.licensing.ILicenseResultListener _arg2;
- _arg2 = com.google.android.vending.licensing.ILicenseResultListener.Stub.asInterface(data.readStrongBinder());
- this.checkLicense(_arg0, _arg1, _arg2);
- return true;
- }
- }
- return super.onTransact(code, data, reply, flags);
- }
- private static class Proxy implements com.google.android.vending.licensing.ILicensingService {
- private android.os.IBinder mRemote;
- Proxy(android.os.IBinder remote) {
- mRemote = remote;
- }
- public android.os.IBinder asBinder() {
- return mRemote;
- }
- public java.lang.String getInterfaceDescriptor() {
- return DESCRIPTOR;
- }
- public void checkLicense(long nonce, java.lang.String packageName, com.google.android.vending.licensing.ILicenseResultListener listener) throws android.os.RemoteException {
- android.os.Parcel _data = android.os.Parcel.obtain();
- try {
- _data.writeInterfaceToken(DESCRIPTOR);
- _data.writeLong(nonce);
- _data.writeString(packageName);
- _data.writeStrongBinder((((listener != null)) ? (listener.asBinder()) : (null)));
- mRemote.transact(Stub.TRANSACTION_checkLicense, _data, null, IBinder.FLAG_ONEWAY);
- } finally {
- _data.recycle();
- }
- }
- }
- static final int TRANSACTION_checkLicense = (IBinder.FIRST_CALL_TRANSACTION + 0);
- }
- public void checkLicense(long nonce, java.lang.String packageName, com.google.android.vending.licensing.ILicenseResultListener listener) throws android.os.RemoteException;
-}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/LicenseChecker.java b/platform/android/java/src/com/google/android/vending/licensing/LicenseChecker.java
index 38aab9f4f5..15017b3425 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/LicenseChecker.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/LicenseChecker.java
@@ -29,8 +29,8 @@ import android.os.RemoteException;
import android.provider.Settings.Secure;
import android.util.Log;
-import com.google.android.vending.licensing.ILicenseResultListener;
-import com.google.android.vending.licensing.ILicensingService;
+import com.android.vending.licensing.ILicenseResultListener;
+import com.android.vending.licensing.ILicensingService;
import com.google.android.vending.licensing.util.Base64;
import com.google.android.vending.licensing.util.Base64DecoderException;
@@ -58,73 +58,73 @@ import java.util.Set;
* public key is obtainable from the publisher site.
*/
public class LicenseChecker implements ServiceConnection {
- private static final String TAG = "LicenseChecker";
+ private static final String TAG = "LicenseChecker";
- private static final String KEY_FACTORY_ALGORITHM = "RSA";
+ private static final String KEY_FACTORY_ALGORITHM = "RSA";
- // Timeout value (in milliseconds) for calls to service.
- private static final int TIMEOUT_MS = 10 * 1000;
+ // Timeout value (in milliseconds) for calls to service.
+ private static final int TIMEOUT_MS = 10 * 1000;
- private static final SecureRandom RANDOM = new SecureRandom();
- private static final boolean DEBUG_LICENSE_ERROR = false;
+ private static final SecureRandom RANDOM = new SecureRandom();
+ private static final boolean DEBUG_LICENSE_ERROR = false;
- private ILicensingService mService;
+ private ILicensingService mService;
- private PublicKey mPublicKey;
- private final Context mContext;
- private final Policy mPolicy;
- /**
+ private PublicKey mPublicKey;
+ private final Context mContext;
+ private final Policy mPolicy;
+ /**
* A handler for running tasks on a background thread. We don't want license processing to block
* the UI thread.
*/
- private Handler mHandler;
- private final String mPackageName;
- private final String mVersionCode;
- private final Set<LicenseValidator> mChecksInProgress = new HashSet<LicenseValidator>();
- private final Queue<LicenseValidator> mPendingChecks = new LinkedList<LicenseValidator>();
+ private Handler mHandler;
+ private final String mPackageName;
+ private final String mVersionCode;
+ private final Set<LicenseValidator> mChecksInProgress = new HashSet<LicenseValidator>();
+ private final Queue<LicenseValidator> mPendingChecks = new LinkedList<LicenseValidator>();
- /**
+ /**
* @param context a Context
* @param policy implementation of Policy
* @param encodedPublicKey Base64-encoded RSA public key
* @throws IllegalArgumentException if encodedPublicKey is invalid
*/
- public LicenseChecker(Context context, Policy policy, String encodedPublicKey) {
- mContext = context;
- mPolicy = policy;
- mPublicKey = generatePublicKey(encodedPublicKey);
- mPackageName = mContext.getPackageName();
- mVersionCode = getVersionCode(context, mPackageName);
- HandlerThread handlerThread = new HandlerThread("background thread");
- handlerThread.start();
- mHandler = new Handler(handlerThread.getLooper());
- }
-
- /**
+ public LicenseChecker(Context context, Policy policy, String encodedPublicKey) {
+ mContext = context;
+ mPolicy = policy;
+ mPublicKey = generatePublicKey(encodedPublicKey);
+ mPackageName = mContext.getPackageName();
+ mVersionCode = getVersionCode(context, mPackageName);
+ HandlerThread handlerThread = new HandlerThread("background thread");
+ handlerThread.start();
+ mHandler = new Handler(handlerThread.getLooper());
+ }
+
+ /**
* Generates a PublicKey instance from a string containing the Base64-encoded public key.
*
* @param encodedPublicKey Base64-encoded public key
* @throws IllegalArgumentException if encodedPublicKey is invalid
*/
- private static PublicKey generatePublicKey(String encodedPublicKey) {
- try {
- byte[] decodedKey = Base64.decode(encodedPublicKey);
- KeyFactory keyFactory = KeyFactory.getInstance(KEY_FACTORY_ALGORITHM);
-
- return keyFactory.generatePublic(new X509EncodedKeySpec(decodedKey));
- } catch (NoSuchAlgorithmException e) {
- // This won't happen in an Android-compatible environment.
- throw new RuntimeException(e);
- } catch (Base64DecoderException e) {
- Log.e(TAG, "Could not decode from Base64.");
- throw new IllegalArgumentException(e);
- } catch (InvalidKeySpecException e) {
- Log.e(TAG, "Invalid key specification.");
- throw new IllegalArgumentException(e);
- }
- }
-
- /**
+ private static PublicKey generatePublicKey(String encodedPublicKey) {
+ try {
+ byte[] decodedKey = Base64.decode(encodedPublicKey);
+ KeyFactory keyFactory = KeyFactory.getInstance(KEY_FACTORY_ALGORITHM);
+
+ return keyFactory.generatePublic(new X509EncodedKeySpec(decodedKey));
+ } catch (NoSuchAlgorithmException e) {
+ // This won't happen in an Android-compatible environment.
+ throw new RuntimeException(e);
+ } catch (Base64DecoderException e) {
+ Log.e(TAG, "Could not decode from Base64.");
+ throw new IllegalArgumentException(e);
+ } catch (InvalidKeySpecException e) {
+ Log.e(TAG, "Invalid key specification.");
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ /**
* Checks if the user should have access to the app. Binds the service if necessary.
* <p>
* NOTE: This call uses a trivially obfuscated string (base64-encoded). For best security, we
@@ -136,221 +136,223 @@ public class LicenseChecker implements ServiceConnection {
*
* @param callback
*/
- public synchronized void checkAccess(LicenseCheckerCallback callback) {
- // If we have a valid recent LICENSED response, we can skip asking
- // Market.
- if (mPolicy.allowAccess()) {
- Log.i(TAG, "Using cached license response");
- callback.allow(Policy.LICENSED);
- } else {
- LicenseValidator validator = new LicenseValidator(mPolicy, new NullDeviceLimiter(),
- callback, generateNonce(), mPackageName, mVersionCode);
-
- if (mService == null) {
- Log.i(TAG, "Binding to licensing service.");
- try {
- boolean bindResult = mContext
- .bindService(
- new Intent(
- new String(
- // Base64 encoded -
- // com.android.vending.licensing.ILicensingService
- // Consider encoding this in another way in your
- // code to improve security
- Base64.decode(
- "Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")))
- // As of Android 5.0, implicit
- // Service Intents are no longer
- // allowed because it's not
- // possible for the user to
- // participate in disambiguating
- // them. This does mean we break
- // compatibility with Android
- // Cupcake devices with this
- // release, since setPackage was
- // added in Donut.
- .setPackage(
- new String(
- // Base64
- // encoded -
- // com.android.vending
- Base64.decode(
- "Y29tLmFuZHJvaWQudmVuZGluZw=="))),
- this, // ServiceConnection.
- Context.BIND_AUTO_CREATE);
- if (bindResult) {
- mPendingChecks.offer(validator);
- } else {
- Log.e(TAG, "Could not bind to service.");
- handleServiceConnectionError(validator);
- }
- } catch (SecurityException e) {
- callback.applicationError(LicenseCheckerCallback.ERROR_MISSING_PERMISSION);
- } catch (Base64DecoderException e) {
- e.printStackTrace();
- }
- } else {
- mPendingChecks.offer(validator);
- runChecks();
- }
- }
- }
-
- /**
+ public synchronized void checkAccess(LicenseCheckerCallback callback) {
+ // If we have a valid recent LICENSED response, we can skip asking
+ // Market.
+ if (mPolicy.allowAccess()) {
+ Log.i(TAG, "Using cached license response");
+ callback.allow(Policy.LICENSED);
+ } else {
+ LicenseValidator validator = new LicenseValidator(mPolicy, new NullDeviceLimiter(),
+ callback, generateNonce(), mPackageName, mVersionCode);
+
+ if (mService == null) {
+ Log.i(TAG, "Binding to licensing service.");
+ try {
+ boolean bindResult = mContext
+ .bindService(
+ new Intent(
+ new String(
+ // Base64 encoded -
+ // com.android.vending.licensing.ILicensingService
+ // Consider encoding this in another way in your
+ // code to improve security
+ Base64.decode(
+ "Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")))
+ // As of Android 5.0, implicit
+ // Service Intents are no longer
+ // allowed because it's not
+ // possible for the user to
+ // participate in disambiguating
+ // them. This does mean we break
+ // compatibility with Android
+ // Cupcake devices with this
+ // release, since setPackage was
+ // added in Donut.
+ .setPackage(
+ new String(
+ // Base64
+ // encoded -
+ // com.android.vending
+ Base64.decode(
+ "Y29tLmFuZHJvaWQudmVuZGluZw=="))),
+ this, // ServiceConnection.
+ Context.BIND_AUTO_CREATE);
+ if (bindResult) {
+ mPendingChecks.offer(validator);
+ } else {
+ Log.e(TAG, "Could not bind to service.");
+ handleServiceConnectionError(validator);
+ }
+ } catch (SecurityException e) {
+ callback.applicationError(LicenseCheckerCallback.ERROR_MISSING_PERMISSION);
+ } catch (Base64DecoderException e) {
+ e.printStackTrace();
+ }
+ } else {
+ mPendingChecks.offer(validator);
+ runChecks();
+ }
+ }
+ }
+
+ /**
* Triggers the last deep link licensing URL returned from the server, which redirects users to a
* page which enables them to gain access to the app. If no such URL is returned by the server, it
* will go to the details page of the app in the Play Store.
*/
- public void followLastLicensingUrl(Context context) {
- String licensingUrl = mPolicy.getLicensingUrl();
- if (licensingUrl == null) {
- licensingUrl = "https://play.google.com/store/apps/details?id=" + context.getPackageName();
- }
- Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(licensingUrl));
- context.startActivity(marketIntent);
- }
-
- private void runChecks() {
- LicenseValidator validator;
- while ((validator = mPendingChecks.poll()) != null) {
- try {
- Log.i(TAG, "Calling checkLicense on service for " + validator.getPackageName());
- mService.checkLicense(
- validator.getNonce(), validator.getPackageName(),
- new ResultListener(validator));
- mChecksInProgress.add(validator);
- } catch (RemoteException e) {
- Log.w(TAG, "RemoteException in checkLicense call.", e);
- handleServiceConnectionError(validator);
- }
- }
- }
-
- private synchronized void finishCheck(LicenseValidator validator) {
- mChecksInProgress.remove(validator);
- if (mChecksInProgress.isEmpty()) {
- cleanupService();
- }
- }
-
- private class ResultListener extends ILicenseResultListener.Stub {
- private final LicenseValidator mValidator;
- private Runnable mOnTimeout;
-
- public ResultListener(LicenseValidator validator) {
- mValidator = validator;
- mOnTimeout = new Runnable() {
- public void run() {
- Log.i(TAG, "Check timed out.");
- handleServiceConnectionError(mValidator);
- finishCheck(mValidator);
- }
- };
- startTimeout();
- }
-
- private static final int ERROR_CONTACTING_SERVER = 0x101;
- private static final int ERROR_INVALID_PACKAGE_NAME = 0x102;
- private static final int ERROR_NON_MATCHING_UID = 0x103;
-
- // Runs in IPC thread pool. Post it to the Handler, so we can guarantee
- // either this or the timeout runs.
- public void verifyLicense(final int responseCode, final String signedData,
- final String signature) {
- mHandler.post(new Runnable() {
- public void run() {
- Log.i(TAG, "Received response.");
- // Make sure it hasn't already timed out.
- if (mChecksInProgress.contains(mValidator)) {
- clearTimeout();
- mValidator.verify(mPublicKey, responseCode, signedData, signature);
- finishCheck(mValidator);
- }
- if (DEBUG_LICENSE_ERROR) {
- boolean logResponse;
- String stringError = null;
- switch (responseCode) {
- case ERROR_CONTACTING_SERVER:
- logResponse = true;
- stringError = "ERROR_CONTACTING_SERVER";
- break;
- case ERROR_INVALID_PACKAGE_NAME:
- logResponse = true;
- stringError = "ERROR_INVALID_PACKAGE_NAME";
- break;
- case ERROR_NON_MATCHING_UID:
- logResponse = true;
- stringError = "ERROR_NON_MATCHING_UID";
- break;
- default:
- logResponse = false;
- }
-
- if (logResponse) {
- String android_id = Secure.ANDROID_ID;
- Date date = new Date();
- Log.d(TAG, "Server Failure: " + stringError);
- Log.d(TAG, "Android ID: " + android_id);
- Log.d(TAG, "Time: " + date.toGMTString());
- }
- }
- }
- });
- }
-
- private void startTimeout() {
- Log.i(TAG, "Start monitoring timeout.");
- mHandler.postDelayed(mOnTimeout, TIMEOUT_MS);
- }
-
- private void clearTimeout() {
- Log.i(TAG, "Clearing timeout.");
- mHandler.removeCallbacks(mOnTimeout);
- }
- }
-
- public synchronized void onServiceConnected(ComponentName name, IBinder service) {
- mService = ILicensingService.Stub.asInterface(service);
- runChecks();
- }
-
- public synchronized void onServiceDisconnected(ComponentName name) {
- // Called when the connection with the service has been
- // unexpectedly disconnected. That is, Market crashed.
- // If there are any checks in progress, the timeouts will handle them.
- Log.w(TAG, "Service unexpectedly disconnected.");
- mService = null;
- }
-
- /**
+ public void followLastLicensingUrl(Context context) {
+ String licensingUrl = mPolicy.getLicensingUrl();
+ if (licensingUrl == null) {
+ licensingUrl = "https://play.google.com/store/apps/details?id=" + context.getPackageName();
+ }
+ Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(licensingUrl));
+ context.startActivity(marketIntent);
+ }
+
+ private void runChecks() {
+ LicenseValidator validator;
+ while ((validator = mPendingChecks.poll()) != null) {
+ try {
+ Log.i(TAG, "Calling checkLicense on service for " + validator.getPackageName());
+ mService.checkLicense(
+ validator.getNonce(), validator.getPackageName(),
+ new ResultListener(validator));
+ mChecksInProgress.add(validator);
+ } catch (RemoteException e) {
+ Log.w(TAG, "RemoteException in checkLicense call.", e);
+ handleServiceConnectionError(validator);
+ }
+ }
+ }
+
+ private synchronized void finishCheck(LicenseValidator validator) {
+ mChecksInProgress.remove(validator);
+ if (mChecksInProgress.isEmpty()) {
+ cleanupService();
+ }
+ }
+
+ private class ResultListener extends ILicenseResultListener.Stub {
+ private final LicenseValidator mValidator;
+ private Runnable mOnTimeout;
+
+ public ResultListener(LicenseValidator validator) {
+ mValidator = validator;
+ mOnTimeout = new Runnable() {
+ public void run() {
+ Log.i(TAG, "Check timed out.");
+ handleServiceConnectionError(mValidator);
+ finishCheck(mValidator);
+ }
+ };
+ startTimeout();
+ }
+
+ private static final int ERROR_CONTACTING_SERVER = 0x101;
+ private static final int ERROR_INVALID_PACKAGE_NAME = 0x102;
+ private static final int ERROR_NON_MATCHING_UID = 0x103;
+
+ // Runs in IPC thread pool. Post it to the Handler, so we can guarantee
+ // either this or the timeout runs.
+ public void verifyLicense(final int responseCode, final String signedData,
+ final String signature) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ Log.i(TAG, "Received response.");
+ // Make sure it hasn't already timed out.
+ if (mChecksInProgress.contains(mValidator)) {
+ clearTimeout();
+ mValidator.verify(mPublicKey, responseCode, signedData, signature);
+ finishCheck(mValidator);
+ }
+ if (DEBUG_LICENSE_ERROR) {
+ boolean logResponse;
+ String stringError = null;
+ switch (responseCode) {
+ case ERROR_CONTACTING_SERVER:
+ logResponse = true;
+ stringError = "ERROR_CONTACTING_SERVER";
+ break;
+ case ERROR_INVALID_PACKAGE_NAME:
+ logResponse = true;
+ stringError = "ERROR_INVALID_PACKAGE_NAME";
+ break;
+ case ERROR_NON_MATCHING_UID:
+ logResponse = true;
+ stringError = "ERROR_NON_MATCHING_UID";
+ break;
+ default:
+ logResponse = false;
+ }
+
+ if (logResponse) {
+ String android_id = Secure.getString(mContext.getContentResolver(),
+ Secure.ANDROID_ID);
+ Date date = new Date();
+ Log.d(TAG, "Server Failure: " + stringError);
+ Log.d(TAG, "Android ID: " + android_id);
+ Log.d(TAG, "Time: " + date.toGMTString());
+ }
+ }
+
+ }
+ });
+ }
+
+ private void startTimeout() {
+ Log.i(TAG, "Start monitoring timeout.");
+ mHandler.postDelayed(mOnTimeout, TIMEOUT_MS);
+ }
+
+ private void clearTimeout() {
+ Log.i(TAG, "Clearing timeout.");
+ mHandler.removeCallbacks(mOnTimeout);
+ }
+ }
+
+ public synchronized void onServiceConnected(ComponentName name, IBinder service) {
+ mService = ILicensingService.Stub.asInterface(service);
+ runChecks();
+ }
+
+ public synchronized void onServiceDisconnected(ComponentName name) {
+ // Called when the connection with the service has been
+ // unexpectedly disconnected. That is, Market crashed.
+ // If there are any checks in progress, the timeouts will handle them.
+ Log.w(TAG, "Service unexpectedly disconnected.");
+ mService = null;
+ }
+
+ /**
* Generates policy response for service connection errors, as a result of disconnections or
* timeouts.
*/
- private synchronized void handleServiceConnectionError(LicenseValidator validator) {
- mPolicy.processServerResponse(Policy.RETRY, null);
-
- if (mPolicy.allowAccess()) {
- validator.getCallback().allow(Policy.RETRY);
- } else {
- validator.getCallback().dontAllow(Policy.RETRY);
- }
- }
-
- /** Unbinds service if necessary and removes reference to it. */
- private void cleanupService() {
- if (mService != null) {
- try {
- mContext.unbindService(this);
- } catch (IllegalArgumentException e) {
- // Somehow we've already been unbound. This is a non-fatal
- // error.
- Log.e(TAG, "Unable to unbind from licensing service (already unbound)");
- }
- mService = null;
- }
- }
-
- /**
+ private synchronized void handleServiceConnectionError(LicenseValidator validator) {
+ mPolicy.processServerResponse(Policy.RETRY, null);
+
+ if (mPolicy.allowAccess()) {
+ validator.getCallback().allow(Policy.RETRY);
+ } else {
+ validator.getCallback().dontAllow(Policy.RETRY);
+ }
+ }
+
+ /** Unbinds service if necessary and removes reference to it. */
+ private void cleanupService() {
+ if (mService != null) {
+ try {
+ mContext.unbindService(this);
+ } catch (IllegalArgumentException e) {
+ // Somehow we've already been unbound. This is a non-fatal
+ // error.
+ Log.e(TAG, "Unable to unbind from licensing service (already unbound)");
+ }
+ mService = null;
+ }
+ }
+
+ /**
* Inform the library that the context is about to be destroyed, so that any open connections
* can be cleaned up.
* <p>
@@ -358,30 +360,30 @@ public class LicenseChecker implements ServiceConnection {
* screen rotation if an Activity requests the license check or when the user exits the
* application.
*/
- public synchronized void onDestroy() {
- cleanupService();
- mHandler.getLooper().quit();
- }
+ public synchronized void onDestroy() {
+ cleanupService();
+ mHandler.getLooper().quit();
+ }
- /** Generates a nonce (number used once). */
- private int generateNonce() {
- return RANDOM.nextInt();
- }
+ /** Generates a nonce (number used once). */
+ private int generateNonce() {
+ return RANDOM.nextInt();
+ }
- /**
+ /**
* Get version code for the application package name.
*
* @param context
* @param packageName application package name
* @return the version code or empty string if package not found
*/
- private static String getVersionCode(Context context, String packageName) {
- try {
- return String.valueOf(
- context.getPackageManager().getPackageInfo(packageName, 0).versionCode);
- } catch (NameNotFoundException e) {
- Log.e(TAG, "Package not found. could not get version code.");
- return "";
- }
- }
+ private static String getVersionCode(Context context, String packageName) {
+ try {
+ return String.valueOf(
+ context.getPackageManager().getPackageInfo(packageName, 0).versionCode);
+ } catch (NameNotFoundException e) {
+ Log.e(TAG, "Package not found. could not get version code.");
+ return "";
+ }
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/LicenseCheckerCallback.java b/platform/android/java/src/com/google/android/vending/licensing/LicenseCheckerCallback.java
index dc2c2d70bf..8b869ddaaf 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/LicenseCheckerCallback.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/LicenseCheckerCallback.java
@@ -34,34 +34,34 @@ package com.google.android.vending.licensing;
*/
public interface LicenseCheckerCallback {
- /**
+ /**
* Allow use. App should proceed as normal.
*
* @param reason Policy.LICENSED or Policy.RETRY typically. (although in
* theory the policy can return Policy.NOT_LICENSED here as well)
*/
- public void allow(int reason);
+ public void allow(int reason);
- /**
+ /**
* Don't allow use. App should inform user and take appropriate action.
*
* @param reason Policy.NOT_LICENSED or Policy.RETRY. (although in theory
* the policy can return Policy.LICENSED here as well ---
* perhaps the call to the LVL took too long, for example)
*/
- public void dontAllow(int reason);
+ public void dontAllow(int reason);
- /** Application error codes. */
- public static final int ERROR_INVALID_PACKAGE_NAME = 1;
- public static final int ERROR_NON_MATCHING_UID = 2;
- public static final int ERROR_NOT_MARKET_MANAGED = 3;
- public static final int ERROR_CHECK_IN_PROGRESS = 4;
- public static final int ERROR_INVALID_PUBLIC_KEY = 5;
- public static final int ERROR_MISSING_PERMISSION = 6;
+ /** Application error codes. */
+ public static final int ERROR_INVALID_PACKAGE_NAME = 1;
+ public static final int ERROR_NON_MATCHING_UID = 2;
+ public static final int ERROR_NOT_MARKET_MANAGED = 3;
+ public static final int ERROR_CHECK_IN_PROGRESS = 4;
+ public static final int ERROR_INVALID_PUBLIC_KEY = 5;
+ public static final int ERROR_MISSING_PERMISSION = 6;
- /**
+ /**
* Error in application code. Caller did not call or set up license checker
* correctly. Should be considered fatal.
*/
- public void applicationError(int errorCode);
+ public void applicationError(int errorCode);
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/LicenseValidator.java b/platform/android/java/src/com/google/android/vending/licensing/LicenseValidator.java
index 77f7dc7295..11a00786d0 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/LicenseValidator.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/LicenseValidator.java
@@ -33,52 +33,52 @@ import java.security.SignatureException;
* and process the response.
*/
class LicenseValidator {
- private static final String TAG = "LicenseValidator";
-
- // Server response codes.
- private static final int LICENSED = 0x0;
- private static final int NOT_LICENSED = 0x1;
- private static final int LICENSED_OLD_KEY = 0x2;
- private static final int ERROR_NOT_MARKET_MANAGED = 0x3;
- private static final int ERROR_SERVER_FAILURE = 0x4;
- private static final int ERROR_OVER_QUOTA = 0x5;
-
- private static final int ERROR_CONTACTING_SERVER = 0x101;
- private static final int ERROR_INVALID_PACKAGE_NAME = 0x102;
- private static final int ERROR_NON_MATCHING_UID = 0x103;
-
- private final Policy mPolicy;
- private final LicenseCheckerCallback mCallback;
- private final int mNonce;
- private final String mPackageName;
- private final String mVersionCode;
- private final DeviceLimiter mDeviceLimiter;
-
- LicenseValidator(Policy policy, DeviceLimiter deviceLimiter, LicenseCheckerCallback callback,
- int nonce, String packageName, String versionCode) {
- mPolicy = policy;
- mDeviceLimiter = deviceLimiter;
- mCallback = callback;
- mNonce = nonce;
- mPackageName = packageName;
- mVersionCode = versionCode;
- }
-
- public LicenseCheckerCallback getCallback() {
- return mCallback;
- }
-
- public int getNonce() {
- return mNonce;
- }
-
- public String getPackageName() {
- return mPackageName;
- }
-
- private static final String SIGNATURE_ALGORITHM = "SHA1withRSA";
-
- /**
+ private static final String TAG = "LicenseValidator";
+
+ // Server response codes.
+ private static final int LICENSED = 0x0;
+ private static final int NOT_LICENSED = 0x1;
+ private static final int LICENSED_OLD_KEY = 0x2;
+ private static final int ERROR_NOT_MARKET_MANAGED = 0x3;
+ private static final int ERROR_SERVER_FAILURE = 0x4;
+ private static final int ERROR_OVER_QUOTA = 0x5;
+
+ private static final int ERROR_CONTACTING_SERVER = 0x101;
+ private static final int ERROR_INVALID_PACKAGE_NAME = 0x102;
+ private static final int ERROR_NON_MATCHING_UID = 0x103;
+
+ private final Policy mPolicy;
+ private final LicenseCheckerCallback mCallback;
+ private final int mNonce;
+ private final String mPackageName;
+ private final String mVersionCode;
+ private final DeviceLimiter mDeviceLimiter;
+
+ LicenseValidator(Policy policy, DeviceLimiter deviceLimiter, LicenseCheckerCallback callback,
+ int nonce, String packageName, String versionCode) {
+ mPolicy = policy;
+ mDeviceLimiter = deviceLimiter;
+ mCallback = callback;
+ mNonce = nonce;
+ mPackageName = packageName;
+ mVersionCode = versionCode;
+ }
+
+ public LicenseCheckerCallback getCallback() {
+ return mCallback;
+ }
+
+ public int getNonce() {
+ return mNonce;
+ }
+
+ public String getPackageName() {
+ return mPackageName;
+ }
+
+ private static final String SIGNATURE_ALGORITHM = "SHA1withRSA";
+
+ /**
* Verifies the response from server and calls appropriate callback method.
*
* @param publicKey public key associated with the developer account
@@ -86,147 +86,146 @@ class LicenseValidator {
* @param signedData signed data from server
* @param signature server signature
*/
- public void verify(PublicKey publicKey, int responseCode, String signedData, String signature) {
- String userId = null;
- // Skip signature check for unsuccessful requests
- ResponseData data = null;
- if (responseCode == LICENSED || responseCode == NOT_LICENSED ||
- responseCode == LICENSED_OLD_KEY) {
- // Verify signature.
- try {
- if (TextUtils.isEmpty(signedData)) {
- Log.e(TAG, "Signature verification failed: signedData is empty. "
- +
- "(Device not signed-in to any Google accounts?)");
- handleInvalidResponse();
- return;
- }
-
- Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM);
- sig.initVerify(publicKey);
- sig.update(signedData.getBytes());
-
- if (!sig.verify(Base64.decode(signature))) {
- Log.e(TAG, "Signature verification failed.");
- handleInvalidResponse();
- return;
- }
- } catch (NoSuchAlgorithmException e) {
- // This can't happen on an Android compatible device.
- throw new RuntimeException(e);
- } catch (InvalidKeyException e) {
- handleApplicationError(LicenseCheckerCallback.ERROR_INVALID_PUBLIC_KEY);
- return;
- } catch (SignatureException e) {
- throw new RuntimeException(e);
- } catch (Base64DecoderException e) {
- Log.e(TAG, "Could not Base64-decode signature.");
- handleInvalidResponse();
- return;
- }
-
- // Parse and validate response.
- try {
- data = ResponseData.parse(signedData);
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "Could not parse response.");
- handleInvalidResponse();
- return;
- }
-
- if (data.responseCode != responseCode) {
- Log.e(TAG, "Response codes don't match.");
- handleInvalidResponse();
- return;
- }
-
- if (data.nonce != mNonce) {
- Log.e(TAG, "Nonce doesn't match.");
- handleInvalidResponse();
- return;
- }
-
- if (!data.packageName.equals(mPackageName)) {
- Log.e(TAG, "Package name doesn't match.");
- handleInvalidResponse();
- return;
- }
-
- if (!data.versionCode.equals(mVersionCode)) {
- Log.e(TAG, "Version codes don't match.");
- handleInvalidResponse();
- return;
- }
-
- // Application-specific user identifier.
- userId = data.userId;
- if (TextUtils.isEmpty(userId)) {
- Log.e(TAG, "User identifier is empty.");
- handleInvalidResponse();
- return;
- }
- }
-
- switch (responseCode) {
- case LICENSED:
- case LICENSED_OLD_KEY:
- int limiterResponse = mDeviceLimiter.isDeviceAllowed(userId);
- handleResponse(limiterResponse, data);
- break;
- case NOT_LICENSED:
- handleResponse(Policy.NOT_LICENSED, data);
- break;
- case ERROR_CONTACTING_SERVER:
- Log.w(TAG, "Error contacting licensing server.");
- handleResponse(Policy.RETRY, data);
- break;
- case ERROR_SERVER_FAILURE:
- Log.w(TAG, "An error has occurred on the licensing server.");
- handleResponse(Policy.RETRY, data);
- break;
- case ERROR_OVER_QUOTA:
- Log.w(TAG, "Licensing server is refusing to talk to this device, over quota.");
- handleResponse(Policy.RETRY, data);
- break;
- case ERROR_INVALID_PACKAGE_NAME:
- handleApplicationError(LicenseCheckerCallback.ERROR_INVALID_PACKAGE_NAME);
- break;
- case ERROR_NON_MATCHING_UID:
- handleApplicationError(LicenseCheckerCallback.ERROR_NON_MATCHING_UID);
- break;
- case ERROR_NOT_MARKET_MANAGED:
- handleApplicationError(LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED);
- break;
- default:
- Log.e(TAG, "Unknown response code for license check.");
- handleInvalidResponse();
- }
- }
-
- /**
+ public void verify(PublicKey publicKey, int responseCode, String signedData, String signature) {
+ String userId = null;
+ // Skip signature check for unsuccessful requests
+ ResponseData data = null;
+ if (responseCode == LICENSED || responseCode == NOT_LICENSED ||
+ responseCode == LICENSED_OLD_KEY) {
+ // Verify signature.
+ try {
+ if (TextUtils.isEmpty(signedData)) {
+ Log.e(TAG, "Signature verification failed: signedData is empty. " +
+ "(Device not signed-in to any Google accounts?)");
+ handleInvalidResponse();
+ return;
+ }
+
+ Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM);
+ sig.initVerify(publicKey);
+ sig.update(signedData.getBytes());
+
+ if (!sig.verify(Base64.decode(signature))) {
+ Log.e(TAG, "Signature verification failed.");
+ handleInvalidResponse();
+ return;
+ }
+ } catch (NoSuchAlgorithmException e) {
+ // This can't happen on an Android compatible device.
+ throw new RuntimeException(e);
+ } catch (InvalidKeyException e) {
+ handleApplicationError(LicenseCheckerCallback.ERROR_INVALID_PUBLIC_KEY);
+ return;
+ } catch (SignatureException e) {
+ throw new RuntimeException(e);
+ } catch (Base64DecoderException e) {
+ Log.e(TAG, "Could not Base64-decode signature.");
+ handleInvalidResponse();
+ return;
+ }
+
+ // Parse and validate response.
+ try {
+ data = ResponseData.parse(signedData);
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Could not parse response.");
+ handleInvalidResponse();
+ return;
+ }
+
+ if (data.responseCode != responseCode) {
+ Log.e(TAG, "Response codes don't match.");
+ handleInvalidResponse();
+ return;
+ }
+
+ if (data.nonce != mNonce) {
+ Log.e(TAG, "Nonce doesn't match.");
+ handleInvalidResponse();
+ return;
+ }
+
+ if (!data.packageName.equals(mPackageName)) {
+ Log.e(TAG, "Package name doesn't match.");
+ handleInvalidResponse();
+ return;
+ }
+
+ if (!data.versionCode.equals(mVersionCode)) {
+ Log.e(TAG, "Version codes don't match.");
+ handleInvalidResponse();
+ return;
+ }
+
+ // Application-specific user identifier.
+ userId = data.userId;
+ if (TextUtils.isEmpty(userId)) {
+ Log.e(TAG, "User identifier is empty.");
+ handleInvalidResponse();
+ return;
+ }
+ }
+
+ switch (responseCode) {
+ case LICENSED:
+ case LICENSED_OLD_KEY:
+ int limiterResponse = mDeviceLimiter.isDeviceAllowed(userId);
+ handleResponse(limiterResponse, data);
+ break;
+ case NOT_LICENSED:
+ handleResponse(Policy.NOT_LICENSED, data);
+ break;
+ case ERROR_CONTACTING_SERVER:
+ Log.w(TAG, "Error contacting licensing server.");
+ handleResponse(Policy.RETRY, data);
+ break;
+ case ERROR_SERVER_FAILURE:
+ Log.w(TAG, "An error has occurred on the licensing server.");
+ handleResponse(Policy.RETRY, data);
+ break;
+ case ERROR_OVER_QUOTA:
+ Log.w(TAG, "Licensing server is refusing to talk to this device, over quota.");
+ handleResponse(Policy.RETRY, data);
+ break;
+ case ERROR_INVALID_PACKAGE_NAME:
+ handleApplicationError(LicenseCheckerCallback.ERROR_INVALID_PACKAGE_NAME);
+ break;
+ case ERROR_NON_MATCHING_UID:
+ handleApplicationError(LicenseCheckerCallback.ERROR_NON_MATCHING_UID);
+ break;
+ case ERROR_NOT_MARKET_MANAGED:
+ handleApplicationError(LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED);
+ break;
+ default:
+ Log.e(TAG, "Unknown response code for license check.");
+ handleInvalidResponse();
+ }
+ }
+
+ /**
* Confers with policy and calls appropriate callback method.
*
* @param response
* @param rawData
*/
- private void handleResponse(int response, ResponseData rawData) {
- // Update policy data and increment retry counter (if needed)
- mPolicy.processServerResponse(response, rawData);
-
- // Given everything we know, including cached data, ask the policy if we should grant
- // access.
- if (mPolicy.allowAccess()) {
- mCallback.allow(response);
- } else {
- mCallback.dontAllow(response);
- }
- }
-
- private void handleApplicationError(int code) {
- mCallback.applicationError(code);
- }
-
- private void handleInvalidResponse() {
- mCallback.dontAllow(Policy.NOT_LICENSED);
- }
+ private void handleResponse(int response, ResponseData rawData) {
+ // Update policy data and increment retry counter (if needed)
+ mPolicy.processServerResponse(response, rawData);
+
+ // Given everything we know, including cached data, ask the policy if we should grant
+ // access.
+ if (mPolicy.allowAccess()) {
+ mCallback.allow(response);
+ } else {
+ mCallback.dontAllow(response);
+ }
+ }
+
+ private void handleApplicationError(int code) {
+ mCallback.applicationError(code);
+ }
+
+ private void handleInvalidResponse() {
+ mCallback.dontAllow(Policy.NOT_LICENSED);
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/NullDeviceLimiter.java b/platform/android/java/src/com/google/android/vending/licensing/NullDeviceLimiter.java
index a43e454228..d87af3153f 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/NullDeviceLimiter.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/NullDeviceLimiter.java
@@ -26,7 +26,7 @@ package com.google.android.vending.licensing;
*/
public class NullDeviceLimiter implements DeviceLimiter {
- public int isDeviceAllowed(String userId) {
- return Policy.LICENSED;
- }
+ public int isDeviceAllowed(String userId) {
+ return Policy.LICENSED;
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/Obfuscator.java b/platform/android/java/src/com/google/android/vending/licensing/Obfuscator.java
index 8731d03aa6..008c150a8e 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/Obfuscator.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/Obfuscator.java
@@ -27,16 +27,16 @@ package com.google.android.vending.licensing;
*/
public interface Obfuscator {
- /**
+ /**
* Obfuscate a string that is being stored into shared preferences.
*
* @param original The data that is to be obfuscated.
* @param key The key for the data that is to be obfuscated.
* @return A transformed version of the original data.
*/
- String obfuscate(String original, String key);
+ String obfuscate(String original, String key);
- /**
+ /**
* Undo the transformation applied to data by the obfuscate() method.
*
* @param obfuscated The data that is to be un-obfuscated.
@@ -44,5 +44,5 @@ public interface Obfuscator {
* @return The original data transformed by the obfuscate() method.
* @throws ValidationException Optionally thrown if a data integrity check fails.
*/
- String unobfuscate(String obfuscated, String key) throws ValidationException;
+ String unobfuscate(String obfuscated, String key) throws ValidationException;
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/Policy.java b/platform/android/java/src/com/google/android/vending/licensing/Policy.java
index 65202aceb9..b672a078b7 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/Policy.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/Policy.java
@@ -22,27 +22,27 @@ package com.google.android.vending.licensing;
*/
public interface Policy {
- /**
+ /**
* Change these values to make it more difficult for tools to automatically
* strip LVL protection from your APK.
*/
- /**
+ /**
* LICENSED means that the server returned back a valid license response
*/
- public static final int LICENSED = 0x0100;
- /**
+ public static final int LICENSED = 0x0100;
+ /**
* NOT_LICENSED means that the server returned back a valid license response
* that indicated that the user definitively is not licensed
*/
- public static final int NOT_LICENSED = 0x0231;
- /**
+ public static final int NOT_LICENSED = 0x0231;
+ /**
* RETRY means that the license response was unable to be determined ---
* perhaps as a result of faulty networking
*/
- public static final int RETRY = 0x0123;
+ public static final int RETRY = 0x0123;
- /**
+ /**
* Provide results from contact with the license server. Retry counts are
* incremented if the current value of response is RETRY. Results will be
* used for any future policy decisions.
@@ -50,16 +50,16 @@ public interface Policy {
* @param response the result from validating the server response
* @param rawData the raw server response data, can be null for RETRY
*/
- void processServerResponse(int response, ResponseData rawData);
+ void processServerResponse(int response, ResponseData rawData);
- /**
+ /**
* Check if the user should be allowed access to the application.
*/
- boolean allowAccess();
+ boolean allowAccess();
- /**
+ /**
* Gets the licensing URL returned by the server that can enable access for unlicensed apps (e.g.
* buy app on the Play Store).
*/
- String getLicensingUrl();
+ String getLicensingUrl();
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java b/platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java
index 099bb1c48b..feb579af04 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java
@@ -24,55 +24,57 @@ import android.util.Log;
*/
public class PreferenceObfuscator {
- private static final String TAG = "PreferenceObfuscator";
+ private static final String TAG = "PreferenceObfuscator";
- private final SharedPreferences mPreferences;
- private final Obfuscator mObfuscator;
- private SharedPreferences.Editor mEditor;
+ private final SharedPreferences mPreferences;
+ private final Obfuscator mObfuscator;
+ private SharedPreferences.Editor mEditor;
- /**
+ /**
* Constructor.
*
* @param sp A SharedPreferences instance provided by the system.
* @param o The Obfuscator to use when reading or writing data.
*/
- public PreferenceObfuscator(SharedPreferences sp, Obfuscator o) {
- mPreferences = sp;
- mObfuscator = o;
- mEditor = null;
- }
+ public PreferenceObfuscator(SharedPreferences sp, Obfuscator o) {
+ mPreferences = sp;
+ mObfuscator = o;
+ mEditor = null;
+ }
- public void putString(String key, String value) {
- if (mEditor == null) {
- mEditor = mPreferences.edit();
- mEditor.apply();
- }
- String obfuscatedValue = mObfuscator.obfuscate(value, key);
- mEditor.putString(key, obfuscatedValue);
- }
+ public void putString(String key, String value) {
+ if (mEditor == null) {
+ mEditor = mPreferences.edit();
+ // -- GODOT start --
+ mEditor.apply();
+ // -- GODOT end --
+ }
+ String obfuscatedValue = mObfuscator.obfuscate(value, key);
+ mEditor.putString(key, obfuscatedValue);
+ }
- public String getString(String key, String defValue) {
- String result;
- String value = mPreferences.getString(key, null);
- if (value != null) {
- try {
- result = mObfuscator.unobfuscate(value, key);
- } catch (ValidationException e) {
- // Unable to unobfuscate, data corrupt or tampered
- Log.w(TAG, "Validation error while reading preference: " + key);
- result = defValue;
- }
- } else {
- // Preference not found
- result = defValue;
- }
- return result;
- }
+ public String getString(String key, String defValue) {
+ String result;
+ String value = mPreferences.getString(key, null);
+ if (value != null) {
+ try {
+ result = mObfuscator.unobfuscate(value, key);
+ } catch (ValidationException e) {
+ // Unable to unobfuscate, data corrupt or tampered
+ Log.w(TAG, "Validation error while reading preference: " + key);
+ result = defValue;
+ }
+ } else {
+ // Preference not found
+ result = defValue;
+ }
+ return result;
+ }
- public void commit() {
- if (mEditor != null) {
- mEditor.commit();
- mEditor = null;
- }
- }
+ public void commit() {
+ if (mEditor != null) {
+ mEditor.commit();
+ mEditor = null;
+ }
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/ResponseData.java b/platform/android/java/src/com/google/android/vending/licensing/ResponseData.java
index 1c802f8e45..3b5d557e76 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/ResponseData.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/ResponseData.java
@@ -25,56 +25,57 @@ import java.util.regex.Pattern;
*/
public class ResponseData {
- public int responseCode;
- public int nonce;
- public String packageName;
- public String versionCode;
- public String userId;
- public long timestamp;
- /** Response-specific data. */
- public String extra;
+ public int responseCode;
+ public int nonce;
+ public String packageName;
+ public String versionCode;
+ public String userId;
+ public long timestamp;
+ /** Response-specific data. */
+ public String extra;
- /**
+ /**
* Parses response string into ResponseData.
*
* @param responseData response data string
* @throws IllegalArgumentException upon parsing error
* @return ResponseData object
*/
- public static ResponseData parse(String responseData) {
- // Must parse out main response data and response-specific data.
- int index = responseData.indexOf(':');
- String mainData, extraData;
- if (-1 == index) {
- mainData = responseData;
- extraData = "";
- } else {
- mainData = responseData.substring(0, index);
- extraData = index >= responseData.length() ? "" : responseData.substring(index + 1);
- }
+ public static ResponseData parse(String responseData) {
+ // Must parse out main response data and response-specific data.
+ int index = responseData.indexOf(':');
+ String mainData, extraData;
+ if (-1 == index) {
+ mainData = responseData;
+ extraData = "";
+ } else {
+ mainData = responseData.substring(0, index);
+ extraData = index >= responseData.length() ? "" : responseData.substring(index + 1);
+ }
- String[] fields = TextUtils.split(mainData, Pattern.quote("|"));
- if (fields.length < 6) {
- throw new IllegalArgumentException("Wrong number of fields.");
- }
+ String[] fields = TextUtils.split(mainData, Pattern.quote("|"));
+ if (fields.length < 6) {
+ throw new IllegalArgumentException("Wrong number of fields.");
+ }
- ResponseData data = new ResponseData();
- data.extra = extraData;
- data.responseCode = Integer.parseInt(fields[0]);
- data.nonce = Integer.parseInt(fields[1]);
- data.packageName = fields[2];
- data.versionCode = fields[3];
- // Application-specific user identifier.
- data.userId = fields[4];
- data.timestamp = Long.parseLong(fields[5]);
+ ResponseData data = new ResponseData();
+ data.extra = extraData;
+ data.responseCode = Integer.parseInt(fields[0]);
+ data.nonce = Integer.parseInt(fields[1]);
+ data.packageName = fields[2];
+ data.versionCode = fields[3];
+ // Application-specific user identifier.
+ data.userId = fields[4];
+ data.timestamp = Long.parseLong(fields[5]);
- return data;
- }
+ return data;
+ }
- @Override
- public String toString() {
- return TextUtils.join("|", new Object[] {
- responseCode, nonce, packageName, versionCode,
- userId, timestamp });
- }
+ @Override
+ public String toString() {
+ return TextUtils.join("|", new Object[] {
+ responseCode, nonce, packageName, versionCode,
+ userId, timestamp
+ });
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/ServerManagedPolicy.java b/platform/android/java/src/com/google/android/vending/licensing/ServerManagedPolicy.java
index b9a50c1104..e2f0bfdca8 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/ServerManagedPolicy.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/ServerManagedPolicy.java
@@ -43,49 +43,49 @@ import com.google.android.vending.licensing.util.URIQueryDecoder;
*/
public class ServerManagedPolicy implements Policy {
- private static final String TAG = "ServerManagedPolicy";
- private static final String PREFS_FILE = "com.google.android.vending.licensing.ServerManagedPolicy";
- private static final String PREF_LAST_RESPONSE = "lastResponse";
- private static final String PREF_VALIDITY_TIMESTAMP = "validityTimestamp";
- private static final String PREF_RETRY_UNTIL = "retryUntil";
- private static final String PREF_MAX_RETRIES = "maxRetries";
- private static final String PREF_RETRY_COUNT = "retryCount";
- private static final String PREF_LICENSING_URL = "licensingUrl";
- private static final String DEFAULT_VALIDITY_TIMESTAMP = "0";
- private static final String DEFAULT_RETRY_UNTIL = "0";
- private static final String DEFAULT_MAX_RETRIES = "0";
- private static final String DEFAULT_RETRY_COUNT = "0";
+ private static final String TAG = "ServerManagedPolicy";
+ private static final String PREFS_FILE = "com.google.android.vending.licensing.ServerManagedPolicy";
+ private static final String PREF_LAST_RESPONSE = "lastResponse";
+ private static final String PREF_VALIDITY_TIMESTAMP = "validityTimestamp";
+ private static final String PREF_RETRY_UNTIL = "retryUntil";
+ private static final String PREF_MAX_RETRIES = "maxRetries";
+ private static final String PREF_RETRY_COUNT = "retryCount";
+ private static final String PREF_LICENSING_URL = "licensingUrl";
+ private static final String DEFAULT_VALIDITY_TIMESTAMP = "0";
+ private static final String DEFAULT_RETRY_UNTIL = "0";
+ private static final String DEFAULT_MAX_RETRIES = "0";
+ private static final String DEFAULT_RETRY_COUNT = "0";
- private static final long MILLIS_PER_MINUTE = 60 * 1000;
+ private static final long MILLIS_PER_MINUTE = 60 * 1000;
- private long mValidityTimestamp;
- private long mRetryUntil;
- private long mMaxRetries;
- private long mRetryCount;
- private long mLastResponseTime = 0;
- private int mLastResponse;
- private String mLicensingUrl;
- private PreferenceObfuscator mPreferences;
+ private long mValidityTimestamp;
+ private long mRetryUntil;
+ private long mMaxRetries;
+ private long mRetryCount;
+ private long mLastResponseTime = 0;
+ private int mLastResponse;
+ private String mLicensingUrl;
+ private PreferenceObfuscator mPreferences;
- /**
+ /**
* @param context The context for the current application
* @param obfuscator An obfuscator to be used with preferences.
*/
- public ServerManagedPolicy(Context context, Obfuscator obfuscator) {
- // Import old values
- SharedPreferences sp = context.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE);
- mPreferences = new PreferenceObfuscator(sp, obfuscator);
- mLastResponse = Integer.parseInt(
- mPreferences.getString(PREF_LAST_RESPONSE, Integer.toString(Policy.RETRY)));
- mValidityTimestamp = Long.parseLong(mPreferences.getString(PREF_VALIDITY_TIMESTAMP,
- DEFAULT_VALIDITY_TIMESTAMP));
- mRetryUntil = Long.parseLong(mPreferences.getString(PREF_RETRY_UNTIL, DEFAULT_RETRY_UNTIL));
- mMaxRetries = Long.parseLong(mPreferences.getString(PREF_MAX_RETRIES, DEFAULT_MAX_RETRIES));
- mRetryCount = Long.parseLong(mPreferences.getString(PREF_RETRY_COUNT, DEFAULT_RETRY_COUNT));
- mLicensingUrl = mPreferences.getString(PREF_LICENSING_URL, null);
- }
+ public ServerManagedPolicy(Context context, Obfuscator obfuscator) {
+ // Import old values
+ SharedPreferences sp = context.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE);
+ mPreferences = new PreferenceObfuscator(sp, obfuscator);
+ mLastResponse = Integer.parseInt(
+ mPreferences.getString(PREF_LAST_RESPONSE, Integer.toString(Policy.RETRY)));
+ mValidityTimestamp = Long.parseLong(mPreferences.getString(PREF_VALIDITY_TIMESTAMP,
+ DEFAULT_VALIDITY_TIMESTAMP));
+ mRetryUntil = Long.parseLong(mPreferences.getString(PREF_RETRY_UNTIL, DEFAULT_RETRY_UNTIL));
+ mMaxRetries = Long.parseLong(mPreferences.getString(PREF_MAX_RETRIES, DEFAULT_MAX_RETRIES));
+ mRetryCount = Long.parseLong(mPreferences.getString(PREF_RETRY_COUNT, DEFAULT_RETRY_COUNT));
+ mLicensingUrl = mPreferences.getString(PREF_LICENSING_URL, null);
+ }
- /**
+ /**
* Process a new response from the license server.
* <p>
* This data will be used for computing future policy decisions. The
@@ -102,159 +102,159 @@ public class ServerManagedPolicy implements Policy {
* @param response the result from validating the server response
* @param rawData the raw server response data
*/
- public void processServerResponse(int response, ResponseData rawData) {
+ public void processServerResponse(int response, ResponseData rawData) {
- // Update retry counter
- if (response != Policy.RETRY) {
- setRetryCount(0);
- } else {
- setRetryCount(mRetryCount + 1);
- }
+ // Update retry counter
+ if (response != Policy.RETRY) {
+ setRetryCount(0);
+ } else {
+ setRetryCount(mRetryCount + 1);
+ }
- // Update server policy data
- Map<String, String> extras = decodeExtras(rawData);
- if (response == Policy.LICENSED) {
- mLastResponse = response;
- // Reset the licensing URL since it is only applicable for NOT_LICENSED responses.
- setLicensingUrl(null);
- setValidityTimestamp(extras.get("VT"));
- setRetryUntil(extras.get("GT"));
- setMaxRetries(extras.get("GR"));
- } else if (response == Policy.NOT_LICENSED) {
- // Clear out stale retry params
- setValidityTimestamp(DEFAULT_VALIDITY_TIMESTAMP);
- setRetryUntil(DEFAULT_RETRY_UNTIL);
- setMaxRetries(DEFAULT_MAX_RETRIES);
- // Update the licensing URL
- setLicensingUrl(extras.get("LU"));
- }
+ // Update server policy data
+ Map<String, String> extras = decodeExtras(rawData);
+ if (response == Policy.LICENSED) {
+ mLastResponse = response;
+ // Reset the licensing URL since it is only applicable for NOT_LICENSED responses.
+ setLicensingUrl(null);
+ setValidityTimestamp(extras.get("VT"));
+ setRetryUntil(extras.get("GT"));
+ setMaxRetries(extras.get("GR"));
+ } else if (response == Policy.NOT_LICENSED) {
+ // Clear out stale retry params
+ setValidityTimestamp(DEFAULT_VALIDITY_TIMESTAMP);
+ setRetryUntil(DEFAULT_RETRY_UNTIL);
+ setMaxRetries(DEFAULT_MAX_RETRIES);
+ // Update the licensing URL
+ setLicensingUrl(extras.get("LU"));
+ }
- setLastResponse(response);
- mPreferences.commit();
- }
+ setLastResponse(response);
+ mPreferences.commit();
+ }
- /**
+ /**
* Set the last license response received from the server and add to
* preferences. You must manually call PreferenceObfuscator.commit() to
* commit these changes to disk.
*
* @param l the response
*/
- private void setLastResponse(int l) {
- mLastResponseTime = System.currentTimeMillis();
- mLastResponse = l;
- mPreferences.putString(PREF_LAST_RESPONSE, Integer.toString(l));
- }
+ private void setLastResponse(int l) {
+ mLastResponseTime = System.currentTimeMillis();
+ mLastResponse = l;
+ mPreferences.putString(PREF_LAST_RESPONSE, Integer.toString(l));
+ }
- /**
+ /**
* Set the current retry count and add to preferences. You must manually
* call PreferenceObfuscator.commit() to commit these changes to disk.
*
* @param c the new retry count
*/
- private void setRetryCount(long c) {
- mRetryCount = c;
- mPreferences.putString(PREF_RETRY_COUNT, Long.toString(c));
- }
+ private void setRetryCount(long c) {
+ mRetryCount = c;
+ mPreferences.putString(PREF_RETRY_COUNT, Long.toString(c));
+ }
- public long getRetryCount() {
- return mRetryCount;
- }
+ public long getRetryCount() {
+ return mRetryCount;
+ }
- /**
+ /**
* Set the last validity timestamp (VT) received from the server and add to
* preferences. You must manually call PreferenceObfuscator.commit() to
* commit these changes to disk.
*
* @param validityTimestamp the VT string received
*/
- private void setValidityTimestamp(String validityTimestamp) {
- Long lValidityTimestamp;
- try {
- lValidityTimestamp = Long.parseLong(validityTimestamp);
- } catch (NumberFormatException e) {
- // No response or not parsable, expire in one minute.
- Log.w(TAG, "License validity timestamp (VT) missing, caching for a minute");
- lValidityTimestamp = System.currentTimeMillis() + MILLIS_PER_MINUTE;
- validityTimestamp = Long.toString(lValidityTimestamp);
- }
+ private void setValidityTimestamp(String validityTimestamp) {
+ Long lValidityTimestamp;
+ try {
+ lValidityTimestamp = Long.parseLong(validityTimestamp);
+ } catch (NumberFormatException e) {
+ // No response or not parsable, expire in one minute.
+ Log.w(TAG, "License validity timestamp (VT) missing, caching for a minute");
+ lValidityTimestamp = System.currentTimeMillis() + MILLIS_PER_MINUTE;
+ validityTimestamp = Long.toString(lValidityTimestamp);
+ }
- mValidityTimestamp = lValidityTimestamp;
- mPreferences.putString(PREF_VALIDITY_TIMESTAMP, validityTimestamp);
- }
+ mValidityTimestamp = lValidityTimestamp;
+ mPreferences.putString(PREF_VALIDITY_TIMESTAMP, validityTimestamp);
+ }
- public long getValidityTimestamp() {
- return mValidityTimestamp;
- }
+ public long getValidityTimestamp() {
+ return mValidityTimestamp;
+ }
- /**
+ /**
* Set the retry until timestamp (GT) received from the server and add to
* preferences. You must manually call PreferenceObfuscator.commit() to
* commit these changes to disk.
*
* @param retryUntil the GT string received
*/
- private void setRetryUntil(String retryUntil) {
- Long lRetryUntil;
- try {
- lRetryUntil = Long.parseLong(retryUntil);
- } catch (NumberFormatException e) {
- // No response or not parsable, expire immediately
- Log.w(TAG, "License retry timestamp (GT) missing, grace period disabled");
- retryUntil = "0";
- lRetryUntil = 0l;
- }
+ private void setRetryUntil(String retryUntil) {
+ Long lRetryUntil;
+ try {
+ lRetryUntil = Long.parseLong(retryUntil);
+ } catch (NumberFormatException e) {
+ // No response or not parsable, expire immediately
+ Log.w(TAG, "License retry timestamp (GT) missing, grace period disabled");
+ retryUntil = "0";
+ lRetryUntil = 0l;
+ }
- mRetryUntil = lRetryUntil;
- mPreferences.putString(PREF_RETRY_UNTIL, retryUntil);
- }
+ mRetryUntil = lRetryUntil;
+ mPreferences.putString(PREF_RETRY_UNTIL, retryUntil);
+ }
- public long getRetryUntil() {
- return mRetryUntil;
- }
+ public long getRetryUntil() {
+ return mRetryUntil;
+ }
- /**
+ /**
* Set the max retries value (GR) as received from the server and add to
* preferences. You must manually call PreferenceObfuscator.commit() to
* commit these changes to disk.
*
* @param maxRetries the GR string received
*/
- private void setMaxRetries(String maxRetries) {
- Long lMaxRetries;
- try {
- lMaxRetries = Long.parseLong(maxRetries);
- } catch (NumberFormatException e) {
- // No response or not parsable, expire immediately
- Log.w(TAG, "Licence retry count (GR) missing, grace period disabled");
- maxRetries = "0";
- lMaxRetries = 0l;
- }
+ private void setMaxRetries(String maxRetries) {
+ Long lMaxRetries;
+ try {
+ lMaxRetries = Long.parseLong(maxRetries);
+ } catch (NumberFormatException e) {
+ // No response or not parsable, expire immediately
+ Log.w(TAG, "Licence retry count (GR) missing, grace period disabled");
+ maxRetries = "0";
+ lMaxRetries = 0l;
+ }
- mMaxRetries = lMaxRetries;
- mPreferences.putString(PREF_MAX_RETRIES, maxRetries);
- }
+ mMaxRetries = lMaxRetries;
+ mPreferences.putString(PREF_MAX_RETRIES, maxRetries);
+ }
- public long getMaxRetries() {
- return mMaxRetries;
- }
+ public long getMaxRetries() {
+ return mMaxRetries;
+ }
- /**
+ /**
* Set the license URL value (LU) as received from the server and add to preferences. You must
* manually call PreferenceObfuscator.commit() to commit these changes to disk.
*
* @param url the LU string received
*/
- private void setLicensingUrl(String url) {
- mLicensingUrl = url;
- mPreferences.putString(PREF_LICENSING_URL, url);
- }
+ private void setLicensingUrl(String url) {
+ mLicensingUrl = url;
+ mPreferences.putString(PREF_LICENSING_URL, url);
+ }
- public String getLicensingUrl() {
- return mLicensingUrl;
- }
+ public String getLicensingUrl() {
+ return mLicensingUrl;
+ }
- /**
+ /**
* {@inheritDoc}
*
* This implementation allows access if either:<br>
@@ -264,36 +264,37 @@ public class ServerManagedPolicy implements Policy {
* the RETRY count or in the RETRY period.
* </ol>
*/
- public boolean allowAccess() {
- long ts = System.currentTimeMillis();
- if (mLastResponse == Policy.LICENSED) {
- // Check if the LICENSED response occurred within the validity timeout.
- if (ts <= mValidityTimestamp) {
- // Cached LICENSED response is still valid.
- return true;
- }
- } else if (mLastResponse == Policy.RETRY &&
- ts < mLastResponseTime + MILLIS_PER_MINUTE) {
- // Only allow access if we are within the retry period or we haven't used up our
- // max retries.
- return (ts <= mRetryUntil || mRetryCount <= mMaxRetries);
- }
- return false;
- }
+ public boolean allowAccess() {
+ long ts = System.currentTimeMillis();
+ if (mLastResponse == Policy.LICENSED) {
+ // Check if the LICENSED response occurred within the validity timeout.
+ if (ts <= mValidityTimestamp) {
+ // Cached LICENSED response is still valid.
+ return true;
+ }
+ } else if (mLastResponse == Policy.RETRY &&
+ ts < mLastResponseTime + MILLIS_PER_MINUTE) {
+ // Only allow access if we are within the retry period or we haven't used up our
+ // max retries.
+ return (ts <= mRetryUntil || mRetryCount <= mMaxRetries);
+ }
+ return false;
+ }
- private Map<String, String> decodeExtras(
- com.google.android.vending.licensing.ResponseData rawData) {
- Map<String, String> results = new HashMap<String, String>();
- if (rawData == null) {
- return results;
- }
+ private Map<String, String> decodeExtras(
+ com.google.android.vending.licensing.ResponseData rawData) {
+ Map<String, String> results = new HashMap<String, String>();
+ if (rawData == null) {
+ return results;
+ }
+
+ try {
+ URI rawExtras = new URI("?" + rawData.extra);
+ URIQueryDecoder.DecodeQuery(rawExtras, results);
+ } catch (URISyntaxException e) {
+ Log.w(TAG, "Invalid syntax error while decoding extras data from server.");
+ }
+ return results;
+ }
- try {
- URI rawExtras = new URI("?" + rawData.extra);
- URIQueryDecoder.DecodeQuery(rawExtras, results);
- } catch (URISyntaxException e) {
- Log.w(TAG, "Invalid syntax error while decoding extras data from server.");
- }
- return results;
- }
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/StrictPolicy.java b/platform/android/java/src/com/google/android/vending/licensing/StrictPolicy.java
index 9849730c38..c2d55c37f1 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/StrictPolicy.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/StrictPolicy.java
@@ -38,18 +38,18 @@ import java.util.Map;
*/
public class StrictPolicy implements Policy {
- private static final String TAG = "StrictPolicy";
+ private static final String TAG = "StrictPolicy";
- private int mLastResponse;
- private String mLicensingUrl;
+ private int mLastResponse;
+ private String mLicensingUrl;
- public StrictPolicy() {
- // Set default policy. This will force the application to check the policy on launch.
- mLastResponse = Policy.RETRY;
- mLicensingUrl = null;
- }
+ public StrictPolicy() {
+ // Set default policy. This will force the application to check the policy on launch.
+ mLastResponse = Policy.RETRY;
+ mLicensingUrl = null;
+ }
- /**
+ /**
* Process a new response from the license server. Since we aren't
* performing any caching, this equates to reading the LicenseResponse.
* Any cache-related ResponseData is ignored, but the licensing URL
@@ -58,42 +58,43 @@ public class StrictPolicy implements Policy {
* @param response the result from validating the server response
* @param rawData the raw server response data
*/
- public void processServerResponse(int response, ResponseData rawData) {
- mLastResponse = response;
+ public void processServerResponse(int response, ResponseData rawData) {
+ mLastResponse = response;
- if (response == Policy.NOT_LICENSED) {
- Map<String, String> extras = decodeExtras(rawData);
- mLicensingUrl = extras.get("LU");
- }
- }
+ if (response == Policy.NOT_LICENSED) {
+ Map<String, String> extras = decodeExtras(rawData);
+ mLicensingUrl = extras.get("LU");
+ }
+ }
- /**
+ /**
* {@inheritDoc}
*
* This implementation allows access if and only if a LICENSED response
* was received the last time the server was contacted.
*/
- public boolean allowAccess() {
- return (mLastResponse == Policy.LICENSED);
- }
+ public boolean allowAccess() {
+ return (mLastResponse == Policy.LICENSED);
+ }
- public String getLicensingUrl() {
- return mLicensingUrl;
- }
+ public String getLicensingUrl() {
+ return mLicensingUrl;
+ }
- private Map<String, String> decodeExtras(
- com.google.android.vending.licensing.ResponseData rawData) {
- Map<String, String> results = new HashMap<String, String>();
- if (rawData == null) {
- return results;
- }
+ private Map<String, String> decodeExtras(
+ com.google.android.vending.licensing.ResponseData rawData) {
+ Map<String, String> results = new HashMap<String, String>();
+ if (rawData == null) {
+ return results;
+ }
+
+ try {
+ URI rawExtras = new URI("?" + rawData.extra);
+ URIQueryDecoder.DecodeQuery(rawExtras, results);
+ } catch (URISyntaxException e) {
+ Log.w(TAG, "Invalid syntax error while decoding extras data from server.");
+ }
+ return results;
+ }
- try {
- URI rawExtras = new URI("?" + rawData.extra);
- URIQueryDecoder.DecodeQuery(rawExtras, results);
- } catch (URISyntaxException e) {
- Log.w(TAG, "Invalid syntax error while decoding extras data from server.");
- }
- return results;
- }
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/ValidationException.java b/platform/android/java/src/com/google/android/vending/licensing/ValidationException.java
index 79b70e6804..ee4df47c68 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/ValidationException.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/ValidationException.java
@@ -21,13 +21,13 @@ package com.google.android.vending.licensing;
* {@link Obfuscator}.}
*/
public class ValidationException extends Exception {
- public ValidationException() {
- super();
- }
+ public ValidationException() {
+ super();
+ }
- public ValidationException(String s) {
- super(s);
- }
+ public ValidationException(String s) {
+ super(s);
+ }
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/util/Base64.java b/platform/android/java/src/com/google/android/vending/licensing/util/Base64.java
index bd711aadf5..a8bf65f9ca 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/util/Base64.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/util/Base64.java
@@ -31,7 +31,9 @@ package com.google.android.vending.licensing.util;
* @version 1.3
*/
+// -- GODOT start --
import com.godot.game.BuildConfig;
+// -- GODOT end --
/**
* Base64 converter class. This code is not a full-blown MIME encoder;
@@ -41,79 +43,80 @@ import com.godot.game.BuildConfig;
* class.
*/
public class Base64 {
- /** Specify encoding (value is {@code true}). */
- public final static boolean ENCODE = true;
+ /** Specify encoding (value is {@code true}). */
+ public final static boolean ENCODE = true;
- /** Specify decoding (value is {@code false}). */
- public final static boolean DECODE = false;
+ /** Specify decoding (value is {@code false}). */
+ public final static boolean DECODE = false;
- /** The equals sign (=) as a byte. */
- private final static byte EQUALS_SIGN = (byte)'=';
+ /** The equals sign (=) as a byte. */
+ private final static byte EQUALS_SIGN = (byte) '=';
- /** The new line character (\n) as a byte. */
- private final static byte NEW_LINE = (byte)'\n';
+ /** The new line character (\n) as a byte. */
+ private final static byte NEW_LINE = (byte) '\n';
- /**
+ /**
* The 64 valid Base64 values.
*/
- private final static byte[] ALPHABET = { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F',
- (byte)'G', (byte)'H', (byte)'I', (byte)'J', (byte)'K',
- (byte)'L', (byte)'M', (byte)'N', (byte)'O', (byte)'P',
- (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U',
- (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z',
- (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e',
- (byte)'f', (byte)'g', (byte)'h', (byte)'i', (byte)'j',
- (byte)'k', (byte)'l', (byte)'m', (byte)'n', (byte)'o',
- (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t',
- (byte)'u', (byte)'v', (byte)'w', (byte)'x', (byte)'y',
- (byte)'z', (byte)'0', (byte)'1', (byte)'2', (byte)'3',
- (byte)'4', (byte)'5', (byte)'6', (byte)'7', (byte)'8',
- (byte)'9', (byte)'+', (byte)'/' };
-
- /**
+ private final static byte[] ALPHABET =
+ {(byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F',
+ (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K',
+ (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P',
+ (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U',
+ (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z',
+ (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e',
+ (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j',
+ (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o',
+ (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't',
+ (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y',
+ (byte) 'z', (byte) '0', (byte) '1', (byte) '2', (byte) '3',
+ (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8',
+ (byte) '9', (byte) '+', (byte) '/'};
+
+ /**
* The 64 valid web safe Base64 values.
*/
- private final static byte[] WEBSAFE_ALPHABET = { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F',
- (byte)'G', (byte)'H', (byte)'I', (byte)'J', (byte)'K',
- (byte)'L', (byte)'M', (byte)'N', (byte)'O', (byte)'P',
- (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U',
- (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z',
- (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e',
- (byte)'f', (byte)'g', (byte)'h', (byte)'i', (byte)'j',
- (byte)'k', (byte)'l', (byte)'m', (byte)'n', (byte)'o',
- (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t',
- (byte)'u', (byte)'v', (byte)'w', (byte)'x', (byte)'y',
- (byte)'z', (byte)'0', (byte)'1', (byte)'2', (byte)'3',
- (byte)'4', (byte)'5', (byte)'6', (byte)'7', (byte)'8',
- (byte)'9', (byte)'-', (byte)'_' };
-
- /**
+ private final static byte[] WEBSAFE_ALPHABET =
+ {(byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F',
+ (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K',
+ (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P',
+ (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U',
+ (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z',
+ (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e',
+ (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j',
+ (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o',
+ (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't',
+ (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y',
+ (byte) 'z', (byte) '0', (byte) '1', (byte) '2', (byte) '3',
+ (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8',
+ (byte) '9', (byte) '-', (byte) '_'};
+
+ /**
* Translates a Base64 value to either its 6-bit reconstruction value
* or a negative number indicating some other meaning.
**/
- private final static byte[] DECODABET = {
- -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
- -5, -5, // Whitespace: Tab and Linefeed
- -9, -9, // Decimal 11 - 12
- -5, // Whitespace: Carriage Return
- -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26
- -9, -9, -9, -9, -9, // Decimal 27 - 31
- -5, // Whitespace: Space
- -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 42
- 62, // Plus sign at decimal 43
- -9, -9, -9, // Decimal 44 - 46
- 63, // Slash at decimal 47
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine
- -9, -9, -9, // Decimal 58 - 60
- -1, // Equals sign at decimal 61
- -9, -9, -9, // Decimal 62 - 64
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A' through 'N'
- 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O' through 'Z'
- -9, -9, -9, -9, -9, -9, // Decimal 91 - 96
- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a' through 'm'
- 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n' through 'z'
- -9, -9, -9, -9, -9 // Decimal 123 - 127
- /* ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139
+ private final static byte[] DECODABET = {-9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
+ -5, -5, // Whitespace: Tab and Linefeed
+ -9, -9, // Decimal 11 - 12
+ -5, // Whitespace: Carriage Return
+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26
+ -9, -9, -9, -9, -9, // Decimal 27 - 31
+ -5, // Whitespace: Space
+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 42
+ 62, // Plus sign at decimal 43
+ -9, -9, -9, // Decimal 44 - 46
+ 63, // Slash at decimal 47
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine
+ -9, -9, -9, // Decimal 58 - 60
+ -1, // Equals sign at decimal 61
+ -9, -9, -9, // Decimal 62 - 64
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A' through 'N'
+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O' through 'Z'
+ -9, -9, -9, -9, -9, -9, // Decimal 91 - 96
+ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a' through 'm'
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n' through 'z'
+ -9, -9, -9, -9, -9 // Decimal 123 - 127
+ /* ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139
-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
@@ -123,33 +126,33 @@ public class Base64 {
-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
- };
-
- /** The web safe decodabet */
- private final static byte[] WEBSAFE_DECODABET = {
- -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
- -5, -5, // Whitespace: Tab and Linefeed
- -9, -9, // Decimal 11 - 12
- -5, // Whitespace: Carriage Return
- -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26
- -9, -9, -9, -9, -9, // Decimal 27 - 31
- -5, // Whitespace: Space
- -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 44
- 62, // Dash '-' sign at decimal 45
- -9, -9, // Decimal 46-47
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine
- -9, -9, -9, // Decimal 58 - 60
- -1, // Equals sign at decimal 61
- -9, -9, -9, // Decimal 62 - 64
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A' through 'N'
- 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O' through 'Z'
- -9, -9, -9, -9, // Decimal 91-94
- 63, // Underscore '_' at decimal 95
- -9, // Decimal 96
- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a' through 'm'
- 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n' through 'z'
- -9, -9, -9, -9, -9 // Decimal 123 - 127
- /* ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139
+ };
+
+ /** The web safe decodabet */
+ private final static byte[] WEBSAFE_DECODABET =
+ {-9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
+ -5, -5, // Whitespace: Tab and Linefeed
+ -9, -9, // Decimal 11 - 12
+ -5, // Whitespace: Carriage Return
+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26
+ -9, -9, -9, -9, -9, // Decimal 27 - 31
+ -5, // Whitespace: Space
+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 44
+ 62, // Dash '-' sign at decimal 45
+ -9, -9, // Decimal 46-47
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine
+ -9, -9, -9, // Decimal 58 - 60
+ -1, // Equals sign at decimal 61
+ -9, -9, -9, // Decimal 62 - 64
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A' through 'N'
+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O' through 'Z'
+ -9, -9, -9, -9, // Decimal 91-94
+ 63, // Underscore '_' at decimal 95
+ -9, // Decimal 96
+ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a' through 'm'
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n' through 'z'
+ -9, -9, -9, -9, -9 // Decimal 123 - 127
+ /* ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139
-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
@@ -159,20 +162,20 @@ public class Base64 {
-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
- };
+ };
- // Indicates white space in encoding
- private final static byte WHITE_SPACE_ENC = -5;
- // Indicates equals sign in encoding
- private final static byte EQUALS_SIGN_ENC = -1;
+ // Indicates white space in encoding
+ private final static byte WHITE_SPACE_ENC = -5;
+ // Indicates equals sign in encoding
+ private final static byte EQUALS_SIGN_ENC = -1;
- /** Defeats instantiation. */
- private Base64() {
- }
+ /** Defeats instantiation. */
+ private Base64() {
+ }
- /* ******** E N C O D I N G M E T H O D S ******** */
+ /* ******** E N C O D I N G M E T H O D S ******** */
- /**
+ /**
* Encodes up to three bytes of the array <var>source</var>
* and writes the resulting four Base64 bytes to <var>destination</var>.
* The source and destination arrays can be manipulated
@@ -194,47 +197,49 @@ public class Base64 {
* @return the <var>destination</var> array
* @since 1.3
*/
- private static byte[] encode3to4(byte[] source, int srcOffset,
- int numSigBytes, byte[] destination, int destOffset, byte[] alphabet) {
- // 1 2 3
- // 01234567890123456789012345678901 Bit position
- // --------000000001111111122222222 Array position from threeBytes
- // --------| || || || | Six bit groups to index alphabet
- // >>18 >>12 >> 6 >> 0 Right shift necessary
- // 0x3f 0x3f 0x3f Additional AND
-
- // Create buffer with zero-padding if there are only one or two
- // significant bytes passed in the array.
- // We have to shift left 24 in order to flush out the 1's that appear
- // when Java treats a value as negative that is cast from a byte to an int.
- int inBuff =
- (numSigBytes > 0 ? ((source[srcOffset] << 24) >>> 8) : 0) | (numSigBytes > 1 ? ((source[srcOffset + 1] << 24) >>> 16) : 0) | (numSigBytes > 2 ? ((source[srcOffset + 2] << 24) >>> 24) : 0);
-
- switch (numSigBytes) {
- case 3:
- destination[destOffset] = alphabet[(inBuff >>> 18)];
- destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f];
- destination[destOffset + 2] = alphabet[(inBuff >>> 6) & 0x3f];
- destination[destOffset + 3] = alphabet[(inBuff)&0x3f];
- return destination;
- case 2:
- destination[destOffset] = alphabet[(inBuff >>> 18)];
- destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f];
- destination[destOffset + 2] = alphabet[(inBuff >>> 6) & 0x3f];
- destination[destOffset + 3] = EQUALS_SIGN;
- return destination;
- case 1:
- destination[destOffset] = alphabet[(inBuff >>> 18)];
- destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f];
- destination[destOffset + 2] = EQUALS_SIGN;
- destination[destOffset + 3] = EQUALS_SIGN;
- return destination;
- default:
- return destination;
- } // end switch
- } // end encode3to4
-
- /**
+ private static byte[] encode3to4(byte[] source, int srcOffset,
+ int numSigBytes, byte[] destination, int destOffset, byte[] alphabet) {
+ // 1 2 3
+ // 01234567890123456789012345678901 Bit position
+ // --------000000001111111122222222 Array position from threeBytes
+ // --------| || || || | Six bit groups to index alphabet
+ // >>18 >>12 >> 6 >> 0 Right shift necessary
+ // 0x3f 0x3f 0x3f Additional AND
+
+ // Create buffer with zero-padding if there are only one or two
+ // significant bytes passed in the array.
+ // We have to shift left 24 in order to flush out the 1's that appear
+ // when Java treats a value as negative that is cast from a byte to an int.
+ int inBuff =
+ (numSigBytes > 0 ? ((source[srcOffset] << 24) >>> 8) : 0)
+ | (numSigBytes > 1 ? ((source[srcOffset + 1] << 24) >>> 16) : 0)
+ | (numSigBytes > 2 ? ((source[srcOffset + 2] << 24) >>> 24) : 0);
+
+ switch (numSigBytes) {
+ case 3:
+ destination[destOffset] = alphabet[(inBuff >>> 18)];
+ destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f];
+ destination[destOffset + 2] = alphabet[(inBuff >>> 6) & 0x3f];
+ destination[destOffset + 3] = alphabet[(inBuff) & 0x3f];
+ return destination;
+ case 2:
+ destination[destOffset] = alphabet[(inBuff >>> 18)];
+ destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f];
+ destination[destOffset + 2] = alphabet[(inBuff >>> 6) & 0x3f];
+ destination[destOffset + 3] = EQUALS_SIGN;
+ return destination;
+ case 1:
+ destination[destOffset] = alphabet[(inBuff >>> 18)];
+ destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f];
+ destination[destOffset + 2] = EQUALS_SIGN;
+ destination[destOffset + 3] = EQUALS_SIGN;
+ return destination;
+ default:
+ return destination;
+ } // end switch
+ } // end encode3to4
+
+ /**
* Encodes a byte array into Base64 notation.
* Equivalent to calling
* {@code encodeBytes(source, 0, source.length)}
@@ -242,22 +247,22 @@ public class Base64 {
* @param source The data to convert
* @since 1.4
*/
- public static String encode(byte[] source) {
- return encode(source, 0, source.length, ALPHABET, true);
- }
+ public static String encode(byte[] source) {
+ return encode(source, 0, source.length, ALPHABET, true);
+ }
- /**
+ /**
* Encodes a byte array into web safe Base64 notation.
*
* @param source The data to convert
* @param doPadding is {@code true} to pad result with '=' chars
* if it does not fall on 3 byte boundaries
*/
- public static String encodeWebSafe(byte[] source, boolean doPadding) {
- return encode(source, 0, source.length, WEBSAFE_ALPHABET, doPadding);
- }
+ public static String encodeWebSafe(byte[] source, boolean doPadding) {
+ return encode(source, 0, source.length, WEBSAFE_ALPHABET, doPadding);
+ }
- /**
+ /**
* Encodes a byte array into Base64 notation.
*
* @param source The data to convert
@@ -268,24 +273,24 @@ public class Base64 {
* if it does not fall on 3 byte boundaries
* @since 1.4
*/
- public static String encode(byte[] source, int off, int len, byte[] alphabet,
- boolean doPadding) {
- byte[] outBuff = encode(source, off, len, alphabet, Integer.MAX_VALUE);
- int outLen = outBuff.length;
-
- // If doPadding is false, set length to truncate '='
- // padding characters
- while (doPadding == false && outLen > 0) {
- if (outBuff[outLen - 1] != '=') {
- break;
- }
- outLen -= 1;
- }
-
- return new String(outBuff, 0, outLen);
- }
-
- /**
+ public static String encode(byte[] source, int off, int len, byte[] alphabet,
+ boolean doPadding) {
+ byte[] outBuff = encode(source, off, len, alphabet, Integer.MAX_VALUE);
+ int outLen = outBuff.length;
+
+ // If doPadding is false, set length to truncate '='
+ // padding characters
+ while (doPadding == false && outLen > 0) {
+ if (outBuff[outLen - 1] != '=') {
+ break;
+ }
+ outLen -= 1;
+ }
+
+ return new String(outBuff, 0, outLen);
+ }
+
+ /**
* Encodes a byte array into Base64 notation.
*
* @param source The data to convert
@@ -295,57 +300,64 @@ public class Base64 {
* @param maxLineLength maximum length of one line.
* @return the BASE64-encoded byte array
*/
- public static byte[] encode(byte[] source, int off, int len, byte[] alphabet,
- int maxLineLength) {
- int lenDiv3 = (len + 2) / 3; // ceil(len / 3)
- int len43 = lenDiv3 * 4;
- byte[] outBuff = new byte[len43 // Main 4:3
- + (len43 / maxLineLength)]; // New lines
-
- int d = 0;
- int e = 0;
- int len2 = len - 2;
- int lineLength = 0;
- for (; d < len2; d += 3, e += 4) {
-
- // The following block of code is the same as
- // encode3to4( source, d + off, 3, outBuff, e, alphabet );
- // but inlined for faster encoding (~20% improvement)
- int inBuff =
- ((source[d + off] << 24) >>> 8) | ((source[d + 1 + off] << 24) >>> 16) | ((source[d + 2 + off] << 24) >>> 24);
- outBuff[e] = alphabet[(inBuff >>> 18)];
- outBuff[e + 1] = alphabet[(inBuff >>> 12) & 0x3f];
- outBuff[e + 2] = alphabet[(inBuff >>> 6) & 0x3f];
- outBuff[e + 3] = alphabet[(inBuff)&0x3f];
-
- lineLength += 4;
- if (lineLength == maxLineLength) {
- outBuff[e + 4] = NEW_LINE;
- e++;
- lineLength = 0;
- } // end if: end of line
- } // end for: each piece of array
-
- if (d < len) {
- encode3to4(source, d + off, len - d, outBuff, e, alphabet);
-
- lineLength += 4;
- if (lineLength == maxLineLength) {
- // Add a last newline
- outBuff[e + 4] = NEW_LINE;
- e++;
- }
- e += 4;
- }
-
- if (BuildConfig.DEBUG && e != outBuff.length)
- throw new RuntimeException();
- return outBuff;
- }
-
- /* ******** D E C O D I N G M E T H O D S ******** */
-
- /**
+ public static byte[] encode(byte[] source, int off, int len, byte[] alphabet,
+ int maxLineLength) {
+ int lenDiv3 = (len + 2) / 3; // ceil(len / 3)
+ int len43 = lenDiv3 * 4;
+ byte[] outBuff = new byte[len43 // Main 4:3
+ + (len43 / maxLineLength)]; // New lines
+
+ int d = 0;
+ int e = 0;
+ int len2 = len - 2;
+ int lineLength = 0;
+ for (; d < len2; d += 3, e += 4) {
+
+ // The following block of code is the same as
+ // encode3to4( source, d + off, 3, outBuff, e, alphabet );
+ // but inlined for faster encoding (~20% improvement)
+ int inBuff =
+ ((source[d + off] << 24) >>> 8)
+ | ((source[d + 1 + off] << 24) >>> 16)
+ | ((source[d + 2 + off] << 24) >>> 24);
+ outBuff[e] = alphabet[(inBuff >>> 18)];
+ outBuff[e + 1] = alphabet[(inBuff >>> 12) & 0x3f];
+ outBuff[e + 2] = alphabet[(inBuff >>> 6) & 0x3f];
+ outBuff[e + 3] = alphabet[(inBuff) & 0x3f];
+
+ lineLength += 4;
+ if (lineLength == maxLineLength) {
+ outBuff[e + 4] = NEW_LINE;
+ e++;
+ lineLength = 0;
+ } // end if: end of line
+ } // end for: each piece of array
+
+ if (d < len) {
+ encode3to4(source, d + off, len - d, outBuff, e, alphabet);
+
+ lineLength += 4;
+ if (lineLength == maxLineLength) {
+ // Add a last newline
+ outBuff[e + 4] = NEW_LINE;
+ e++;
+ }
+ e += 4;
+ }
+
+ // -- GODOT start --
+ //assert (e == outBuff.length);
+ if (BuildConfig.DEBUG && e != outBuff.length)
+ throw new RuntimeException();
+ // -- GODOT end --
+ return outBuff;
+ }
+
+
+ /* ******** D E C O D I N G M E T H O D S ******** */
+
+
+ /**
* Decodes four bytes from array <var>source</var>
* and writes the resulting bytes (up to three of them)
* to <var>destination</var>.
@@ -368,60 +380,67 @@ public class Base64 {
* @return the number of decoded bytes converted
* @since 1.3
*/
- private static int decode4to3(byte[] source, int srcOffset,
- byte[] destination, int destOffset, byte[] decodabet) {
- // Example: Dk==
- if (source[srcOffset + 2] == EQUALS_SIGN) {
- int outBuff =
- ((decodabet[source[srcOffset]] << 24) >>> 6) | ((decodabet[source[srcOffset + 1]] << 24) >>> 12);
-
- destination[destOffset] = (byte)(outBuff >>> 16);
- return 1;
- } else if (source[srcOffset + 3] == EQUALS_SIGN) {
- // Example: DkL=
- int outBuff =
- ((decodabet[source[srcOffset]] << 24) >>> 6) | ((decodabet[source[srcOffset + 1]] << 24) >>> 12) | ((decodabet[source[srcOffset + 2]] << 24) >>> 18);
-
- destination[destOffset] = (byte)(outBuff >>> 16);
- destination[destOffset + 1] = (byte)(outBuff >>> 8);
- return 2;
- } else {
- // Example: DkLE
- int outBuff =
- ((decodabet[source[srcOffset]] << 24) >>> 6) | ((decodabet[source[srcOffset + 1]] << 24) >>> 12) | ((decodabet[source[srcOffset + 2]] << 24) >>> 18) | ((decodabet[source[srcOffset + 3]] << 24) >>> 24);
-
- destination[destOffset] = (byte)(outBuff >> 16);
- destination[destOffset + 1] = (byte)(outBuff >> 8);
- destination[destOffset + 2] = (byte)(outBuff);
- return 3;
- }
- } // end decodeToBytes
-
- /**
+ private static int decode4to3(byte[] source, int srcOffset,
+ byte[] destination, int destOffset, byte[] decodabet) {
+ // Example: Dk==
+ if (source[srcOffset + 2] == EQUALS_SIGN) {
+ int outBuff =
+ ((decodabet[source[srcOffset]] << 24) >>> 6)
+ | ((decodabet[source[srcOffset + 1]] << 24) >>> 12);
+
+ destination[destOffset] = (byte) (outBuff >>> 16);
+ return 1;
+ } else if (source[srcOffset + 3] == EQUALS_SIGN) {
+ // Example: DkL=
+ int outBuff =
+ ((decodabet[source[srcOffset]] << 24) >>> 6)
+ | ((decodabet[source[srcOffset + 1]] << 24) >>> 12)
+ | ((decodabet[source[srcOffset + 2]] << 24) >>> 18);
+
+ destination[destOffset] = (byte) (outBuff >>> 16);
+ destination[destOffset + 1] = (byte) (outBuff >>> 8);
+ return 2;
+ } else {
+ // Example: DkLE
+ int outBuff =
+ ((decodabet[source[srcOffset]] << 24) >>> 6)
+ | ((decodabet[source[srcOffset + 1]] << 24) >>> 12)
+ | ((decodabet[source[srcOffset + 2]] << 24) >>> 18)
+ | ((decodabet[source[srcOffset + 3]] << 24) >>> 24);
+
+ destination[destOffset] = (byte) (outBuff >> 16);
+ destination[destOffset + 1] = (byte) (outBuff >> 8);
+ destination[destOffset + 2] = (byte) (outBuff);
+ return 3;
+ }
+ } // end decodeToBytes
+
+
+ /**
* Decodes data from Base64 notation.
*
* @param s the string to decode (decoded in default encoding)
* @return the decoded data
* @since 1.4
*/
- public static byte[] decode(String s) throws Base64DecoderException {
- byte[] bytes = s.getBytes();
- return decode(bytes, 0, bytes.length);
- }
+ public static byte[] decode(String s) throws Base64DecoderException {
+ byte[] bytes = s.getBytes();
+ return decode(bytes, 0, bytes.length);
+ }
- /**
+ /**
* Decodes data from web safe Base64 notation.
* Web safe encoding uses '-' instead of '+', '_' instead of '/'
*
* @param s the string to decode (decoded in default encoding)
* @return the decoded data
*/
- public static byte[] decodeWebSafe(String s) throws Base64DecoderException {
- byte[] bytes = s.getBytes();
- return decodeWebSafe(bytes, 0, bytes.length);
- }
+ public static byte[] decodeWebSafe(String s) throws Base64DecoderException {
+ byte[] bytes = s.getBytes();
+ return decodeWebSafe(bytes, 0, bytes.length);
+ }
- /**
+ /**
* Decodes Base64 content in byte array format and returns
* the decoded byte array.
*
@@ -430,11 +449,11 @@ public class Base64 {
* @since 1.3
* @throws Base64DecoderException
*/
- public static byte[] decode(byte[] source) throws Base64DecoderException {
- return decode(source, 0, source.length);
- }
+ public static byte[] decode(byte[] source) throws Base64DecoderException {
+ return decode(source, 0, source.length);
+ }
- /**
+ /**
* Decodes web safe Base64 content in byte array format and returns
* the decoded data.
* Web safe encoding uses '-' instead of '+', '_' instead of '/'
@@ -442,12 +461,12 @@ public class Base64 {
* @param source the string to decode (decoded in default encoding)
* @return the decoded data
*/
- public static byte[] decodeWebSafe(byte[] source)
- throws Base64DecoderException {
- return decodeWebSafe(source, 0, source.length);
- }
+ public static byte[] decodeWebSafe(byte[] source)
+ throws Base64DecoderException {
+ return decodeWebSafe(source, 0, source.length);
+ }
- /**
+ /**
* Decodes Base64 content in byte array format and returns
* the decoded byte array.
*
@@ -458,12 +477,12 @@ public class Base64 {
* @since 1.3
* @throws Base64DecoderException
*/
- public static byte[] decode(byte[] source, int off, int len)
- throws Base64DecoderException {
- return decode(source, off, len, DECODABET);
- }
+ public static byte[] decode(byte[] source, int off, int len)
+ throws Base64DecoderException {
+ return decode(source, off, len, DECODABET);
+ }
- /**
+ /**
* Decodes web safe Base64 content in byte array format and returns
* the decoded byte array.
* Web safe encoding uses '-' instead of '+', '_' instead of '/'
@@ -473,12 +492,12 @@ public class Base64 {
* @param len The length of characters to decode
* @return decoded data
*/
- public static byte[] decodeWebSafe(byte[] source, int off, int len)
- throws Base64DecoderException {
- return decode(source, off, len, WEBSAFE_DECODABET);
- }
+ public static byte[] decodeWebSafe(byte[] source, int off, int len)
+ throws Base64DecoderException {
+ return decode(source, off, len, WEBSAFE_DECODABET);
+ }
- /**
+ /**
* Decodes Base64 content using the supplied decodabet and returns
* the decoded byte array.
*
@@ -488,69 +507,72 @@ public class Base64 {
* @param decodabet the decodabet for decoding Base64 content
* @return decoded data
*/
- public static byte[] decode(byte[] source, int off, int len, byte[] decodabet)
- throws Base64DecoderException {
- int len34 = len * 3 / 4;
- byte[] outBuff = new byte[2 + len34]; // Upper limit on size of output
- int outBuffPosn = 0;
-
- byte[] b4 = new byte[4];
- int b4Posn = 0;
- int i = 0;
- byte sbiCrop = 0;
- byte sbiDecode = 0;
- for (i = 0; i < len; i++) {
- sbiCrop = (byte)(source[i + off] & 0x7f); // Only the low seven bits
- sbiDecode = decodabet[sbiCrop];
-
- if (sbiDecode >= WHITE_SPACE_ENC) { // White space Equals sign or better
- if (sbiDecode >= EQUALS_SIGN_ENC) {
- // An equals sign (for padding) must not occur at position 0 or 1
- // and must be the last byte[s] in the encoded value
- if (sbiCrop == EQUALS_SIGN) {
- int bytesLeft = len - i;
- byte lastByte = (byte)(source[len - 1 + off] & 0x7f);
- if (b4Posn == 0 || b4Posn == 1) {
- throw new Base64DecoderException(
- "invalid padding byte '=' at byte offset " + i);
- } else if ((b4Posn == 3 && bytesLeft > 2) || (b4Posn == 4 && bytesLeft > 1)) {
- throw new Base64DecoderException(
- "padding byte '=' falsely signals end of encoded value "
- + "at offset " + i);
- } else if (lastByte != EQUALS_SIGN && lastByte != NEW_LINE) {
- throw new Base64DecoderException(
- "encoded value has invalid trailing byte");
- }
- break;
- }
-
- b4[b4Posn++] = sbiCrop;
- if (b4Posn == 4) {
- outBuffPosn += decode4to3(b4, 0, outBuff, outBuffPosn, decodabet);
- b4Posn = 0;
- }
- }
- } else {
- throw new Base64DecoderException("Bad Base64 input character at " + i + ": " + source[i + off] + "(decimal)");
- }
- }
-
- // Because web safe encoding allows non padding base64 encodes, we
- // need to pad the rest of the b4 buffer with equal signs when
- // b4Posn != 0. There can be at most 2 equal signs at the end of
- // four characters, so the b4 buffer must have two or three
- // characters. This also catches the case where the input is
- // padded with EQUALS_SIGN
- if (b4Posn != 0) {
- if (b4Posn == 1) {
- throw new Base64DecoderException("single trailing character at offset " + (len - 1));
- }
- b4[b4Posn++] = EQUALS_SIGN;
- outBuffPosn += decode4to3(b4, 0, outBuff, outBuffPosn, decodabet);
- }
-
- byte[] out = new byte[outBuffPosn];
- System.arraycopy(outBuff, 0, out, 0, outBuffPosn);
- return out;
- }
+ public static byte[] decode(byte[] source, int off, int len, byte[] decodabet)
+ throws Base64DecoderException {
+ int len34 = len * 3 / 4;
+ byte[] outBuff = new byte[2 + len34]; // Upper limit on size of output
+ int outBuffPosn = 0;
+
+ byte[] b4 = new byte[4];
+ int b4Posn = 0;
+ int i = 0;
+ byte sbiCrop = 0;
+ byte sbiDecode = 0;
+ for (i = 0; i < len; i++) {
+ sbiCrop = (byte) (source[i + off] & 0x7f); // Only the low seven bits
+ sbiDecode = decodabet[sbiCrop];
+
+ if (sbiDecode >= WHITE_SPACE_ENC) { // White space Equals sign or better
+ if (sbiDecode >= EQUALS_SIGN_ENC) {
+ // An equals sign (for padding) must not occur at position 0 or 1
+ // and must be the last byte[s] in the encoded value
+ if (sbiCrop == EQUALS_SIGN) {
+ int bytesLeft = len - i;
+ byte lastByte = (byte) (source[len - 1 + off] & 0x7f);
+ if (b4Posn == 0 || b4Posn == 1) {
+ throw new Base64DecoderException(
+ "invalid padding byte '=' at byte offset " + i);
+ } else if ((b4Posn == 3 && bytesLeft > 2)
+ || (b4Posn == 4 && bytesLeft > 1)) {
+ throw new Base64DecoderException(
+ "padding byte '=' falsely signals end of encoded value "
+ + "at offset " + i);
+ } else if (lastByte != EQUALS_SIGN && lastByte != NEW_LINE) {
+ throw new Base64DecoderException(
+ "encoded value has invalid trailing byte");
+ }
+ break;
+ }
+
+ b4[b4Posn++] = sbiCrop;
+ if (b4Posn == 4) {
+ outBuffPosn += decode4to3(b4, 0, outBuff, outBuffPosn, decodabet);
+ b4Posn = 0;
+ }
+ }
+ } else {
+ throw new Base64DecoderException("Bad Base64 input character at " + i
+ + ": " + source[i + off] + "(decimal)");
+ }
+ }
+
+ // Because web safe encoding allows non padding base64 encodes, we
+ // need to pad the rest of the b4 buffer with equal signs when
+ // b4Posn != 0. There can be at most 2 equal signs at the end of
+ // four characters, so the b4 buffer must have two or three
+ // characters. This also catches the case where the input is
+ // padded with EQUALS_SIGN
+ if (b4Posn != 0) {
+ if (b4Posn == 1) {
+ throw new Base64DecoderException("single trailing character at offset "
+ + (len - 1));
+ }
+ b4[b4Posn++] = EQUALS_SIGN;
+ outBuffPosn += decode4to3(b4, 0, outBuff, outBuffPosn, decodabet);
+ }
+
+ byte[] out = new byte[outBuffPosn];
+ System.arraycopy(outBuff, 0, out, 0, outBuffPosn);
+ return out;
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/util/Base64DecoderException.java b/platform/android/java/src/com/google/android/vending/licensing/util/Base64DecoderException.java
index 50724a9b05..1aef1b54b8 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/util/Base64DecoderException.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/util/Base64DecoderException.java
@@ -20,13 +20,13 @@ package com.google.android.vending.licensing.util;
* @author nelson
*/
public class Base64DecoderException extends Exception {
- public Base64DecoderException() {
- super();
- }
+ public Base64DecoderException() {
+ super();
+ }
- public Base64DecoderException(String s) {
- super(s);
- }
+ public Base64DecoderException(String s) {
+ super(s);
+ }
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/util/URIQueryDecoder.java b/platform/android/java/src/com/google/android/vending/licensing/util/URIQueryDecoder.java
index 4f908b472c..5155bf5ac3 100644
--- a/platform/android/java/src/com/google/android/vending/licensing/util/URIQueryDecoder.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/util/URIQueryDecoder.java
@@ -25,36 +25,36 @@ import java.util.Map;
import java.util.Scanner;
public class URIQueryDecoder {
- private static final String TAG = "URIQueryDecoder";
+ private static final String TAG = "URIQueryDecoder";
- /**
+ /**
* Decodes the query portion of the passed-in URI.
*
* @param encodedURI the URI containing the query to decode
* @param results a map containing all query parameters. Query parameters that do not have a
* value will map to a null string
*/
- static public void DecodeQuery(URI encodedURI, Map<String, String> results) {
- Scanner scanner = new Scanner(encodedURI.getRawQuery());
- scanner.useDelimiter("&");
- try {
- while (scanner.hasNext()) {
- String param = scanner.next();
- String[] valuePair = param.split("=");
- String name, value;
- if (valuePair.length == 1) {
- value = null;
- } else if (valuePair.length == 2) {
- value = URLDecoder.decode(valuePair[1], "UTF-8");
- } else {
- throw new IllegalArgumentException("query parameter invalid");
- }
- name = URLDecoder.decode(valuePair[0], "UTF-8");
- results.put(name, value);
- }
- } catch (UnsupportedEncodingException e) {
- // This should never happen.
- Log.e(TAG, "UTF-8 Not Recognized as a charset. Device configuration Error.");
- }
- }
+ static public void DecodeQuery(URI encodedURI, Map<String, String> results) {
+ Scanner scanner = new Scanner(encodedURI.getRawQuery());
+ scanner.useDelimiter("&");
+ try {
+ while (scanner.hasNext()) {
+ String param = scanner.next();
+ String[] valuePair = param.split("=");
+ String name, value;
+ if (valuePair.length == 1) {
+ value = null;
+ } else if (valuePair.length == 2) {
+ value = URLDecoder.decode(valuePair[1], "UTF-8");
+ } else {
+ throw new IllegalArgumentException("query parameter invalid");
+ }
+ name = URLDecoder.decode(valuePair[0], "UTF-8");
+ results.put(name, value);
+ }
+ } catch (UnsupportedEncodingException e) {
+ // This should never happen.
+ Log.e(TAG, "UTF-8 Not Recognized as a charset. Device configuration Error.");
+ }
+ }
}
diff --git a/platform/android/java/src/org/godotengine/godot/Godot.java b/platform/android/java/src/org/godotengine/godot/Godot.java
index 6e1841fa8b..1b3239777c 100644
--- a/platform/android/java/src/org/godotengine/godot/Godot.java
+++ b/platform/android/java/src/org/godotengine/godot/Godot.java
@@ -31,6 +31,7 @@
package org.godotengine.godot;
import android.Manifest;
+import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
@@ -56,7 +57,10 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Messenger;
+import android.os.VibrationEffect;
+import android.os.Vibrator;
import android.provider.Settings.Secure;
+import android.support.annotation.Keep;
import android.support.v4.content.ContextCompat;
import android.view.Display;
import android.view.KeyEvent;
@@ -98,8 +102,8 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
static final int MAX_SINGLETONS = 64;
static final int REQUEST_RECORD_AUDIO_PERMISSION = 1;
static final int REQUEST_CAMERA_PERMISSION = 2;
+ static final int REQUEST_VIBRATE_PERMISSION = 3;
private IStub mDownloaderClientStub;
- private IDownloaderService mRemoteService;
private TextView mStatusText;
private TextView mProgressFraction;
private TextView mProgressPercent;
@@ -222,15 +226,9 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
private Sensor mMagnetometer;
private Sensor mGyroscope;
- public FrameLayout layout;
-
public static GodotIO io;
- public static void setWindowTitle(String title) {
- //setTitle(title);
- }
-
- static SingletonBase singletons[] = new SingletonBase[MAX_SINGLETONS];
+ static SingletonBase[] singletons = new SingletonBase[MAX_SINGLETONS];
static int singleton_count = 0;
public interface ResultCallback {
@@ -266,13 +264,14 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
}
};
- public void onVideoInit() {
+ /**
+ * Used by the native code (java_godot_lib_jni.cpp) to complete initialization of the GLSurfaceView view and renderer.
+ */
+ @Keep
+ private void onVideoInit() {
boolean use_gl3 = getGLESVersionCode() >= 0x00030000;
- //mView = new GodotView(getApplication(),io,use_gl3);
- //setContentView(mView);
-
- layout = new FrameLayout(this);
+ final FrameLayout layout = new FrameLayout(this);
layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
setContentView(layout);
@@ -324,6 +323,26 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
});
}
+ /**
+ * Used by the native code (java_godot_wrapper.h) to vibrate the device.
+ * @param durationMs
+ */
+ @SuppressLint("MissingPermission")
+ @Keep
+ private void vibrate(int durationMs) {
+ if (requestPermission("VIBRATE")) {
+ Vibrator v = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
+ if (v != null) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ v.vibrate(VibrationEffect.createOneShot(durationMs, VibrationEffect.DEFAULT_AMPLITUDE));
+ } else {
+ //deprecated in API 26
+ v.vibrate(durationMs);
+ }
+ }
+ }
+ }
+
public void restart() {
// HACK:
//
@@ -405,6 +424,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
/**
* Used by the native code (java_godot_wrapper.h) to check whether the activity is resumed or paused.
*/
+ @Keep
private boolean isActivityResumed() {
return activityResumed;
}
@@ -412,10 +432,20 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
/**
* Used by the native code (java_godot_wrapper.h) to access the Android surface.
*/
+ @Keep
private Surface getSurface() {
return mView.getHolder().getSurface();
}
+ /**
+ * Used by the native code (java_godot_wrapper.h) to access the input fallback mapping.
+ * @return The input fallback mapping for the current XR mode.
+ */
+ @Keep
+ private String getInputFallbackMapping() {
+ return xrMode.inputFallbackMapping;
+ }
+
String expansion_pack_path;
private void initializeGodot() {
@@ -463,8 +493,8 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
@Override
public void onServiceConnected(Messenger m) {
- mRemoteService = DownloaderServiceMarshaller.CreateProxy(m);
- mRemoteService.onClientUpdated(mDownloaderClientStub.getMessenger());
+ IDownloaderService remoteService = DownloaderServiceMarshaller.CreateProxy(m);
+ remoteService.onClientUpdated(mDownloaderClientStub.getMessenger());
}
@Override
@@ -472,7 +502,6 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
super.onCreate(icicle);
Window window = getWindow();
- //window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
mClipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
@@ -598,7 +627,6 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
mWiFiSettingsButton = (Button)findViewById(com.godot.game.R.id.wifiSettingsButton);
return;
- } else {
}
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
@@ -610,8 +638,6 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
mCurrentIntent = getIntent();
initializeGodot();
-
- //instanceSingleton( new GodotFacebook(this) );
}
@Override
@@ -625,6 +651,10 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
GodotLib.ondestroy(this);
super.onDestroy();
+
+ // TODO: This is a temp solution. The proper fix will involve tracking down and properly shutting down each
+ // native Godot components that is started in Godot#onVideoInit.
+ forceQuit();
}
@Override
@@ -816,8 +846,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
}
}
- public void forceQuit() {
-
+ private void forceQuit() {
System.exit(0);
}
@@ -864,7 +893,6 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
}
}
- //@Override public boolean dispatchTouchEvent (MotionEvent event) {
public boolean gotTouchEvent(final MotionEvent event) {
final int evcount = event.getPointerCount();
@@ -935,8 +963,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
for (int i = cc.length; --i >= 0; cnt += cc[i] != 0 ? 1 : 0)
;
if (cnt == 0) return super.onKeyMultiple(inKeyCode, repeatCount, event);
- final Activity me = this;
- queueEvent(new Runnable() {
+ mView.queueEvent(new Runnable() {
// This method will be called on the rendering thread:
public void run() {
for (int i = 0, n = cc.length; i < n; i++) {
@@ -952,20 +979,10 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
return true;
}
- private void queueEvent(Runnable runnable) {
- // TODO Auto-generated method stub
- }
-
public PaymentsManager getPaymentsManager() {
return mPaymentsManager;
}
- /*
- public void setPaymentsManager(PaymentsManager mPaymentsManager) {
- this.mPaymentsManager = mPaymentsManager;
- }
- */
-
public boolean requestPermission(String p_name) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
// Not necessary, asked on install already
@@ -985,6 +1002,13 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
return false;
}
}
+
+ if (p_name.equals("VIBRATE")) {
+ if (ContextCompat.checkSelfPermission(this, Manifest.permission.VIBRATE) != PackageManager.PERMISSION_GRANTED) {
+ requestPermissions(new String[] { Manifest.permission.VIBRATE }, REQUEST_VIBRATE_PERMISSION);
+ return false;
+ }
+ }
return true;
}
@@ -1003,7 +1027,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
switch (newState) {
case IDownloaderClient.STATE_IDLE:
// STATE_IDLE means the service is listening, so it's
- // safe to start making calls via mRemoteService.
+ // safe to start making remote service calls.
paused = false;
indeterminate = true;
break;
diff --git a/platform/android/java/src/org/godotengine/godot/GodotLib.java b/platform/android/java/src/org/godotengine/godot/GodotLib.java
index 81c98bcc79..af51c840cb 100644
--- a/platform/android/java/src/org/godotengine/godot/GodotLib.java
+++ b/platform/android/java/src/org/godotengine/godot/GodotLib.java
@@ -30,8 +30,14 @@
package org.godotengine.godot;
-// Wrapper for native library
+import android.app.Activity;
+import android.hardware.SensorEvent;
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+/**
+ * Wrapper for native library
+ */
public class GodotLib {
public static GodotIO io;
@@ -41,36 +47,168 @@ public class GodotLib {
}
/**
- * @param width the current view width
- * @param height the current view height
- */
-
+ * Invoked on the main thread to initialize Godot native layer.
+ */
public static native void initialize(Godot p_instance, Object p_asset_manager, boolean use_apk_expansion);
+
+ /**
+ * Invoked on the main thread to clean up Godot native layer.
+ * @see Activity#onDestroy()
+ */
public static native void ondestroy(Godot p_instance);
+
+ /**
+ * Invoked on the GL thread to complete setup for the Godot native layer logic.
+ * @param p_cmdline Command line arguments used to configure Godot native layer components.
+ */
public static native void setup(String[] p_cmdline);
+
+ /**
+ * Invoked on the GL thread when the underlying Android surface has changed size.
+ * @param width
+ * @param height
+ * @see android.opengl.GLSurfaceView.Renderer#onSurfaceChanged(GL10, int, int)
+ */
public static native void resize(int width, int height);
+
+ /**
+ * Invoked on the GL thread when the underlying Android surface is created or recreated.
+ * @param p_32_bits
+ * @see android.opengl.GLSurfaceView.Renderer#onSurfaceCreated(GL10, EGLConfig)
+ */
public static native void newcontext(boolean p_32_bits);
+
+ /**
+ * Forward {@link Activity#onBackPressed()} event from the main thread to the GL thread.
+ */
public static native void back();
+
+ /**
+ * Invoked on the GL thread to draw the current frame.
+ * @see android.opengl.GLSurfaceView.Renderer#onDrawFrame(GL10)
+ */
public static native void step();
+
+ /**
+ * Forward touch events from the main thread to the GL thread.
+ */
public static native void touch(int what, int pointer, int howmany, int[] arr);
+
+ /**
+ * Forward accelerometer sensor events from the main thread to the GL thread.
+ * @see android.hardware.SensorEventListener#onSensorChanged(SensorEvent)
+ */
public static native void accelerometer(float x, float y, float z);
+
+ /**
+ * Forward gravity sensor events from the main thread to the GL thread.
+ * @see android.hardware.SensorEventListener#onSensorChanged(SensorEvent)
+ */
public static native void gravity(float x, float y, float z);
+
+ /**
+ * Forward magnetometer sensor events from the main thread to the GL thread.
+ * @see android.hardware.SensorEventListener#onSensorChanged(SensorEvent)
+ */
public static native void magnetometer(float x, float y, float z);
+
+ /**
+ * Forward gyroscope sensor events from the main thread to the GL thread.
+ * @see android.hardware.SensorEventListener#onSensorChanged(SensorEvent)
+ */
public static native void gyroscope(float x, float y, float z);
+
+ /**
+ * Forward regular key events from the main thread to the GL thread.
+ */
public static native void key(int p_scancode, int p_unicode_char, boolean p_pressed);
+
+ /**
+ * Forward game device's key events from the main thread to the GL thread.
+ */
public static native void joybutton(int p_device, int p_but, boolean p_pressed);
+
+ /**
+ * Forward joystick devices axis motion events from the main thread to the GL thread.
+ */
public static native void joyaxis(int p_device, int p_axis, float p_value);
+
+ /**
+ * Forward joystick devices hat motion events from the main thread to the GL thread.
+ */
public static native void joyhat(int p_device, int p_hat_x, int p_hat_y);
+
+ /**
+ * Fires when a joystick device is added or removed.
+ */
public static native void joyconnectionchanged(int p_device, boolean p_connected, String p_name);
+
+ /**
+ * Invoked when the Android activity resumes.
+ * @see Activity#onResume()
+ */
public static native void focusin();
+
+ /**
+ * Invoked when the Android activity pauses.
+ * @see Activity#onPause()
+ */
public static native void focusout();
+
+ /**
+ * Invoked when the audio thread is started.
+ */
public static native void audio();
+
+ /**
+ * Used to setup a {@link org.godotengine.godot.Godot.SingletonBase} instance.
+ * @param p_name Name of the instance.
+ * @param p_object Reference to the singleton instance.
+ */
public static native void singleton(String p_name, Object p_object);
+
+ /**
+ * Used to complete registration of the {@link org.godotengine.godot.Godot.SingletonBase} instance's methods.
+ * @param p_sname Name of the instance
+ * @param p_name Name of the method to register
+ * @param p_ret Return type of the registered method
+ * @param p_params Method parameters types
+ */
public static native void method(String p_sname, String p_name, String p_ret, String[] p_params);
+
+ /**
+ * Used to access Godot global properties.
+ * @param p_key Property key
+ * @return String value of the property
+ */
public static native String getGlobal(String p_key);
+
+ /**
+ * Invoke method |p_method| on the Godot object specified by |p_id|
+ * @param p_id Id of the Godot object to invoke
+ * @param p_method Name of the method to invoke
+ * @param p_params Parameters to use for method invocation
+ */
public static native void callobject(int p_id, String p_method, Object[] p_params);
+
+ /**
+ * Invoke method |p_method| on the Godot object specified by |p_id| during idle time.
+ * @param p_id Id of the Godot object to invoke
+ * @param p_method Name of the method to invoke
+ * @param p_params Parameters to use for method invocation
+ */
public static native void calldeferred(int p_id, String p_method, Object[] p_params);
+
+ /**
+ * Forward the results from a permission request.
+ * @see Activity#onRequestPermissionsResult(int, String[], int[])
+ * @param p_permission Request permission
+ * @param p_result True if the permission was granted, false otherwise
+ */
public static native void requestPermissionResult(String p_permission, boolean p_result);
+ /**
+ * Invoked on the GL thread to configure the height of the virtual keyboard.
+ */
public static native void setVirtualKeyboardHeight(int p_height);
}
diff --git a/platform/android/java/src/org/godotengine/godot/xr/XRMode.java b/platform/android/java/src/org/godotengine/godot/xr/XRMode.java
index dd5701af7d..5896b23ac3 100644
--- a/platform/android/java/src/org/godotengine/godot/xr/XRMode.java
+++ b/platform/android/java/src/org/godotengine/godot/xr/XRMode.java
@@ -34,16 +34,18 @@ package org.godotengine.godot.xr;
* Godot available XR modes.
*/
public enum XRMode {
- REGULAR(0, "Regular", "--xr_mode_regular"), // Regular/flatscreen
- OVR(1, "Oculus Mobile VR", "--xr_mode_ovr");
+ REGULAR(0, "Regular", "--xr_mode_regular", "Default Android Gamepad"), // Regular/flatscreen
+ OVR(1, "Oculus Mobile VR", "--xr_mode_ovr", "");
final int index;
final String label;
public final String cmdLineArg;
+ public final String inputFallbackMapping;
- XRMode(int index, String label, String cmdLineArg) {
+ XRMode(int index, String label, String cmdLineArg, String inputFallbackMapping) {
this.index = index;
this.label = label;
this.cmdLineArg = cmdLineArg;
+ this.inputFallbackMapping = inputFallbackMapping;
}
}
diff --git a/platform/android/java_godot_lib_jni.cpp b/platform/android/java_godot_lib_jni.cpp
index 1159e93166..f53df7afe9 100644
--- a/platform/android/java_godot_lib_jni.cpp
+++ b/platform/android/java_godot_lib_jni.cpp
@@ -644,7 +644,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *en
godot_java->on_video_init(env);
}
-JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ondestroy(JNIEnv *env) {
+JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ondestroy(JNIEnv *env, jobject obj, jobject activity) {
// lets cleanup
if (godot_io_java) {
delete godot_io_java;
diff --git a/platform/android/java_godot_lib_jni.h b/platform/android/java_godot_lib_jni.h
index f99935bf7c..66591a2cb2 100644
--- a/platform/android/java_godot_lib_jni.h
+++ b/platform/android/java_godot_lib_jni.h
@@ -38,7 +38,7 @@
// See java/src/org/godotengine/godot/GodotLib.java for the JAVA side of this (yes that's why we have the long names)
extern "C" {
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *env, jobject obj, jobject activity, jobject p_asset_manager, jboolean p_use_apk_expansion);
-JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ondestroy(JNIEnv *env);
+JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ondestroy(JNIEnv *env, jobject obj, jobject activity);
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_setup(JNIEnv *env, jobject obj, jobjectArray p_cmdline);
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_resize(JNIEnv *env, jobject obj, jint width, jint height);
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv *env, jobject obj, bool p_32_bits);
diff --git a/platform/android/java_godot_wrapper.cpp b/platform/android/java_godot_wrapper.cpp
index 339b14974c..8194ee6ecf 100644
--- a/platform/android/java_godot_wrapper.cpp
+++ b/platform/android/java_godot_wrapper.cpp
@@ -62,6 +62,8 @@ GodotJavaWrapper::GodotJavaWrapper(JNIEnv *p_env, jobject p_godot_instance) {
_init_input_devices = p_env->GetMethodID(cls, "initInputDevices", "()V");
_get_surface = p_env->GetMethodID(cls, "getSurface", "()Landroid/view/Surface;");
_is_activity_resumed = p_env->GetMethodID(cls, "isActivityResumed", "()Z");
+ _vibrate = p_env->GetMethodID(cls, "vibrate", "(I)V");
+ _get_input_fallback_mapping = p_env->GetMethodID(cls, "getInputFallbackMapping", "()Ljava/lang/String;");
}
GodotJavaWrapper::~GodotJavaWrapper() {
@@ -165,6 +167,16 @@ String GodotJavaWrapper::get_clipboard() {
}
}
+String GodotJavaWrapper::get_input_fallback_mapping() {
+ if (_get_input_fallback_mapping) {
+ JNIEnv *env = ThreadAndroid::get_env();
+ jstring fallback_mapping = (jstring)env->CallObjectMethod(godot_instance, _get_input_fallback_mapping);
+ return jstring_to_string(fallback_mapping, env);
+ } else {
+ return String();
+ }
+}
+
bool GodotJavaWrapper::has_set_clipboard() {
return _set_clipboard != 0;
}
@@ -211,3 +223,10 @@ bool GodotJavaWrapper::is_activity_resumed() {
return false;
}
}
+
+void GodotJavaWrapper::vibrate(int p_duration_ms) {
+ if (_vibrate) {
+ JNIEnv *env = ThreadAndroid::get_env();
+ env->CallVoidMethod(godot_instance, _vibrate, p_duration_ms);
+ }
+}
diff --git a/platform/android/java_godot_wrapper.h b/platform/android/java_godot_wrapper.h
index 82c2a5d122..b1bd9b7f48 100644
--- a/platform/android/java_godot_wrapper.h
+++ b/platform/android/java_godot_wrapper.h
@@ -57,6 +57,8 @@ private:
jmethodID _init_input_devices = 0;
jmethodID _get_surface = 0;
jmethodID _is_activity_resumed = 0;
+ jmethodID _vibrate = 0;
+ jmethodID _get_input_fallback_mapping = 0;
public:
GodotJavaWrapper(JNIEnv *p_env, jobject p_godot_instance);
@@ -82,6 +84,8 @@ public:
void init_input_devices();
jobject get_surface();
bool is_activity_resumed();
+ void vibrate(int p_duration_ms);
+ String get_input_fallback_mapping();
};
#endif /* !JAVA_GODOT_WRAPPER_H */
diff --git a/platform/android/os_android.cpp b/platform/android/os_android.cpp
index 701a351203..49ab0ea84a 100644
--- a/platform/android/os_android.cpp
+++ b/platform/android/os_android.cpp
@@ -173,7 +173,7 @@ Error OS_Android::initialize(const VideoMode &p_desired, int p_video_driver, int
AudioDriverManager::initialize(p_audio_driver);
input = memnew(InputDefault);
- input->set_fallback_mapping("Default Android Gamepad");
+ input->set_fallback_mapping(godot_java->get_input_fallback_mapping());
///@TODO implement a subclass for Android and instantiate that instead
camera_server = memnew(CameraServer);
@@ -700,6 +700,10 @@ String OS_Android::get_joy_guid(int p_device) const {
return input->get_joy_guid_remapped(p_device);
}
+void OS_Android::vibrate_handheld(int p_duration_ms) {
+ godot_java->vibrate(p_duration_ms);
+}
+
bool OS_Android::_check_internal_feature_support(const String &p_feature) {
if (p_feature == "mobile") {
//TODO support etc2 only if GLES3 driver is selected
diff --git a/platform/android/os_android.h b/platform/android/os_android.h
index e74d4cfd43..a17941f7c0 100644
--- a/platform/android/os_android.h
+++ b/platform/android/os_android.h
@@ -198,6 +198,7 @@ public:
virtual bool is_joy_known(int p_device);
virtual String get_joy_guid(int p_device) const;
void joy_connection_changed(int p_device, bool p_connected, String p_name);
+ void vibrate_handheld(int p_duration_ms);
virtual bool _check_internal_feature_support(const String &p_feature);
OS_Android(GodotJavaWrapper *p_godot_java, GodotIOJavaWrapper *p_godot_io_java, bool p_use_apk_expansion);
diff --git a/platform/android/thread_jandroid.h b/platform/android/thread_jandroid.h
index 1e1c00ab39..0b6e1f4b4a 100644
--- a/platform/android/thread_jandroid.h
+++ b/platform/android/thread_jandroid.h
@@ -31,10 +31,6 @@
#ifndef THREAD_POSIX_H
#define THREAD_POSIX_H
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
#include "core/os/thread.h"
#include <jni.h>
#include <pthread.h>
diff --git a/platform/iphone/app_delegate.mm b/platform/iphone/app_delegate.mm
index 64405bfa5b..3f1230faa8 100644
--- a/platform/iphone/app_delegate.mm
+++ b/platform/iphone/app_delegate.mm
@@ -37,6 +37,7 @@
#include "os_iphone.h"
#import "GameController/GameController.h"
+#import <AudioToolbox/AudioServices.h>
#define kFilteringFactor 0.1
#define kRenderingFrequency 60
@@ -61,6 +62,10 @@ void _set_keep_screen_on(bool p_enabled) {
[[UIApplication sharedApplication] setIdleTimerDisabled:(BOOL)p_enabled];
};
+void _vibrate() {
+ AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
+};
+
@implementation AppDelegate
@synthesize window;
diff --git a/platform/iphone/os_iphone.cpp b/platform/iphone/os_iphone.cpp
index 825342f911..353078c51c 100644
--- a/platform/iphone/os_iphone.cpp
+++ b/platform/iphone/os_iphone.cpp
@@ -470,6 +470,7 @@ extern void _show_keyboard(String p_existing);
extern void _hide_keyboard();
extern Error _shell_open(String p_uri);
extern void _set_keep_screen_on(bool p_enabled);
+extern void _vibrate();
void OSIPhone::show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect) {
_show_keyboard(p_existing_text);
@@ -585,6 +586,11 @@ void OSIPhone::native_video_stop() {
_stop_video();
}
+void OSIPhone::vibrate_handheld(int p_duration_ms) {
+ // iOS does not support duration for vibration
+ _vibrate();
+}
+
bool OSIPhone::_check_internal_feature_support(const String &p_feature) {
return p_feature == "mobile";
diff --git a/platform/iphone/os_iphone.h b/platform/iphone/os_iphone.h
index c16c29a858..804ba0b1af 100644
--- a/platform/iphone/os_iphone.h
+++ b/platform/iphone/os_iphone.h
@@ -195,6 +195,7 @@ public:
virtual void native_video_unpause();
virtual void native_video_focus_out();
virtual void native_video_stop();
+ virtual void vibrate_handheld(int p_duration_ms = 500);
virtual bool _check_internal_feature_support(const String &p_feature);
OSIPhone(int width, int height, String p_data_dir);
diff --git a/platform/iphone/view_controller.h b/platform/iphone/view_controller.h
index fc18661f62..68e3bc64fc 100644
--- a/platform/iphone/view_controller.h
+++ b/platform/iphone/view_controller.h
@@ -39,6 +39,10 @@
- (void)didReceiveMemoryWarning;
+- (void)viewDidLoad;
+
+- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures;
+
- (BOOL)prefersStatusBarHidden;
@end
diff --git a/platform/iphone/view_controller.mm b/platform/iphone/view_controller.mm
index 0358abf9e2..e52ad92bf2 100644
--- a/platform/iphone/view_controller.mm
+++ b/platform/iphone/view_controller.mm
@@ -83,6 +83,18 @@ int add_cmdline(int p_argc, char **p_args) {
printf("*********** did receive memory warning!\n");
};
+- (void)viewDidLoad {
+ [super viewDidLoad];
+
+ if (@available(iOS 11.0, *)) {
+ [self setNeedsUpdateOfScreenEdgesDeferringSystemGestures];
+ }
+}
+
+- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures {
+ return UIRectEdgeAll;
+}
+
- (BOOL)shouldAutorotate {
switch (OS::get_singleton()->get_screen_orientation()) {
case OS::SCREEN_SENSOR:
diff --git a/platform/osx/dir_access_osx.h b/platform/osx/dir_access_osx.h
index e1aa038c61..c5951a570e 100644
--- a/platform/osx/dir_access_osx.h
+++ b/platform/osx/dir_access_osx.h
@@ -41,9 +41,6 @@
#include "core/os/dir_access.h"
#include "drivers/unix/dir_access_unix.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class DirAccessOSX : public DirAccessUnix {
protected:
virtual String fix_unicode_name(const char *p_name) const;
diff --git a/platform/osx/os_osx.h b/platform/osx/os_osx.h
index a83d5084ed..f1f37e24d2 100644
--- a/platform/osx/os_osx.h
+++ b/platform/osx/os_osx.h
@@ -51,9 +51,6 @@
#include <CoreVideo/CoreVideo.h>
#undef CursorShape
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class OS_OSX : public OS_Unix {
public:
@@ -160,6 +157,26 @@ public:
int video_driver_index;
virtual int get_current_video_driver() const;
+ struct GlobalMenuItem {
+ String label;
+ Variant signal;
+ Variant meta;
+
+ GlobalMenuItem() {
+ //NOP
+ }
+
+ GlobalMenuItem(const String &p_label, const Variant &p_signal, const Variant &p_meta) {
+ label = p_label;
+ signal = p_signal;
+ meta = p_meta;
+ }
+ };
+
+ Map<String, Vector<GlobalMenuItem> > global_menus;
+
+ void _update_global_menu();
+
protected:
virtual void initialize_core();
virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
@@ -171,6 +188,11 @@ protected:
public:
static OS_OSX *singleton;
+ void global_menu_add_item(const String &p_menu, const String &p_label, const Variant &p_signal, const Variant &p_meta);
+ void global_menu_add_separator(const String &p_menu);
+ void global_menu_remove_item(const String &p_menu, int p_idx);
+ void global_menu_clear(const String &p_menu);
+
void wm_minimized(bool p_minimized);
virtual String get_name() const;
diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm
index ab77897b08..f48d4a307d 100644
--- a/platform/osx/os_osx.mm
+++ b/platform/osx/os_osx.mm
@@ -204,11 +204,53 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt
}
}
+- (void)globalMenuCallback:(id)sender {
+
+ if (![sender representedObject])
+ return;
+
+ OS_OSX::GlobalMenuItem *item = (OS_OSX::GlobalMenuItem *)[[sender representedObject] pointerValue];
+
+ if (!item)
+ return;
+
+ OS_OSX::singleton->main_loop->global_menu_action(item->signal, item->meta);
+}
+
+- (NSMenu *)applicationDockMenu:(NSApplication *)sender {
+
+ NSMenu *menu = [[[NSMenu alloc] initWithTitle:@""] autorelease];
+
+ Vector<OS_OSX::GlobalMenuItem> &E = OS_OSX::singleton->global_menus["_dock"];
+ for (int i = 0; i < E.size(); i++) {
+ if (E[i].label == String()) {
+ [menu addItem:[NSMenuItem separatorItem]];
+ } else {
+ NSMenuItem *menu_item = [menu addItemWithTitle:[NSString stringWithUTF8String:E[i].label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:@""];
+ [menu_item setRepresentedObject:[NSValue valueWithPointer:&(E[i])]];
+ }
+ }
+
+ return menu;
+}
+
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename {
- // Note: called before main loop init!
+ // Note: may be called called before main loop init!
char *utfs = strdup([filename UTF8String]);
OS_OSX::singleton->open_with_filename.parse_utf8(utfs);
free(utfs);
+
+#ifdef TOOLS_ENABLED
+ // Open new instance
+ if (OS_OSX::singleton->get_main_loop()) {
+ List<String> args;
+ args.push_back(OS_OSX::singleton->open_with_filename);
+ String exec = OS::get_singleton()->get_executable_path();
+
+ OS::ProcessID pid = 0;
+ OS::get_singleton()->execute(exec, args, false, &pid);
+ }
+#endif
return YES;
}
@@ -1266,6 +1308,56 @@ inline void sendPanEvent(double dx, double dy, int modifierFlags) {
@end
+void OS_OSX::_update_global_menu() {
+
+ NSMenu *main_menu = [NSApp mainMenu];
+
+ for (int i = 1; i < [main_menu numberOfItems]; i++) {
+ [main_menu removeItemAtIndex:i];
+ }
+ for (Map<String, Vector<GlobalMenuItem> >::Element *E = global_menus.front(); E; E = E->next()) {
+ if (E->key() != "_dock") {
+ NSMenu *menu = [[[NSMenu alloc] initWithTitle:[NSString stringWithUTF8String:E->key().utf8().get_data()]] autorelease];
+ for (int i = 0; i < E->get().size(); i++) {
+ if (E->get()[i].label == String()) {
+ [menu addItem:[NSMenuItem separatorItem]];
+ } else {
+ NSMenuItem *menu_item = [menu addItemWithTitle:[NSString stringWithUTF8String:E->get()[i].label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:@""];
+ [menu_item setRepresentedObject:[NSValue valueWithPointer:&(E->get()[i])]];
+ }
+ }
+ NSMenuItem *menu_item = [main_menu addItemWithTitle:[NSString stringWithUTF8String:E->key().utf8().get_data()] action:nil keyEquivalent:@""];
+ [main_menu setSubmenu:menu forItem:menu_item];
+ }
+ }
+}
+
+void OS_OSX::global_menu_add_item(const String &p_menu, const String &p_label, const Variant &p_signal, const Variant &p_meta) {
+
+ global_menus[p_menu].push_back(GlobalMenuItem(p_label, p_signal, p_meta));
+ _update_global_menu();
+}
+
+void OS_OSX::global_menu_add_separator(const String &p_menu) {
+
+ global_menus[p_menu].push_back(GlobalMenuItem());
+ _update_global_menu();
+}
+
+void OS_OSX::global_menu_remove_item(const String &p_menu, int p_idx) {
+
+ ERR_FAIL_INDEX(p_idx, global_menus[p_menu].size());
+
+ global_menus[p_menu].remove(p_idx);
+ _update_global_menu();
+}
+
+void OS_OSX::global_menu_clear(const String &p_menu) {
+
+ global_menus[p_menu].clear();
+ _update_global_menu();
+}
+
Point2 OS_OSX::get_ime_selection() const {
return im_selection;
diff --git a/platform/server/os_server.h b/platform/server/os_server.h
index dbdae6afb1..b8119288ff 100644
--- a/platform/server/os_server.h
+++ b/platform/server/os_server.h
@@ -47,9 +47,6 @@
#include "servers/visual_server.h"
#undef CursorShape
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class OS_Server : public OS_Unix {
diff --git a/platform/uwp/export/export.cpp b/platform/uwp/export/export.cpp
index 662ee49935..ea110b11ca 100644
--- a/platform/uwp/export/export.cpp
+++ b/platform/uwp/export/export.cpp
@@ -30,9 +30,9 @@
#include "export.h"
#include "core/bind/core_bind.h"
+#include "core/crypto/crypto_core.h"
#include "core/io/marshalls.h"
#include "core/io/zip_io.h"
-#include "core/math/crypto_core.h"
#include "core/object.h"
#include "core/os/dir_access.h"
#include "core/os/file_access.h"
diff --git a/platform/uwp/os_uwp.h b/platform/uwp/os_uwp.h
index b7a7248f19..370cab6a9b 100644
--- a/platform/uwp/os_uwp.h
+++ b/platform/uwp/os_uwp.h
@@ -50,9 +50,6 @@
#include <stdio.h>
#include <windows.h>
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class OS_UWP : public OS {
public:
diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h
index ce55328173..915d025e3b 100644
--- a/platform/windows/os_windows.h
+++ b/platform/windows/os_windows.h
@@ -56,10 +56,6 @@
#include <windows.h>
#include <windowsx.h>
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
typedef struct {
BYTE bWidth; // Width, in pixels, of the image
BYTE bHeight; // Height, in pixels, of the image
diff --git a/platform/x11/context_gl_x11.h b/platform/x11/context_gl_x11.h
index 46420df48b..095ce2154b 100644
--- a/platform/x11/context_gl_x11.h
+++ b/platform/x11/context_gl_x11.h
@@ -31,9 +31,6 @@
#ifndef CONTEXT_GL_X11_H
#define CONTEXT_GL_X11_H
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
#ifdef X11_ENABLED
#if defined(OPENGL_ENABLED)
diff --git a/platform/x11/key_mapping_x11.h b/platform/x11/key_mapping_x11.h
index 853fe7954a..4e25d6a6ed 100644
--- a/platform/x11/key_mapping_x11.h
+++ b/platform/x11/key_mapping_x11.h
@@ -31,9 +31,6 @@
#ifndef KEY_MAPPING_X11_H
#define KEY_MAPPING_X11_H
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
#include <X11/XF86keysym.h>
#include <X11/Xlib.h>
#define XK_MISCELLANY
diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp
index ca72393e43..dfa0a45538 100644
--- a/platform/x11/os_x11.cpp
+++ b/platform/x11/os_x11.cpp
@@ -1757,7 +1757,10 @@ void OS_X11::handle_key_event(XKeyEvent *p_event, bool p_echo) {
// XLookupString returns keysyms usable as nice scancodes/
char str[256 + 1];
- XLookupString(xkeyevent, str, 256, &keysym_keycode, NULL);
+ XKeyEvent xkeyevent_no_mod = *xkeyevent;
+ xkeyevent_no_mod.state &= ~ShiftMask;
+ xkeyevent_no_mod.state &= ~ControlMask;
+ XLookupString(&xkeyevent_no_mod, str, 256, &keysym_keycode, NULL);
// Meanwhile, XLookupString returns keysyms useful for unicode.
diff --git a/platform/x11/os_x11.h b/platform/x11/os_x11.h
index a4c22cf08a..e6c2effacf 100644
--- a/platform/x11/os_x11.h
+++ b/platform/x11/os_x11.h
@@ -77,9 +77,6 @@ typedef struct _xrr_monitor_info {
} xrr_monitor_info;
#undef CursorShape
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class OS_X11 : public OS_Unix {
diff --git a/scene/2d/canvas_item.cpp b/scene/2d/canvas_item.cpp
index b605be47df..fc5e5cbba2 100644
--- a/scene/2d/canvas_item.cpp
+++ b/scene/2d/canvas_item.cpp
@@ -641,6 +641,9 @@ void CanvasItem::update() {
void CanvasItem::set_modulate(const Color &p_modulate) {
+ if (modulate == p_modulate)
+ return;
+
modulate = p_modulate;
VisualServer::get_singleton()->canvas_item_set_modulate(canvas_item, modulate);
}
@@ -679,6 +682,9 @@ CanvasItem *CanvasItem::get_parent_item() const {
void CanvasItem::set_self_modulate(const Color &p_self_modulate) {
+ if (self_modulate == p_self_modulate)
+ return;
+
self_modulate = p_self_modulate;
VisualServer::get_singleton()->canvas_item_set_self_modulate(canvas_item, self_modulate);
}
@@ -689,6 +695,9 @@ Color CanvasItem::get_self_modulate() const {
void CanvasItem::set_light_mask(int p_light_mask) {
+ if (light_mask == p_light_mask)
+ return;
+
light_mask = p_light_mask;
VS::get_singleton()->canvas_item_set_light_mask(canvas_item, p_light_mask);
}
diff --git a/scene/2d/collision_object_2d.cpp b/scene/2d/collision_object_2d.cpp
index 202c7c9cf2..228b67990c 100644
--- a/scene/2d/collision_object_2d.cpp
+++ b/scene/2d/collision_object_2d.cpp
@@ -376,11 +376,12 @@ void CollisionObject2D::set_only_update_transform_changes(bool p_enable) {
void CollisionObject2D::_update_pickable() {
if (!is_inside_tree())
return;
- bool pickable = this->pickable && is_inside_tree() && is_visible_in_tree();
+
+ bool is_pickable = pickable && is_visible_in_tree();
if (area)
- Physics2DServer::get_singleton()->area_set_pickable(rid, pickable);
+ Physics2DServer::get_singleton()->area_set_pickable(rid, is_pickable);
else
- Physics2DServer::get_singleton()->body_set_pickable(rid, pickable);
+ Physics2DServer::get_singleton()->body_set_pickable(rid, is_pickable);
}
String CollisionObject2D::get_configuration_warning() const {
diff --git a/scene/2d/cpu_particles_2d.h b/scene/2d/cpu_particles_2d.h
index 1cd22df9e7..da668664b9 100644
--- a/scene/2d/cpu_particles_2d.h
+++ b/scene/2d/cpu_particles_2d.h
@@ -35,10 +35,6 @@
#include "scene/2d/node_2d.h"
#include "scene/resources/texture.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class CPUParticles2D : public Node2D {
private:
GDCLASS(CPUParticles2D, Node2D);
diff --git a/scene/2d/navigation_2d.cpp b/scene/2d/navigation_2d.cpp
index f644db462b..5cf28d6c89 100644
--- a/scene/2d/navigation_2d.cpp
+++ b/scene/2d/navigation_2d.cpp
@@ -551,7 +551,7 @@ Vector<Vector2> Navigation2D::get_simple_path(const Vector2 &p_start, const Vect
left_poly = p;
portal_left = apex_point;
portal_right = apex_point;
- if (!path.size() || !Math::is_zero_approx(path[path.size() - 1].distance_to(apex_point)))
+ if (!path.size() || path[path.size() - 1] != apex_point)
path.push_back(apex_point);
skip = true;
}
@@ -569,7 +569,7 @@ Vector<Vector2> Navigation2D::get_simple_path(const Vector2 &p_start, const Vect
right_poly = p;
portal_right = apex_point;
portal_left = apex_point;
- if (!path.size() || !Math::is_zero_approx(path[path.size() - 1].distance_to(apex_point)))
+ if (!path.size() || path[path.size() - 1] != apex_point)
path.push_back(apex_point);
}
}
diff --git a/scene/2d/parallax_layer.cpp b/scene/2d/parallax_layer.cpp
index 9a6b63b9a3..0823e09110 100644
--- a/scene/2d/parallax_layer.cpp
+++ b/scene/2d/parallax_layer.cpp
@@ -69,6 +69,9 @@ Size2 ParallaxLayer::get_motion_offset() const {
void ParallaxLayer::_update_mirroring() {
+ if (!is_inside_tree())
+ return;
+
ParallaxBackground *pb = Object::cast_to<ParallaxBackground>(get_parent());
if (pb) {
diff --git a/scene/2d/path_2d.cpp b/scene/2d/path_2d.cpp
index f2f53d4354..55c8c7f229 100644
--- a/scene/2d/path_2d.cpp
+++ b/scene/2d/path_2d.cpp
@@ -110,7 +110,7 @@ void Path2D::_notification(int p_what) {
real_t frac = j / 8.0;
Vector2 p = curve->interpolate(i, frac);
- draw_line(prev_p, p, color, line_width);
+ draw_line(prev_p, p, color, line_width, true);
prev_p = p;
}
}
diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp
index 49da709a47..9b6020e0fd 100644
--- a/scene/2d/physics_body_2d.cpp
+++ b/scene/2d/physics_body_2d.cpp
@@ -594,7 +594,7 @@ real_t RigidBody2D::get_mass() const {
void RigidBody2D::set_inertia(real_t p_inertia) {
- ERR_FAIL_COND(p_inertia <= 0);
+ ERR_FAIL_COND(p_inertia < 0);
Physics2DServer::get_singleton()->body_set_param(get_rid(), Physics2DServer::BODY_PARAM_INERTIA, p_inertia);
}
@@ -1266,7 +1266,7 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const
//all is a wall
on_wall = true;
} else {
- if (collision.normal.dot(p_floor_direction) >= Math::cos(p_floor_max_angle + FLOOR_ANGLE_THRESHOLD)) { //floor
+ if (Math::acos(collision.normal.dot(p_floor_direction)) <= p_floor_max_angle + FLOOR_ANGLE_THRESHOLD) { //floor
on_floor = true;
on_floor_body = collision.collider_rid;
@@ -1281,7 +1281,7 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const
}
}
- } else if (collision.normal.dot(-p_floor_direction) >= Math::cos(p_floor_max_angle + FLOOR_ANGLE_THRESHOLD)) { //ceiling
+ } else if (Math::acos(collision.normal.dot(-p_floor_direction)) <= p_floor_max_angle + FLOOR_ANGLE_THRESHOLD) { //ceiling
on_ceiling = true;
} else {
on_wall = true;
@@ -1446,6 +1446,14 @@ void KinematicBody2D::_direct_state_changed(Object *p_state) {
void KinematicBody2D::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE) {
last_valid_transform = get_global_transform();
+
+ // Reset move_and_slide() data.
+ on_floor = false;
+ on_floor_body = RID();
+ on_ceiling = false;
+ on_wall = false;
+ colliders.clear();
+ floor_velocity = Vector2();
}
if (p_what == NOTIFICATION_LOCAL_TRANSFORM_CHANGED) {
diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp
index 2cd05b5c50..15423f8c5e 100644
--- a/scene/2d/tile_map.cpp
+++ b/scene/2d/tile_map.cpp
@@ -1944,6 +1944,7 @@ TileMap::TileMap() {
quadrant_order_dirty = false;
quadrant_size = 16;
cell_size = Size2(64, 64);
+ custom_transform = Transform2D(64, 0, 0, 64, 0, 0);
collision_layer = 1;
collision_mask = 1;
friction = 1;
diff --git a/scene/3d/camera.h b/scene/3d/camera.h
index 6460f17e85..22223880c1 100644
--- a/scene/3d/camera.h
+++ b/scene/3d/camera.h
@@ -35,9 +35,7 @@
#include "scene/3d/spatial_velocity_tracker.h"
#include "scene/main/viewport.h"
#include "scene/resources/environment.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class Camera : public Spatial {
GDCLASS(Camera, Spatial);
diff --git a/scene/3d/collision_object.cpp b/scene/3d/collision_object.cpp
index 63301fc226..735b393171 100644
--- a/scene/3d/collision_object.cpp
+++ b/scene/3d/collision_object.cpp
@@ -105,7 +105,8 @@ void CollisionObject::_mouse_exit() {
void CollisionObject::_update_pickable() {
if (!is_inside_tree())
return;
- bool pickable = ray_pickable && is_inside_tree() && is_visible_in_tree();
+
+ bool pickable = ray_pickable && is_visible_in_tree();
if (area)
PhysicsServer::get_singleton()->area_set_ray_pickable(rid, pickable);
else
diff --git a/scene/3d/collision_polygon.cpp b/scene/3d/collision_polygon.cpp
index db07059b32..37aa95fb43 100644
--- a/scene/3d/collision_polygon.cpp
+++ b/scene/3d/collision_polygon.cpp
@@ -151,6 +151,8 @@ float CollisionPolygon::get_depth() const {
void CollisionPolygon::set_disabled(bool p_disabled) {
disabled = p_disabled;
+ update_gizmo();
+
if (parent) {
parent->shape_owner_set_disabled(owner_id, p_disabled);
}
diff --git a/scene/3d/cpu_particles.h b/scene/3d/cpu_particles.h
index 71de56f59e..66b37f359a 100644
--- a/scene/3d/cpu_particles.h
+++ b/scene/3d/cpu_particles.h
@@ -34,10 +34,6 @@
#include "core/rid.h"
#include "scene/3d/visual_instance.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class CPUParticles : public GeometryInstance {
private:
GDCLASS(CPUParticles, GeometryInstance);
diff --git a/scene/3d/light.h b/scene/3d/light.h
index 5d365758b5..cc8675ead1 100644
--- a/scene/3d/light.h
+++ b/scene/3d/light.h
@@ -35,10 +35,6 @@
#include "scene/resources/texture.h"
#include "servers/visual_server.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class Light : public VisualInstance {
GDCLASS(Light, VisualInstance);
diff --git a/scene/3d/mesh_instance.h b/scene/3d/mesh_instance.h
index 022ef15aad..8b690b0c21 100644
--- a/scene/3d/mesh_instance.h
+++ b/scene/3d/mesh_instance.h
@@ -34,9 +34,6 @@
#include "scene/3d/visual_instance.h"
#include "scene/resources/mesh.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class MeshInstance : public GeometryInstance {
GDCLASS(MeshInstance, GeometryInstance);
diff --git a/scene/3d/multimesh_instance.h b/scene/3d/multimesh_instance.h
index 8f41aa8fd2..ca69c73251 100644
--- a/scene/3d/multimesh_instance.h
+++ b/scene/3d/multimesh_instance.h
@@ -34,10 +34,6 @@
#include "scene/3d/visual_instance.h"
#include "scene/resources/multimesh.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class MultiMeshInstance : public GeometryInstance {
GDCLASS(MultiMeshInstance, GeometryInstance);
diff --git a/scene/3d/particles.h b/scene/3d/particles.h
index 42c68010db..391491e8b8 100644
--- a/scene/3d/particles.h
+++ b/scene/3d/particles.h
@@ -35,10 +35,6 @@
#include "scene/3d/visual_instance.h"
#include "scene/resources/material.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class Particles : public GeometryInstance {
private:
GDCLASS(Particles, GeometryInstance);
diff --git a/scene/3d/physics_body.cpp b/scene/3d/physics_body.cpp
index 19d5f1dd3c..0756be5fc8 100644
--- a/scene/3d/physics_body.cpp
+++ b/scene/3d/physics_body.cpp
@@ -1192,7 +1192,7 @@ Vector3 KinematicBody::move_and_slide(const Vector3 &p_linear_velocity, const Ve
//all is a wall
on_wall = true;
} else {
- if (collision.normal.dot(p_floor_direction) >= Math::cos(p_floor_max_angle + FLOOR_ANGLE_THRESHOLD)) { //floor
+ if (Math::acos(collision.normal.dot(p_floor_direction)) <= p_floor_max_angle + FLOOR_ANGLE_THRESHOLD) { //floor
on_floor = true;
on_floor_body = collision.collider_rid;
@@ -1209,7 +1209,7 @@ Vector3 KinematicBody::move_and_slide(const Vector3 &p_linear_velocity, const Ve
is_on_slope = true;
- } else if (collision.normal.dot(-p_floor_direction) >= Math::cos(p_floor_max_angle + FLOOR_ANGLE_THRESHOLD)) { //ceiling
+ } else if (Math::acos(collision.normal.dot(-p_floor_direction)) <= p_floor_max_angle + FLOOR_ANGLE_THRESHOLD) { //ceiling
on_ceiling = true;
} else {
on_wall = true;
@@ -1387,6 +1387,18 @@ Ref<KinematicCollision> KinematicBody::_get_slide_collision(int p_bounce) {
return slide_colliders[p_bounce];
}
+void KinematicBody::_notification(int p_what) {
+ if (p_what == NOTIFICATION_ENTER_TREE) {
+ // Reset move_and_slide() data.
+ on_floor = false;
+ on_floor_body = RID();
+ on_ceiling = false;
+ on_wall = false;
+ colliders.clear();
+ floor_velocity = Vector3();
+ }
+}
+
void KinematicBody::_bind_methods() {
ClassDB::bind_method(D_METHOD("move_and_collide", "rel_vec", "infinite_inertia", "exclude_raycast_shapes", "test_only"), &KinematicBody::_move, DEFVAL(true), DEFVAL(true), DEFVAL(false));
diff --git a/scene/3d/physics_body.h b/scene/3d/physics_body.h
index aa6030d44e..0967cb9cd5 100644
--- a/scene/3d/physics_body.h
+++ b/scene/3d/physics_body.h
@@ -162,6 +162,7 @@ protected:
ShapePair(int p_bs, int p_ls) {
body_shape = p_bs;
local_shape = p_ls;
+ tagged = false;
}
};
struct RigidBody_RemoveAction {
@@ -314,6 +315,7 @@ private:
Ref<KinematicCollision> _get_slide_collision(int p_bounce);
protected:
+ void _notification(int p_what);
static void _bind_methods();
public:
diff --git a/scene/3d/portal.h b/scene/3d/portal.h
index f053867917..04af3a750c 100644
--- a/scene/3d/portal.h
+++ b/scene/3d/portal.h
@@ -32,9 +32,6 @@
#define PORTAL_H
#include "scene/3d/visual_instance.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
/* Portal Logic:
If a portal is placed next (very close to) a similar, opposing portal, they automatically connect,
diff --git a/scene/3d/ray_cast.cpp b/scene/3d/ray_cast.cpp
index 10f92058e0..30eed8f1a7 100644
--- a/scene/3d/ray_cast.cpp
+++ b/scene/3d/ray_cast.cpp
@@ -102,6 +102,8 @@ Vector3 RayCast::get_collision_normal() const {
void RayCast::set_enabled(bool p_enabled) {
enabled = p_enabled;
+ update_gizmo();
+
if (is_inside_tree() && !Engine::get_singleton()->is_editor_hint())
set_physics_process_internal(p_enabled);
if (!p_enabled)
diff --git a/scene/3d/room_instance.h b/scene/3d/room_instance.h
index 9ee140d522..01efde53c9 100644
--- a/scene/3d/room_instance.h
+++ b/scene/3d/room_instance.h
@@ -34,10 +34,6 @@
#include "scene/3d/visual_instance.h"
#include "scene/resources/room.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
/* RoomInstance Logic:
a) Instances that belong to the room are drawn only if the room is visible (seen through portal, or player inside)
b) Instances that don't belong to any room are considered to belong to the root room (RID empty)
diff --git a/scene/3d/skeleton.h b/scene/3d/skeleton.h
index 5f43b3c6c3..5b55dffbc8 100644
--- a/scene/3d/skeleton.h
+++ b/scene/3d/skeleton.h
@@ -34,10 +34,6 @@
#include "core/rid.h"
#include "scene/3d/spatial.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
#ifndef _3D_DISABLED
typedef int BoneId;
diff --git a/scene/3d/spatial.h b/scene/3d/spatial.h
index 18a4a5b54d..eea2696767 100644
--- a/scene/3d/spatial.h
+++ b/scene/3d/spatial.h
@@ -34,10 +34,6 @@
#include "scene/main/node.h"
#include "scene/main/scene_tree.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class SpatialGizmo : public Reference {
GDCLASS(SpatialGizmo, Reference);
diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp
index fc5523633d..a9dacc442c 100644
--- a/scene/3d/sprite_3d.cpp
+++ b/scene/3d/sprite_3d.cpp
@@ -286,6 +286,18 @@ SpriteBase3D::AlphaCutMode SpriteBase3D::get_alpha_cut_mode() const {
return alpha_cut;
}
+void SpriteBase3D::set_billboard_mode(SpatialMaterial::BillboardMode p_mode) {
+
+ ERR_FAIL_INDEX(p_mode, 3);
+ billboard_mode = p_mode;
+ _queue_update();
+}
+
+SpatialMaterial::BillboardMode SpriteBase3D::get_billboard_mode() const {
+
+ return billboard_mode;
+}
+
void SpriteBase3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_centered", "centered"), &SpriteBase3D::set_centered);
@@ -318,6 +330,9 @@ void SpriteBase3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_alpha_cut_mode", "mode"), &SpriteBase3D::set_alpha_cut_mode);
ClassDB::bind_method(D_METHOD("get_alpha_cut_mode"), &SpriteBase3D::get_alpha_cut_mode);
+ ClassDB::bind_method(D_METHOD("set_billboard_mode", "mode"), &SpriteBase3D::set_billboard_mode);
+ ClassDB::bind_method(D_METHOD("get_billboard_mode"), &SpriteBase3D::get_billboard_mode);
+
ClassDB::bind_method(D_METHOD("get_item_rect"), &SpriteBase3D::get_item_rect);
ClassDB::bind_method(D_METHOD("generate_triangle_mesh"), &SpriteBase3D::generate_triangle_mesh);
@@ -333,6 +348,7 @@ void SpriteBase3D::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::REAL, "pixel_size", PROPERTY_HINT_RANGE, "0.0001,128,0.0001"), "set_pixel_size", "get_pixel_size");
ADD_PROPERTY(PropertyInfo(Variant::INT, "axis", PROPERTY_HINT_ENUM, "X-Axis,Y-Axis,Z-Axis"), "set_axis", "get_axis");
ADD_GROUP("Flags", "");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "billboard", PROPERTY_HINT_ENUM, "Disabled,Enabled,Y-Billboard"), "set_billboard_mode", "get_billboard_mode");
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "transparent"), "set_draw_flag", "get_draw_flag", FLAG_TRANSPARENT);
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "shaded"), "set_draw_flag", "get_draw_flag", FLAG_SHADED);
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "double_sided"), "set_draw_flag", "get_draw_flag", FLAG_DOUBLE_SIDED);
@@ -361,6 +377,7 @@ SpriteBase3D::SpriteBase3D() {
flags[i] = i == FLAG_TRANSPARENT || i == FLAG_DOUBLE_SIDED;
alpha_cut = ALPHA_CUT_DISABLED;
+ billboard_mode = SpatialMaterial::BILLBOARD_DISABLED;
axis = Vector3::AXIS_Z;
pixel_size = 0.01;
modulate = Color(1, 1, 1, 1);
@@ -463,7 +480,7 @@ void Sprite3D::_draw() {
tangent = Plane(1, 0, 0, 1);
}
- RID mat = SpatialMaterial::get_material_rid_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS);
+ RID mat = SpatialMaterial::get_material_rid_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS, get_billboard_mode() == SpatialMaterial::BILLBOARD_ENABLED, get_billboard_mode() == SpatialMaterial::BILLBOARD_FIXED_Y);
VS::get_singleton()->immediate_set_material(immediate, mat);
VS::get_singleton()->immediate_begin(immediate, VS::PRIMITIVE_TRIANGLE_FAN, texture->get_rid());
@@ -788,7 +805,7 @@ void AnimatedSprite3D::_draw() {
tangent = Plane(1, 0, 0, -1);
}
- RID mat = SpatialMaterial::get_material_rid_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS);
+ RID mat = SpatialMaterial::get_material_rid_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS, get_billboard_mode() == SpatialMaterial::BILLBOARD_ENABLED, get_billboard_mode() == SpatialMaterial::BILLBOARD_FIXED_Y);
VS::get_singleton()->immediate_set_material(immediate, mat);
diff --git a/scene/3d/sprite_3d.h b/scene/3d/sprite_3d.h
index 97a426b5b9..065931de84 100644
--- a/scene/3d/sprite_3d.h
+++ b/scene/3d/sprite_3d.h
@@ -80,6 +80,7 @@ private:
bool flags[FLAG_MAX];
AlphaCutMode alpha_cut;
+ SpatialMaterial::BillboardMode billboard_mode;
bool pending_update;
void _im_update();
@@ -130,6 +131,8 @@ public:
void set_alpha_cut_mode(AlphaCutMode p_mode);
AlphaCutMode get_alpha_cut_mode() const;
+ void set_billboard_mode(SpatialMaterial::BillboardMode p_mode);
+ SpatialMaterial::BillboardMode get_billboard_mode() const;
virtual Rect2 get_item_rect() const = 0;
diff --git a/scene/3d/visual_instance.h b/scene/3d/visual_instance.h
index 3b924e0454..63d15680aa 100644
--- a/scene/3d/visual_instance.h
+++ b/scene/3d/visual_instance.h
@@ -35,9 +35,7 @@
#include "core/rid.h"
#include "scene/3d/spatial.h"
#include "scene/resources/material.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class VisualInstance : public Spatial {
GDCLASS(VisualInstance, Spatial);
diff --git a/scene/3d/world_environment.h b/scene/3d/world_environment.h
index bf36a0a532..656e16371f 100644
--- a/scene/3d/world_environment.h
+++ b/scene/3d/world_environment.h
@@ -33,10 +33,6 @@
#include "scene/3d/spatial.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class WorldEnvironment : public Node {
GDCLASS(WorldEnvironment, Node);
diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp
index 30aeebfdac..051f832882 100644
--- a/scene/animation/animation_player.cpp
+++ b/scene/animation/animation_player.cpp
@@ -1200,7 +1200,9 @@ void AnimationPlayer::play(const StringName &p_name, float p_custom_blend, float
}
}
- _stop_playing_caches();
+ if (get_current_animation() != p_name) {
+ _stop_playing_caches();
+ }
c.current.from = &animation_set[name];
diff --git a/scene/animation/animation_player.h b/scene/animation/animation_player.h
index f3d38110c6..320fd2084c 100644
--- a/scene/animation/animation_player.h
+++ b/scene/animation/animation_player.h
@@ -35,9 +35,6 @@
#include "scene/3d/skeleton.h"
#include "scene/3d/spatial.h"
#include "scene/resources/animation.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
#ifdef TOOLS_ENABLED
// To save/restore animated values
diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp
index 6745b57cff..bb7c400cfe 100644
--- a/scene/animation/animation_tree.cpp
+++ b/scene/animation/animation_tree.cpp
@@ -1412,6 +1412,7 @@ void AnimationTree::_update_properties_for_node(const String &p_base_path, Ref<A
Vector<Activity> activity;
for (int i = 0; i < node->get_input_count(); i++) {
Activity a;
+ a.activity = 0;
a.last_pass = 0;
activity.push_back(a);
}
diff --git a/scene/gui/base_button.h b/scene/gui/base_button.h
index ffccdd69d6..2773f024df 100644
--- a/scene/gui/base_button.h
+++ b/scene/gui/base_button.h
@@ -32,9 +32,6 @@
#define BASE_BUTTON_H
#include "scene/gui/control.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class ButtonGroup;
diff --git a/scene/gui/button.cpp b/scene/gui/button.cpp
index 65e9cccd05..6b3e89af6c 100644
--- a/scene/gui/button.cpp
+++ b/scene/gui/button.cpp
@@ -39,158 +39,191 @@ Size2 Button::get_minimum_size() const {
if (clip_text)
minsize.width = 0;
- Ref<Texture> _icon;
- if (icon.is_null() && has_icon("icon"))
- _icon = Control::get_icon("icon");
- else
- _icon = icon;
-
- if (!_icon.is_null()) {
-
- minsize.height = MAX(minsize.height, _icon->get_height());
- minsize.width += _icon->get_width();
- if (xl_text != "")
- minsize.width += get_constant("hseparation");
+ if (!expand_icon) {
+ Ref<Texture> _icon;
+ if (icon.is_null() && has_icon("icon"))
+ _icon = Control::get_icon("icon");
+ else
+ _icon = icon;
+
+ if (!_icon.is_null()) {
+
+ minsize.height = MAX(minsize.height, _icon->get_height());
+ minsize.width += _icon->get_width();
+ if (xl_text != "")
+ minsize.width += get_constant("hseparation");
+ }
}
return get_stylebox("normal")->get_minimum_size() + minsize;
}
void Button::_set_internal_margin(Margin p_margin, float p_value) {
+
_internal_margin[p_margin] = p_value;
}
void Button::_notification(int p_what) {
- if (p_what == NOTIFICATION_TRANSLATION_CHANGED) {
+ switch (p_what) {
+ case NOTIFICATION_TRANSLATION_CHANGED: {
- xl_text = tr(text);
- minimum_size_changed();
- update();
- }
+ xl_text = tr(text);
+ minimum_size_changed();
+ update();
+ } break;
+ case NOTIFICATION_DRAW: {
- if (p_what == NOTIFICATION_DRAW) {
+ RID ci = get_canvas_item();
+ Size2 size = get_size();
+ Color color;
+ Color color_icon(1, 1, 1, 1);
- RID ci = get_canvas_item();
- Size2 size = get_size();
- Color color;
- Color color_icon(1, 1, 1, 1);
+ Ref<StyleBox> style = get_stylebox("normal");
- Ref<StyleBox> style = get_stylebox("normal");
+ switch (get_draw_mode()) {
+ case DRAW_NORMAL: {
- switch (get_draw_mode()) {
-
- case DRAW_NORMAL: {
+ style = get_stylebox("normal");
+ if (!flat)
+ style->draw(ci, Rect2(Point2(0, 0), size));
+ color = get_color("font_color");
+ if (has_color("icon_color_normal"))
+ color_icon = get_color("icon_color_normal");
+ } break;
+ case DRAW_HOVER_PRESSED: {
+
+ if (has_stylebox("hover_pressed") && has_stylebox_override("hover_pressed")) {
+ style = get_stylebox("hover_pressed");
+ if (!flat)
+ style->draw(ci, Rect2(Point2(0, 0), size));
+ if (has_color("font_color_hover_pressed"))
+ color = get_color("font_color_hover_pressed");
+ else
+ color = get_color("font_color");
+ if (has_color("icon_color_hover_pressed"))
+ color_icon = get_color("icon_color_hover_pressed");
+
+ break;
+ }
+ FALLTHROUGH;
+ }
+ case DRAW_PRESSED: {
- style = get_stylebox("normal");
- if (!flat)
- style->draw(ci, Rect2(Point2(0, 0), size));
- color = get_color("font_color");
- if (has_color("icon_color_normal"))
- color_icon = get_color("icon_color_normal");
- } break;
- case DRAW_HOVER_PRESSED: {
- if (has_stylebox("hover_pressed") && has_stylebox_override("hover_pressed")) {
- style = get_stylebox("hover_pressed");
+ style = get_stylebox("pressed");
if (!flat)
style->draw(ci, Rect2(Point2(0, 0), size));
- if (has_color("font_color_hover_pressed"))
- color = get_color("font_color_hover_pressed");
+ if (has_color("font_color_pressed"))
+ color = get_color("font_color_pressed");
else
color = get_color("font_color");
- if (has_color("icon_color_hover_pressed"))
- color_icon = get_color("icon_color_hover_pressed");
+ if (has_color("icon_color_pressed"))
+ color_icon = get_color("icon_color_pressed");
- break;
- }
- FALLTHROUGH;
+ } break;
+ case DRAW_HOVER: {
+
+ style = get_stylebox("hover");
+ if (!flat)
+ style->draw(ci, Rect2(Point2(0, 0), size));
+ color = get_color("font_color_hover");
+ if (has_color("icon_color_hover"))
+ color_icon = get_color("icon_color_hover");
+
+ } break;
+ case DRAW_DISABLED: {
+
+ style = get_stylebox("disabled");
+ if (!flat)
+ style->draw(ci, Rect2(Point2(0, 0), size));
+ color = get_color("font_color_disabled");
+ if (has_color("icon_color_disabled"))
+ color_icon = get_color("icon_color_disabled");
+
+ } break;
}
- case DRAW_PRESSED: {
-
- style = get_stylebox("pressed");
- if (!flat)
- style->draw(ci, Rect2(Point2(0, 0), size));
- if (has_color("font_color_pressed"))
- color = get_color("font_color_pressed");
- else
- color = get_color("font_color");
- if (has_color("icon_color_pressed"))
- color_icon = get_color("icon_color_pressed");
-
- } break;
- case DRAW_HOVER: {
-
- style = get_stylebox("hover");
- if (!flat)
- style->draw(ci, Rect2(Point2(0, 0), size));
- color = get_color("font_color_hover");
- if (has_color("icon_color_hover"))
- color_icon = get_color("icon_color_hover");
-
- } break;
- case DRAW_DISABLED: {
-
- style = get_stylebox("disabled");
- if (!flat)
- style->draw(ci, Rect2(Point2(0, 0), size));
- color = get_color("font_color_disabled");
- if (has_color("icon_color_disabled"))
- color_icon = get_color("icon_color_disabled");
-
- } break;
- }
- if (has_focus()) {
+ if (has_focus()) {
- Ref<StyleBox> style2 = get_stylebox("focus");
- style2->draw(ci, Rect2(Point2(), size));
- }
+ Ref<StyleBox> style2 = get_stylebox("focus");
+ style2->draw(ci, Rect2(Point2(), size));
+ }
- Ref<Font> font = get_font("font");
- Ref<Texture> _icon;
- if (icon.is_null() && has_icon("icon"))
- _icon = Control::get_icon("icon");
- else
- _icon = icon;
+ Ref<Font> font = get_font("font");
+ Ref<Texture> _icon;
+ if (icon.is_null() && has_icon("icon"))
+ _icon = Control::get_icon("icon");
+ else
+ _icon = icon;
+
+ Rect2 icon_region = Rect2();
+ if (!_icon.is_null()) {
- Point2 icon_ofs = (!_icon.is_null()) ? Point2(_icon->get_width() + get_constant("hseparation"), 0) : Point2();
- int text_clip = size.width - style->get_minimum_size().width - icon_ofs.width;
- Point2 text_ofs = (size - style->get_minimum_size() - icon_ofs - font->get_string_size(xl_text) - Point2(_internal_margin[MARGIN_RIGHT] - _internal_margin[MARGIN_LEFT], 0)) / 2.0;
-
- switch (align) {
- case ALIGN_LEFT: {
- text_ofs.x = style->get_margin(MARGIN_LEFT) + icon_ofs.x + _internal_margin[MARGIN_LEFT] + get_constant("hseparation");
- text_ofs.y += style->get_offset().y;
- } break;
- case ALIGN_CENTER: {
- if (text_ofs.x < 0)
- text_ofs.x = 0;
- text_ofs += icon_ofs;
- text_ofs += style->get_offset();
- } break;
- case ALIGN_RIGHT: {
- if (_internal_margin[MARGIN_RIGHT] > 0) {
- text_ofs.x = size.x - style->get_margin(MARGIN_RIGHT) - font->get_string_size(xl_text).x - _internal_margin[MARGIN_RIGHT] - get_constant("hseparation");
+ int valign = size.height - style->get_minimum_size().y;
+ if (is_disabled()) {
+ color_icon.a = 0.4;
+ }
+
+ float icon_ofs_region = 0;
+ if (_internal_margin[MARGIN_LEFT] > 0) {
+ icon_ofs_region = _internal_margin[MARGIN_LEFT] + get_constant("hseparation");
+ }
+
+ if (expand_icon) {
+ Size2 _size = get_size() - style->get_offset() * 2;
+ _size.width -= get_constant("hseparation") + icon_ofs_region;
+ if (!clip_text)
+ _size.width -= get_font("font")->get_string_size(xl_text).width;
+ float icon_width = icon->get_width() * _size.height / icon->get_height();
+ float icon_height = _size.height;
+
+ if (icon_width > _size.width) {
+ icon_width = _size.width;
+ icon_height = icon->get_height() * icon_width / icon->get_width();
+ }
+
+ icon_region = Rect2(style->get_offset() + Point2(icon_ofs_region, (_size.height - icon_height) / 2), Size2(icon_width, icon_height));
} else {
- text_ofs.x = size.x - style->get_margin(MARGIN_RIGHT) - font->get_string_size(xl_text).x;
+ icon_region = Rect2(style->get_offset() + Point2(icon_ofs_region, Math::floor((valign - _icon->get_height()) / 2.0)), icon->get_size());
}
- text_ofs.y += style->get_offset().y;
- } break;
- }
+ }
- text_ofs.y += font->get_ascent();
- font->draw(ci, text_ofs.floor(), xl_text, color, clip_text ? text_clip : -1);
- if (!_icon.is_null()) {
+ Point2 icon_ofs = !_icon.is_null() ? Point2(icon_region.size.width + get_constant("hseparation"), 0) : Point2();
+ int text_clip = size.width - style->get_minimum_size().width - icon_ofs.width;
+ Point2 text_ofs = (size - style->get_minimum_size() - icon_ofs - font->get_string_size(xl_text) - Point2(_internal_margin[MARGIN_RIGHT] - _internal_margin[MARGIN_LEFT], 0)) / 2.0;
+
+ switch (align) {
+ case ALIGN_LEFT: {
+ if (_internal_margin[MARGIN_LEFT] > 0) {
+ text_ofs.x = style->get_margin(MARGIN_LEFT) + icon_ofs.x + _internal_margin[MARGIN_LEFT] + get_constant("hseparation");
+ } else {
+ text_ofs.x = style->get_margin(MARGIN_LEFT) + icon_ofs.x;
+ }
+ text_ofs.y += style->get_offset().y;
+ } break;
+ case ALIGN_CENTER: {
+ if (text_ofs.x < 0)
+ text_ofs.x = 0;
+ text_ofs += icon_ofs;
+ text_ofs += style->get_offset();
+ } break;
+ case ALIGN_RIGHT: {
+ if (_internal_margin[MARGIN_RIGHT] > 0) {
+ text_ofs.x = size.x - style->get_margin(MARGIN_RIGHT) - font->get_string_size(xl_text).x - _internal_margin[MARGIN_RIGHT] - get_constant("hseparation");
+ } else {
+ text_ofs.x = size.x - style->get_margin(MARGIN_RIGHT) - font->get_string_size(xl_text).x;
+ }
+ text_ofs.y += style->get_offset().y;
+ } break;
+ }
+
+ text_ofs.y += font->get_ascent();
+ font->draw(ci, text_ofs.floor(), xl_text, color, clip_text ? text_clip : -1);
- int valign = size.height - style->get_minimum_size().y;
- if (is_disabled())
- color_icon.a = 0.4;
- if (_internal_margin[MARGIN_LEFT] > 0) {
- _icon->draw(ci, style->get_offset() + Point2(_internal_margin[MARGIN_LEFT] + get_constant("hseparation"), Math::floor((valign - _icon->get_height()) / 2.0)), color_icon);
- } else {
- _icon->draw(ci, style->get_offset() + Point2(0, Math::floor((valign - _icon->get_height()) / 2.0)), color_icon);
+ if (!_icon.is_null() && icon_region.size.width > 0) {
+ draw_texture_rect_region(_icon, icon_region, Rect2(Point2(), icon->get_size()), color_icon);
}
- }
+ } break;
}
}
@@ -224,6 +257,18 @@ Ref<Texture> Button::get_icon() const {
return icon;
}
+void Button::set_expand_icon(bool p_expand_icon) {
+
+ expand_icon = p_expand_icon;
+ update();
+ minimum_size_changed();
+}
+
+bool Button::is_expand_icon() const {
+
+ return expand_icon;
+}
+
void Button::set_flat(bool p_flat) {
flat = p_flat;
@@ -265,6 +310,8 @@ void Button::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_text"), &Button::get_text);
ClassDB::bind_method(D_METHOD("set_button_icon", "texture"), &Button::set_icon);
ClassDB::bind_method(D_METHOD("get_button_icon"), &Button::get_icon);
+ ClassDB::bind_method(D_METHOD("set_expand_icon"), &Button::set_expand_icon);
+ ClassDB::bind_method(D_METHOD("is_expand_icon"), &Button::is_expand_icon);
ClassDB::bind_method(D_METHOD("set_flat", "enabled"), &Button::set_flat);
ClassDB::bind_method(D_METHOD("set_clip_text", "enabled"), &Button::set_clip_text);
ClassDB::bind_method(D_METHOD("get_clip_text"), &Button::get_clip_text);
@@ -281,12 +328,14 @@ void Button::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flat"), "set_flat", "is_flat");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clip_text"), "set_clip_text", "get_clip_text");
ADD_PROPERTY(PropertyInfo(Variant::INT, "align", PROPERTY_HINT_ENUM, "Left,Center,Right"), "set_text_align", "get_text_align");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "expand_icon"), "set_expand_icon", "is_expand_icon");
}
Button::Button(const String &p_text) {
flat = false;
clip_text = false;
+ expand_icon = false;
set_mouse_filter(MOUSE_FILTER_STOP);
set_text(p_text);
align = ALIGN_CENTER;
diff --git a/scene/gui/button.h b/scene/gui/button.h
index 6ba3475e5a..1fff2cfda7 100644
--- a/scene/gui/button.h
+++ b/scene/gui/button.h
@@ -32,9 +32,6 @@
#define BUTTON_H
#include "scene/gui/base_button.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class Button : public BaseButton {
@@ -52,6 +49,7 @@ private:
String text;
String xl_text;
Ref<Texture> icon;
+ bool expand_icon;
bool clip_text;
TextAlign align;
float _internal_margin[4];
@@ -62,8 +60,6 @@ protected:
static void _bind_methods();
public:
- //
-
virtual Size2 get_minimum_size() const;
void set_text(const String &p_text);
@@ -72,6 +68,9 @@ public:
void set_icon(const Ref<Texture> &p_icon);
Ref<Texture> get_icon() const;
+ void set_expand_icon(bool p_expand_icon);
+ bool is_expand_icon() const;
+
void set_flat(bool p_flat);
bool is_flat() const;
diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp
index b197971b61..6dd9e401f6 100644
--- a/scene/gui/color_picker.cpp
+++ b/scene/gui/color_picker.cpp
@@ -247,15 +247,19 @@ void ColorPicker::_update_color(bool p_update_sliders) {
}
void ColorPicker::_update_presets() {
+ presets_per_row = 10;
Size2 size = bt_add_preset->get_size();
- Size2 preset_size = Size2(size.width * presets.size(), size.height);
+ Size2 preset_size = Size2(MIN(size.width * presets.size(), presets_per_row * size.width), size.height * (Math::ceil((float)presets.size() / presets_per_row)));
preset->set_custom_minimum_size(preset_size);
-
- preset->draw_texture_rect(get_icon("preset_bg", "ColorPicker"), Rect2(Point2(), preset_size), true);
+ preset_container->set_custom_minimum_size(preset_size);
+ preset->draw_rect(Rect2(Point2(), preset_size), Color(1, 1, 1, 0));
for (int i = 0; i < presets.size(); i++) {
- preset->draw_rect(Rect2(Point2(size.width * i, 0), size), presets[i]);
+ int x = (i % presets_per_row) * size.width;
+ int y = (Math::floor((float)i / presets_per_row)) * size.height;
+ preset->draw_rect(Rect2(Point2(x, y), size), presets[i]);
}
+ _notification(NOTIFICATION_VISIBILITY_CHANGED);
}
void ColorPicker::_text_type_toggled() {
@@ -288,8 +292,6 @@ void ColorPicker::add_preset(const Color &p_color) {
presets.push_back(p_color);
}
preset->update();
- if (presets.size() == 10)
- bt_add_preset->hide();
#ifdef TOOLS_ENABLED
if (Engine::get_singleton()->is_editor_hint()) {
@@ -533,14 +535,20 @@ void ColorPicker::_preset_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> bev = p_event;
if (bev.is_valid()) {
-
+ int index = 0;
if (bev->is_pressed() && bev->get_button_index() == BUTTON_LEFT) {
- int index = bev->get_position().x / (preset->get_size().x / presets.size());
+ for (int i = 0; i < presets.size(); i++) {
+ int x = (i % presets_per_row) * bt_add_preset->get_size().x;
+ int y = (Math::floor((float)i / presets_per_row)) * bt_add_preset->get_size().y;
+ if (bev->get_position().x > x && bev->get_position().x < x + preset->get_size().x && bev->get_position().y > y && bev->get_position().y < y + preset->get_size().y) {
+ index = i;
+ }
+ }
set_pick_color(presets[index]);
_update_color();
emit_signal("color_changed", color);
} else if (bev->is_pressed() && bev->get_button_index() == BUTTON_RIGHT && presets_enabled) {
- int index = bev->get_position().x / (preset->get_size().x / presets.size());
+ index = bev->get_position().x / (preset->get_size().x / presets.size());
Color clicked_preset = presets[index];
erase_preset(clicked_preset);
emit_signal("preset_removed", clicked_preset);
@@ -841,6 +849,7 @@ ColorPicker::ColorPicker() :
add_child(preset_separator);
preset_container = memnew(HBoxContainer);
+ preset_container->set_h_size_flags(SIZE_EXPAND_FILL);
add_child(preset_container);
preset = memnew(TextureRect);
@@ -848,8 +857,11 @@ ColorPicker::ColorPicker() :
preset->connect("gui_input", this, "_preset_input");
preset->connect("draw", this, "_update_presets");
+ preset_container2 = memnew(HBoxContainer);
+ preset_container2->set_h_size_flags(SIZE_EXPAND_FILL);
+ add_child(preset_container2);
bt_add_preset = memnew(Button);
- preset_container->add_child(bt_add_preset);
+ preset_container2->add_child(bt_add_preset);
bt_add_preset->set_tooltip(TTR("Add current color as a preset."));
bt_add_preset->connect("pressed", this, "_add_preset_pressed");
}
@@ -952,6 +964,7 @@ void ColorPickerButton::_update_picker() {
popup->connect("popup_hide", this, "set_pressed", varray(false));
picker->set_pick_color(color);
picker->set_edit_alpha(edit_alpha);
+ emit_signal("picker_created");
}
}
@@ -968,6 +981,7 @@ void ColorPickerButton::_bind_methods() {
ADD_SIGNAL(MethodInfo("color_changed", PropertyInfo(Variant::COLOR, "color")));
ADD_SIGNAL(MethodInfo("popup_closed"));
+ ADD_SIGNAL(MethodInfo("picker_created"));
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "color"), "set_pick_color", "get_pick_color");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "edit_alpha"), "set_edit_alpha", "is_editing_alpha");
}
diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h
index 3af27a9856..167f7b33b3 100644
--- a/scene/gui/color_picker.h
+++ b/scene/gui/color_picker.h
@@ -54,6 +54,7 @@ private:
TextureRect *sample;
TextureRect *preset;
HBoxContainer *preset_container;
+ HBoxContainer *preset_container2;
HSeparator *preset_separator;
Button *bt_add_preset;
List<Color> presets;
@@ -68,6 +69,7 @@ private:
bool edit_alpha;
Size2i ms;
bool text_is_constructor;
+ int presets_per_row;
Color color;
bool raw_mode_enabled;
diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp
index 9b9fc863dd..034e9266f6 100644
--- a/scene/gui/control.cpp
+++ b/scene/gui/control.cpp
@@ -2918,17 +2918,21 @@ void Control::_bind_methods() {
BIND_VMETHOD(MethodInfo("_gui_input", PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent")));
BIND_VMETHOD(MethodInfo(Variant::VECTOR2, "_get_minimum_size"));
- BIND_VMETHOD(MethodInfo(Variant::OBJECT, "get_drag_data", PropertyInfo(Variant::VECTOR2, "position")));
+
+ MethodInfo get_drag_data = MethodInfo("get_drag_data", PropertyInfo(Variant::VECTOR2, "position"));
+ get_drag_data.return_val.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
+ BIND_VMETHOD(get_drag_data);
+
BIND_VMETHOD(MethodInfo(Variant::BOOL, "can_drop_data", PropertyInfo(Variant::VECTOR2, "position"), PropertyInfo(Variant::NIL, "data")));
BIND_VMETHOD(MethodInfo("drop_data", PropertyInfo(Variant::VECTOR2, "position"), PropertyInfo(Variant::NIL, "data")));
BIND_VMETHOD(MethodInfo(Variant::OBJECT, "_make_custom_tooltip", PropertyInfo(Variant::STRING, "for_text")));
BIND_VMETHOD(MethodInfo(Variant::BOOL, "_clips_input"));
ADD_GROUP("Anchor", "anchor_");
- ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anchor_left", PROPERTY_HINT_RANGE, "0,1,0.01,or_lesser,or_greater"), "_set_anchor", "get_anchor", MARGIN_LEFT);
- ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anchor_top", PROPERTY_HINT_RANGE, "0,1,0.01,or_lesser,or_greater"), "_set_anchor", "get_anchor", MARGIN_TOP);
- ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anchor_right", PROPERTY_HINT_RANGE, "0,1,0.01,or_lesser,or_greater"), "_set_anchor", "get_anchor", MARGIN_RIGHT);
- ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anchor_bottom", PROPERTY_HINT_RANGE, "0,1,0.01,or_lesser,or_greater"), "_set_anchor", "get_anchor", MARGIN_BOTTOM);
+ ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anchor_left", PROPERTY_HINT_RANGE, "0,1,0.001,or_lesser,or_greater"), "_set_anchor", "get_anchor", MARGIN_LEFT);
+ ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anchor_top", PROPERTY_HINT_RANGE, "0,1,0.001,or_lesser,or_greater"), "_set_anchor", "get_anchor", MARGIN_TOP);
+ ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anchor_right", PROPERTY_HINT_RANGE, "0,1,0.001,or_lesser,or_greater"), "_set_anchor", "get_anchor", MARGIN_RIGHT);
+ ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anchor_bottom", PROPERTY_HINT_RANGE, "0,1,0.001,or_lesser,or_greater"), "_set_anchor", "get_anchor", MARGIN_BOTTOM);
ADD_GROUP("Margin", "margin_");
ADD_PROPERTYI(PropertyInfo(Variant::INT, "margin_left", PROPERTY_HINT_RANGE, "-4096,4096"), "set_margin", "get_margin", MARGIN_LEFT);
diff --git a/scene/gui/control.h b/scene/gui/control.h
index eae889a667..7305b3ce93 100644
--- a/scene/gui/control.h
+++ b/scene/gui/control.h
@@ -38,9 +38,6 @@
#include "scene/main/node.h"
#include "scene/main/timer.h"
#include "scene/resources/theme.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class Viewport;
class Label;
diff --git a/scene/gui/dialogs.h b/scene/gui/dialogs.h
index c1a7f26a85..1a0350ba18 100644
--- a/scene/gui/dialogs.h
+++ b/scene/gui/dialogs.h
@@ -37,9 +37,6 @@
#include "scene/gui/panel.h"
#include "scene/gui/popup.h"
#include "scene/gui/texture_button.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class WindowDialog : public Popup {
diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp
index f1bdbb5ff5..9bc593ea3b 100644
--- a/scene/gui/file_dialog.cpp
+++ b/scene/gui/file_dialog.cpp
@@ -400,6 +400,7 @@ void FileDialog::update_file_list() {
TreeItem *root = tree->create_item();
Ref<Texture> folder = get_icon("folder");
+ const Color folder_color = get_color("folder_icon_modulate");
List<String> files;
List<String> dirs;
@@ -429,6 +430,7 @@ void FileDialog::update_file_list() {
TreeItem *ti = tree->create_item(root);
ti->set_text(0, dir_name);
ti->set_icon(0, folder);
+ ti->set_icon_modulate(0, folder_color);
Dictionary d;
d["name"] = dir_name;
diff --git a/scene/gui/file_dialog.h b/scene/gui/file_dialog.h
index 191af5fef3..4fd6d0d13c 100644
--- a/scene/gui/file_dialog.h
+++ b/scene/gui/file_dialog.h
@@ -38,9 +38,7 @@
#include "scene/gui/option_button.h"
#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class FileDialog : public ConfirmationDialog {
GDCLASS(FileDialog, ConfirmationDialog);
diff --git a/scene/gui/gradient_edit.cpp b/scene/gui/gradient_edit.cpp
index 75f5f79873..09ef6f26bf 100644
--- a/scene/gui/gradient_edit.cpp
+++ b/scene/gui/gradient_edit.cpp
@@ -241,9 +241,13 @@ void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) {
float newofs = CLAMP(x / float(total_w), 0, 1);
- //Snap to nearest point if holding shift
- if (mm->get_shift()) {
- float snap_threshold = 0.03;
+ // Snap to "round" coordinates if holding Ctrl.
+ // Be more precise if holding Shift as well
+ if (mm->get_control()) {
+ newofs = Math::stepify(newofs, mm->get_shift() ? 0.025 : 0.1);
+ } else if (mm->get_shift()) {
+ // Snap to nearest point if holding just Shift
+ const float snap_threshold = 0.03;
float smallest_ofs = snap_threshold;
bool found = false;
int nearest_point = 0;
diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp
index 38005f1322..7827c66841 100644
--- a/scene/gui/graph_edit.cpp
+++ b/scene/gui/graph_edit.cpp
@@ -276,6 +276,11 @@ void GraphEdit::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
port_grab_distance_horizontal = get_constant("port_grab_distance_horizontal");
port_grab_distance_vertical = get_constant("port_grab_distance_vertical");
+
+ zoom_minus->set_icon(get_icon("minus"));
+ zoom_reset->set_icon(get_icon("reset"));
+ zoom_plus->set_icon(get_icon("more"));
+ snap_button->set_icon(get_icon("snap"));
}
if (p_what == NOTIFICATION_READY) {
Size2 hmin = h_scroll->get_combined_minimum_size();
@@ -290,11 +295,6 @@ void GraphEdit::_notification(int p_what) {
h_scroll->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, 0);
h_scroll->set_anchor_and_margin(MARGIN_TOP, ANCHOR_END, -hmin.height);
h_scroll->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, 0);
-
- zoom_minus->set_icon(get_icon("minus"));
- zoom_reset->set_icon(get_icon("reset"));
- zoom_plus->set_icon(get_icon("more"));
- snap_button->set_icon(get_icon("snap"));
}
if (p_what == NOTIFICATION_DRAW) {
@@ -776,10 +776,16 @@ void GraphEdit::_top_layer_draw() {
_draw_cos_line(top_layer, pos, topos, col, col);
}
- if (box_selecting)
+ if (box_selecting) {
top_layer->draw_rect(
box_selecting_rect,
- get_color("accent_color", "Editor") * Color(1, 1, 1, 0.375));
+ get_color("box_selection_fill_color", "Editor"));
+
+ top_layer->draw_rect(
+ box_selecting_rect,
+ get_color("box_selection_stroke_color", "Editor"),
+ false);
+ }
}
void GraphEdit::set_selected(Node *p_child) {
diff --git a/scene/gui/graph_node.cpp b/scene/gui/graph_node.cpp
index f7bef4ed39..5b2f8812d5 100644
--- a/scene/gui/graph_node.cpp
+++ b/scene/gui/graph_node.cpp
@@ -210,6 +210,7 @@ void GraphNode::_notification(int p_what) {
int close_offset = get_constant("close_offset");
int close_h_offset = get_constant("close_h_offset");
Color close_color = get_color("close_color");
+ Color resizer_color = get_color("resizer_color");
Ref<Font> title_font = get_font("title_font");
int title_offset = get_constant("title_offset");
int title_h_offset = get_constant("title_h_offset");
@@ -274,7 +275,7 @@ void GraphNode::_notification(int p_what) {
}
if (resizable) {
- draw_texture(resizer, get_size() - resizer->get_size());
+ draw_texture(resizer, get_size() - resizer->get_size(), resizer_color);
}
} break;
diff --git a/scene/gui/label.h b/scene/gui/label.h
index 561c42ef9e..2cc55a47ef 100644
--- a/scene/gui/label.h
+++ b/scene/gui/label.h
@@ -32,9 +32,7 @@
#define LABEL_H
#include "scene/gui/control.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class Label : public Control {
GDCLASS(Label, Control);
diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp
index 60a74066a4..4a763844f8 100644
--- a/scene/gui/line_edit.cpp
+++ b/scene/gui/line_edit.cpp
@@ -1368,18 +1368,28 @@ void LineEdit::set_editable(bool p_editable) {
// Reorganize context menu.
menu->clear();
- if (editable)
+
+ if (editable) {
+ menu->add_item(RTR("Undo"), MENU_UNDO, KEY_MASK_CMD | KEY_Z);
+ menu->add_item(RTR("Redo"), MENU_REDO, KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_Z);
+ }
+
+ if (editable) {
+ menu->add_separator();
menu->add_item(RTR("Cut"), MENU_CUT, KEY_MASK_CMD | KEY_X);
+ }
+
menu->add_item(RTR("Copy"), MENU_COPY, KEY_MASK_CMD | KEY_C);
- if (editable)
+
+ if (editable) {
menu->add_item(RTR("Paste"), MENU_PASTE, KEY_MASK_CMD | KEY_V);
+ }
+
menu->add_separator();
menu->add_item(RTR("Select All"), MENU_SELECT_ALL, KEY_MASK_CMD | KEY_A);
+
if (editable) {
menu->add_item(RTR("Clear"), MENU_CLEAR);
- menu->add_separator();
- menu->add_item(RTR("Undo"), MENU_UNDO, KEY_MASK_CMD | KEY_Z);
- menu->add_item(RTR("Redo"), MENU_REDO, KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_Z);
}
update();
diff --git a/scene/gui/line_edit.h b/scene/gui/line_edit.h
index 3002f6f637..1d33f7d4ce 100644
--- a/scene/gui/line_edit.h
+++ b/scene/gui/line_edit.h
@@ -34,9 +34,6 @@
#include "scene/gui/control.h"
#include "scene/gui/popup_menu.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class LineEdit : public Control {
GDCLASS(LineEdit, Control);
diff --git a/scene/gui/menu_button.h b/scene/gui/menu_button.h
index 42e909d991..5448ff13f2 100644
--- a/scene/gui/menu_button.h
+++ b/scene/gui/menu_button.h
@@ -33,9 +33,7 @@
#include "scene/gui/button.h"
#include "scene/gui/popup_menu.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class MenuButton : public Button {
GDCLASS(MenuButton, Button);
diff --git a/scene/gui/nine_patch_rect.h b/scene/gui/nine_patch_rect.h
index ac17e52fc1..f31a09a482 100644
--- a/scene/gui/nine_patch_rect.h
+++ b/scene/gui/nine_patch_rect.h
@@ -32,9 +32,7 @@
#define NINE_PATCH_RECT_H
#include "scene/gui/control.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class NinePatchRect : public Control {
GDCLASS(NinePatchRect, Control);
diff --git a/scene/gui/option_button.h b/scene/gui/option_button.h
index 51d5fd6947..7210708042 100644
--- a/scene/gui/option_button.h
+++ b/scene/gui/option_button.h
@@ -33,9 +33,7 @@
#include "scene/gui/button.h"
#include "scene/gui/popup_menu.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class OptionButton : public Button {
GDCLASS(OptionButton, Button);
diff --git a/scene/gui/panel.h b/scene/gui/panel.h
index f8d15e4261..84bf6e75f5 100644
--- a/scene/gui/panel.h
+++ b/scene/gui/panel.h
@@ -32,9 +32,7 @@
#define PANEL_H
#include "scene/gui/control.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class Panel : public Control {
GDCLASS(Panel, Control);
diff --git a/scene/gui/popup.cpp b/scene/gui/popup.cpp
index 3e003af396..32380b6457 100644
--- a/scene/gui/popup.cpp
+++ b/scene/gui/popup.cpp
@@ -74,7 +74,7 @@ void Popup::_fix_size() {
Point2 pos = get_global_position();
Size2 size = get_size() * get_scale();
- Point2 window_size = get_viewport_rect().size;
+ Point2 window_size = get_viewport_rect().size - get_viewport_transform().get_origin();
if (pos.x + size.width > window_size.width)
pos.x = window_size.width - size.width;
@@ -207,6 +207,7 @@ bool Popup::is_exclusive() const {
void Popup::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("set_as_minsize"), &Popup::set_as_minsize);
ClassDB::bind_method(D_METHOD("popup_centered", "size"), &Popup::popup_centered, DEFVAL(Size2()));
ClassDB::bind_method(D_METHOD("popup_centered_ratio", "ratio"), &Popup::popup_centered_ratio, DEFVAL(0.75));
ClassDB::bind_method(D_METHOD("popup_centered_minsize", "minsize"), &Popup::popup_centered_minsize, DEFVAL(Size2()));
diff --git a/scene/gui/popup.h b/scene/gui/popup.h
index d6d96dfe64..925760984e 100644
--- a/scene/gui/popup.h
+++ b/scene/gui/popup.h
@@ -33,9 +33,6 @@
#include "scene/gui/control.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class Popup : public Control {
GDCLASS(Popup, Control);
diff --git a/scene/gui/popup_menu.h b/scene/gui/popup_menu.h
index babdd21281..8bfe8fc607 100644
--- a/scene/gui/popup_menu.h
+++ b/scene/gui/popup_menu.h
@@ -33,10 +33,6 @@
#include "scene/gui/popup.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class PopupMenu : public Popup {
GDCLASS(PopupMenu, Popup);
diff --git a/scene/gui/range.h b/scene/gui/range.h
index cf0add8c89..8ce450f8fc 100644
--- a/scene/gui/range.h
+++ b/scene/gui/range.h
@@ -32,9 +32,7 @@
#define RANGE_H
#include "scene/gui/control.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class Range : public Control {
GDCLASS(Range, Control);
diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp
index 8223ea6d1e..1aed858c94 100644
--- a/scene/gui/rich_text_label.cpp
+++ b/scene/gui/rich_text_label.cpp
@@ -916,9 +916,12 @@ void RichTextLabel::_find_click(ItemFrame *p_frame, const Point2i &p_click, Item
Control::CursorShape RichTextLabel::get_cursor_shape(const Point2 &p_pos) const {
- if (!underline_meta || selection.click)
+ if (!underline_meta)
return CURSOR_ARROW;
+ if (selection.click)
+ return CURSOR_IBEAM;
+
if (main->first_invalid_line < main->lines.size())
return CURSOR_ARROW; //invalid
diff --git a/scene/gui/scroll_bar.h b/scene/gui/scroll_bar.h
index 5ceabfc06b..cbcee1dae3 100644
--- a/scene/gui/scroll_bar.h
+++ b/scene/gui/scroll_bar.h
@@ -33,10 +33,6 @@
#include "scene/gui/range.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class ScrollBar : public Range {
GDCLASS(ScrollBar, Range);
diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp
index 461281a4ed..a840e3fec1 100644
--- a/scene/gui/scroll_container.cpp
+++ b/scene/gui/scroll_container.cpp
@@ -382,7 +382,10 @@ void ScrollContainer::update_scrollbars() {
Size2 min = child_max_size;
- if (!scroll_v || min.height <= size.height - hmin.height) {
+ bool hide_scroll_v = !scroll_v || min.height <= size.height - hmin.height;
+ bool hide_scroll_h = !scroll_h || min.width <= size.width - vmin.width;
+
+ if (hide_scroll_v) {
v_scroll->hide();
v_scroll->set_max(0);
@@ -391,11 +394,16 @@ void ScrollContainer::update_scrollbars() {
v_scroll->show();
v_scroll->set_max(min.height);
- v_scroll->set_page(size.height - hmin.height);
+ if (hide_scroll_h) {
+ v_scroll->set_page(size.height);
+ } else {
+ v_scroll->set_page(size.height - hmin.height);
+ }
+
scroll.y = v_scroll->get_value();
}
- if (!scroll_h || min.width <= size.width - vmin.width) {
+ if (hide_scroll_h) {
h_scroll->hide();
h_scroll->set_max(0);
@@ -404,7 +412,12 @@ void ScrollContainer::update_scrollbars() {
h_scroll->show();
h_scroll->set_max(min.width);
- h_scroll->set_page(size.width - vmin.width);
+ if (hide_scroll_v) {
+ h_scroll->set_page(size.width);
+ } else {
+ h_scroll->set_page(size.width - vmin.width);
+ }
+
scroll.x = h_scroll->get_value();
}
}
diff --git a/scene/gui/separator.h b/scene/gui/separator.h
index 54ad9b5bb5..89039f3112 100644
--- a/scene/gui/separator.h
+++ b/scene/gui/separator.h
@@ -31,10 +31,6 @@
#ifndef SEPARATOR_H
#define SEPARATOR_H
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
#include "scene/gui/control.h"
class Separator : public Control {
diff --git a/scene/gui/spin_box.cpp b/scene/gui/spin_box.cpp
index 6ada0cba97..172c366c41 100644
--- a/scene/gui/spin_box.cpp
+++ b/scene/gui/spin_box.cpp
@@ -29,6 +29,7 @@
/*************************************************************************/
#include "spin_box.h"
+#include "core/math/expression.h"
#include "core/os/input.h"
Size2 SpinBox::get_minimum_size() const {
@@ -50,15 +51,19 @@ void SpinBox::_value_changed(double) {
void SpinBox::_text_entered(const String &p_string) {
- /*
- if (!p_string.is_numeric())
+ Ref<Expression> expr;
+ expr.instance();
+ // Ignore the prefix and suffix in the expression
+ Error err = expr->parse(p_string.trim_prefix(prefix + " ").trim_suffix(" " + suffix));
+ if (err != OK) {
return;
- */
- String value = p_string;
- if (prefix != "" && p_string.begins_with(prefix))
- value = p_string.substr(prefix.length(), p_string.length() - prefix.length());
- set_value(value.to_double());
- _value_changed(0);
+ }
+
+ Variant value = expr->execute(Array(), NULL, false);
+ if (value.get_type() != Variant::NIL) {
+ set_value(value);
+ _value_changed(0);
+ }
}
LineEdit *SpinBox::get_line_edit() {
diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp
index be8f1cf36e..292d80be9d 100644
--- a/scene/gui/tab_container.cpp
+++ b/scene/gui/tab_container.cpp
@@ -840,7 +840,7 @@ Size2 TabContainer::get_minimum_size() const {
Control *c = tabs[i];
- if (!c->is_visible_in_tree())
+ if (!c->is_visible_in_tree() && !use_hidden_tabs_for_min_size)
continue;
Size2 cms = c->get_combined_minimum_size();
@@ -887,6 +887,13 @@ int TabContainer::get_tabs_rearrange_group() const {
return tabs_rearrange_group;
}
+void TabContainer::set_use_hidden_tabs_for_min_size(bool p_use_hidden_tabs) {
+ use_hidden_tabs_for_min_size = p_use_hidden_tabs;
+}
+
+bool TabContainer::get_use_hidden_tabs_for_min_size() const {
+ return use_hidden_tabs_for_min_size;
+}
void TabContainer::_bind_methods() {
ClassDB::bind_method(D_METHOD("_gui_input"), &TabContainer::_gui_input);
@@ -913,6 +920,9 @@ void TabContainer::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_tabs_rearrange_group", "group_id"), &TabContainer::set_tabs_rearrange_group);
ClassDB::bind_method(D_METHOD("get_tabs_rearrange_group"), &TabContainer::get_tabs_rearrange_group);
+ ClassDB::bind_method(D_METHOD("set_use_hidden_tabs_for_min_size", "enabled"), &TabContainer::set_use_hidden_tabs_for_min_size);
+ ClassDB::bind_method(D_METHOD("get_use_hidden_tabs_for_min_size"), &TabContainer::get_use_hidden_tabs_for_min_size);
+
ClassDB::bind_method(D_METHOD("_child_renamed_callback"), &TabContainer::_child_renamed_callback);
ClassDB::bind_method(D_METHOD("_on_theme_changed"), &TabContainer::_on_theme_changed);
ClassDB::bind_method(D_METHOD("_update_current_tab"), &TabContainer::_update_current_tab);
@@ -925,6 +935,7 @@ void TabContainer::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::INT, "current_tab", PROPERTY_HINT_RANGE, "-1,4096,1", PROPERTY_USAGE_EDITOR), "set_current_tab", "get_current_tab");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "tabs_visible"), "set_tabs_visible", "are_tabs_visible");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "drag_to_rearrange_enabled"), "set_drag_to_rearrange_enabled", "get_drag_to_rearrange_enabled");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_hidden_tabs_for_min_size"), "set_use_hidden_tabs_for_min_size", "get_use_hidden_tabs_for_min_size");
BIND_ENUM_CONSTANT(ALIGN_LEFT);
BIND_ENUM_CONSTANT(ALIGN_CENTER);
@@ -945,4 +956,5 @@ TabContainer::TabContainer() {
popup = NULL;
drag_to_rearrange_enabled = false;
tabs_rearrange_group = -1;
+ use_hidden_tabs_for_min_size = false;
}
diff --git a/scene/gui/tab_container.h b/scene/gui/tab_container.h
index f7a9fb64fd..0314f86837 100644
--- a/scene/gui/tab_container.h
+++ b/scene/gui/tab_container.h
@@ -59,6 +59,7 @@ private:
int _get_top_margin() const;
Popup *popup;
bool drag_to_rearrange_enabled;
+ bool use_hidden_tabs_for_min_size;
int tabs_rearrange_group;
Vector<Control *> _get_tabs() const;
@@ -118,6 +119,8 @@ public:
bool get_drag_to_rearrange_enabled() const;
void set_tabs_rearrange_group(int p_group_id);
int get_tabs_rearrange_group() const;
+ void set_use_hidden_tabs_for_min_size(bool p_use_hidden_tabs);
+ bool get_use_hidden_tabs_for_min_size() const;
TabContainer();
};
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp
index ff0c723141..0464cc1ac8 100644
--- a/scene/gui/text_edit.cpp
+++ b/scene/gui/text_edit.cpp
@@ -129,7 +129,7 @@ void TextEdit::Text::_update_line_cache(int p_line) const {
int len = text[p_line].data.length();
const CharType *str = text[p_line].data.c_str();
- //update width
+ // Update width.
for (int i = 0; i < len; i++) {
w += get_char_width(str[i], str[i + 1], w);
@@ -139,7 +139,7 @@ void TextEdit::Text::_update_line_cache(int p_line) const {
text.write[p_line].wrap_amount_cache = -1;
- //update regions
+ // Update regions.
text.write[p_line].region_info.clear();
@@ -148,7 +148,7 @@ void TextEdit::Text::_update_line_cache(int p_line) const {
if (!_is_symbol(str[i]))
continue;
if (str[i] == '\\') {
- i++; //skip quoted anything
+ i++; // Skip quoted anything.
continue;
}
@@ -275,7 +275,7 @@ void TextEdit::Text::clear() {
}
int TextEdit::Text::get_max_width(bool p_exclude_hidden) const {
- //quite some work.. but should be fast enough.
+ // Quite some work, but should be fast enough.
int max = 0;
for (int i = 0; i < text.size(); i++) {
@@ -323,7 +323,7 @@ int TextEdit::Text::get_char_width(CharType c, CharType next_c, int px) const {
if (left == 0)
w = tab_w;
else
- w = tab_w - px % tab_w; // is right...
+ w = tab_w - px % tab_w; // Is right.
} else {
w = font->get_char_size(c, next_c).width;
@@ -367,23 +367,25 @@ void TextEdit::_update_scrollbars() {
total_width += cache.fold_gutter_width;
}
+ if (draw_minimap) {
+ total_width += cache.minimap_width;
+ }
+
bool use_hscroll = true;
bool use_vscroll = true;
+ // Thanks yessopie for this clever bit of logic.
if (total_rows <= visible_rows && total_width <= visible_width) {
- //thanks yessopie for this clever bit of logic
+
use_hscroll = false;
use_vscroll = false;
-
} else {
if (total_rows > visible_rows && total_width <= visible_width) {
- //thanks yessopie for this clever bit of logic
use_hscroll = false;
}
if (total_rows <= visible_rows && total_width > visible_width) {
- //thanks yessopie for this clever bit of logic
use_vscroll = false;
}
}
@@ -459,6 +461,7 @@ void TextEdit::_click_selection_held() {
}
void TextEdit::_update_selection_mode_pointer() {
+ dragging_selection = true;
Point2 mp = get_local_mouse_position();
int row, col;
@@ -474,6 +477,7 @@ void TextEdit::_update_selection_mode_pointer() {
}
void TextEdit::_update_selection_mode_word() {
+ dragging_selection = true;
Point2 mp = get_local_mouse_position();
int row, col;
@@ -481,7 +485,7 @@ void TextEdit::_update_selection_mode_word() {
String line = text[row];
int beg = CLAMP(col, 0, line.length());
- // if its the first selection and on whitespace make sure we grab the word instead..
+ // If its the first selection and on whitespace make sure we grab the word instead.
if (!selection.active) {
while (beg > 0 && line[beg] <= 32) {
beg--;
@@ -490,7 +494,7 @@ void TextEdit::_update_selection_mode_word() {
int end = beg;
bool symbol = beg < line.length() && _is_symbol(line[beg]);
- // get the word end and begin points
+ // Get the word end and begin points.
while (beg > 0 && line[beg - 1] > 32 && (symbol == _is_symbol(line[beg - 1]))) {
beg--;
}
@@ -501,7 +505,7 @@ void TextEdit::_update_selection_mode_word() {
end += 1;
}
- // initial selection
+ // Initial selection.
if (!selection.active) {
select(row, beg, row, end);
selection.selecting_column = beg;
@@ -530,6 +534,7 @@ void TextEdit::_update_selection_mode_word() {
}
void TextEdit::_update_selection_mode_line() {
+ dragging_selection = true;
Point2 mp = get_local_mouse_position();
int row, col;
@@ -537,11 +542,11 @@ void TextEdit::_update_selection_mode_line() {
col = 0;
if (row < selection.selecting_line) {
- // cursor is above us
+ // Cursor is above us.
cursor_set_line(row - 1, false);
selection.selecting_column = text[selection.selecting_line].length();
} else {
- // cursor is below us
+ // Cursor is below us.
cursor_set_line(row + 1, false);
selection.selecting_column = 0;
col = text[row].length();
@@ -554,11 +559,58 @@ void TextEdit::_update_selection_mode_line() {
click_select_held->start();
}
+void TextEdit::_update_minimap_click() {
+ Point2 mp = get_local_mouse_position();
+
+ int xmargin_end = get_size().width - cache.style_normal->get_margin(MARGIN_RIGHT);
+ if (!dragging_minimap && (mp.x < xmargin_end - minimap_width || mp.y > xmargin_end)) {
+ minimap_clicked = false;
+ return;
+ }
+ minimap_clicked = true;
+ dragging_minimap = true;
+
+ int row;
+ _get_minimap_mouse_row(Point2i(mp.x, mp.y), row);
+
+ if (row >= get_first_visible_line() && (row < get_last_visible_line() || row >= (text.size() - 1))) {
+ minimap_scroll_ratio = v_scroll->get_as_ratio();
+ minimap_scroll_click_pos = mp.y;
+ can_drag_minimap = true;
+ return;
+ }
+
+ int wi;
+ int first_line = row - num_lines_from_rows(row, 0, -get_visible_rows() / 2, wi) + 1;
+ double delta = get_scroll_pos_for_line(first_line, wi) - get_v_scroll();
+ if (delta < 0) {
+ _scroll_up(-delta);
+ } else {
+ _scroll_down(delta);
+ }
+}
+
+void TextEdit::_update_minimap_drag() {
+
+ if (!can_drag_minimap) {
+ return;
+ }
+
+ int control_height = _get_control_height();
+ int scroll_height = v_scroll->get_max() * (minimap_char_size.y + minimap_line_spacing);
+ if (control_height > scroll_height) {
+ control_height = scroll_height;
+ }
+
+ Point2 mp = get_local_mouse_position();
+ double diff = (mp.y - minimap_scroll_click_pos) / control_height;
+ v_scroll->set_as_ratio(minimap_scroll_ratio + diff);
+}
+
void TextEdit::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
-
_update_caches();
if (cursor_changed_dirty)
MessageQueue::get_singleton()->push_call(this, "_cursor_changed_emit");
@@ -567,14 +619,19 @@ void TextEdit::_notification(int p_what) {
_update_wrap_at();
} break;
case NOTIFICATION_RESIZED: {
-
_update_scrollbars();
- call_deferred("_update_wrap_at");
+ _update_wrap_at();
+ } break;
+ case NOTIFICATION_VISIBILITY_CHANGED: {
+ if (is_visible()) {
+ call_deferred("_update_scrollbars");
+ call_deferred("_update_wrap_at");
+ }
} break;
case NOTIFICATION_THEME_CHANGED: {
-
_update_caches();
_update_wrap_at();
+ syntax_highlighting_cache.clear();
} break;
case MainLoop::NOTIFICATION_WM_FOCUS_IN: {
window_has_focus = true;
@@ -590,24 +647,26 @@ void TextEdit::_notification(int p_what) {
if (scrolling && get_v_scroll() != target_v_scroll) {
double target_y = target_v_scroll - get_v_scroll();
double dist = sqrt(target_y * target_y);
- double vel = ((target_y / dist) * v_scroll_speed) * get_physics_process_delta_time();
+ // To ensure minimap is responsive overide the speed setting.
+ double vel = ((target_y / dist) * ((minimap_clicked) ? 3000 : v_scroll_speed)) * get_physics_process_delta_time();
if (Math::abs(vel) >= dist) {
set_v_scroll(target_v_scroll);
scrolling = false;
+ minimap_clicked = false;
set_physics_process_internal(false);
} else {
set_v_scroll(get_v_scroll() + vel);
}
} else {
scrolling = false;
+ minimap_clicked = false;
set_physics_process_internal(false);
}
} break;
case NOTIFICATION_DRAW: {
-
if (first_draw) {
- //size may not be the final one, so attempts to ensure cursor was visible may have failed
+ // Size may not be the final one, so attempts to ensure cursor was visible may have failed.
adjust_viewport_to_cursor();
first_draw = false;
}
@@ -637,6 +696,11 @@ void TextEdit::_notification(int p_what) {
cache.fold_gutter_width = 0;
}
+ cache.minimap_width = 0;
+ if (draw_minimap) {
+ cache.minimap_width = minimap_width;
+ }
+
int line_number_char_count = 0;
{
@@ -660,8 +724,9 @@ void TextEdit::_notification(int p_what) {
RID ci = get_canvas_item();
VisualServer::get_singleton()->canvas_item_set_clip(get_canvas_item(), true);
int xmargin_beg = cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.fold_gutter_width + cache.info_gutter_width;
- int xmargin_end = size.width - cache.style_normal->get_margin(MARGIN_RIGHT);
- //let's do it easy for now:
+
+ int xmargin_end = size.width - cache.style_normal->get_margin(MARGIN_RIGHT) - cache.minimap_width;
+ // Let's do it easy for now.
cache.style_normal->draw(ci, Rect2(Point2(), size));
if (readonly) {
cache.style_readonly->draw(ci, Rect2(Point2(), size));
@@ -701,7 +766,7 @@ void TextEdit::_notification(int p_what) {
if (brace_matching_enabled && cursor.line >= 0 && cursor.line < text.size() && cursor.column >= 0) {
if (cursor.column < text[cursor.line].length()) {
- //check for open
+ // Check for open.
CharType c = text[cursor.line][cursor.column];
CharType closec = 0;
@@ -723,7 +788,7 @@ void TextEdit::_notification(int p_what) {
for (int j = from; j < text[i].length(); j++) {
CharType cc = text[i][j];
- //ignore any brackets inside a string
+ // Ignore any brackets inside a string.
if (cc == '"' || cc == '\'') {
CharType quotation = cc;
do {
@@ -732,7 +797,7 @@ void TextEdit::_notification(int p_what) {
break;
}
cc = text[i][j];
- //skip over escaped quotation marks inside strings
+ // Skip over escaped quotation marks inside strings.
if (cc == '\\') {
bool escaped = true;
while (j + 1 < text[i].length() && text[i][j + 1] == '\\') {
@@ -789,7 +854,7 @@ void TextEdit::_notification(int p_what) {
for (int j = from; j >= 0; j--) {
CharType cc = text[i][j];
- //ignore any brackets inside a string
+ // Ignore any brackets inside a string.
if (cc == '"' || cc == '\'') {
CharType quotation = cc;
do {
@@ -798,7 +863,7 @@ void TextEdit::_notification(int p_what) {
break;
}
cc = text[i][j];
- //skip over escaped quotation marks inside strings
+ // Skip over escaped quotation marks inside strings.
if (cc == quotation) {
bool escaped = false;
while (j - 1 >= 0 && text[i][j - 1] == '\\') {
@@ -837,10 +902,10 @@ void TextEdit::_notification(int p_what) {
Point2 cursor_pos;
int cursor_insert_offset_y = 0;
- // get the highlighted words
+ // Get the highlighted words.
String highlighted_text = get_selection_text();
- // check if highlighted words contains only whitespaces (tabs or spaces)
+ // Check if highlighted words contains only whitespaces (tabs or spaces).
bool only_whitespaces_highlighted = highlighted_text.strip_edges() == String();
String line_num_padding = line_numbers_zero_padded ? "0" : " ";
@@ -849,9 +914,156 @@ void TextEdit::_notification(int p_what) {
FontDrawer drawer(cache.font, Color(1, 1, 1));
- int line = get_first_visible_line() - 1;
+ int first_visible_line = get_first_visible_line() - 1;
int draw_amount = visible_rows + (smooth_scroll_enabled ? 1 : 0);
- draw_amount += times_line_wraps(line + 1);
+ draw_amount += times_line_wraps(first_visible_line + 1);
+
+ // minimap
+ if (draw_minimap) {
+ int minimap_visible_lines = _get_minimap_visible_rows();
+ int minimap_line_height = (minimap_char_size.y + minimap_line_spacing);
+ int minimap_tab_size = minimap_char_size.x * indent_size;
+
+ // calculate viewport size and y offset
+ int viewport_height = (draw_amount - 1) * minimap_line_height;
+ int control_height = _get_control_height() - viewport_height;
+ int viewport_offset_y = round(get_scroll_pos_for_line(first_visible_line) * control_height) / ((v_scroll->get_max() <= minimap_visible_lines) ? (minimap_visible_lines - draw_amount) : (v_scroll->get_max() - draw_amount));
+
+ // calculate the first line.
+ int num_lines_before = round((viewport_offset_y) / minimap_line_height);
+ int wi;
+ int minimap_line = (v_scroll->get_max() <= minimap_visible_lines) ? -1 : first_visible_line;
+ if (minimap_line >= 0) {
+ minimap_line -= num_lines_from_rows(first_visible_line, 0, -num_lines_before, wi);
+ minimap_line -= (smooth_scroll_enabled ? 1 : 0);
+ }
+ int minimap_draw_amount = minimap_visible_lines + times_line_wraps(minimap_line + 1);
+
+ // draw the minimap
+ Color viewport_color = (cache.background_color.get_v() < 0.5) ? Color(1, 1, 1, 0.1) : Color(0, 0, 0, 0.1);
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2((xmargin_end + 2), viewport_offset_y, cache.minimap_width, viewport_height), viewport_color);
+ for (int i = 0; i < minimap_draw_amount; i++) {
+
+ minimap_line++;
+
+ if (minimap_line < 0 || minimap_line >= (int)text.size()) {
+ break;
+ }
+
+ while (is_line_hidden(minimap_line)) {
+ minimap_line++;
+ if (minimap_line < 0 || minimap_line >= (int)text.size()) {
+ break;
+ }
+ }
+
+ Map<int, HighlighterInfo> color_map;
+ if (syntax_coloring) {
+ color_map = _get_line_syntax_highlighting(minimap_line);
+ }
+
+ Color current_color = cache.font_color;
+ if (readonly) {
+ current_color = cache.font_color_readonly;
+ }
+
+ Vector<String> wrap_rows = get_wrap_rows_text(minimap_line);
+ int line_wrap_amount = times_line_wraps(minimap_line);
+ int last_wrap_column = 0;
+
+ for (int line_wrap_index = 0; line_wrap_index < line_wrap_amount + 1; line_wrap_index++) {
+ if (line_wrap_index != 0) {
+ i++;
+ if (i >= minimap_draw_amount)
+ break;
+ }
+
+ const String &str = wrap_rows[line_wrap_index];
+ int indent_px = line_wrap_index != 0 ? get_indent_level(minimap_line) : 0;
+ if (indent_px >= wrap_at) {
+ indent_px = 0;
+ }
+ indent_px = minimap_char_size.x * indent_px;
+
+ if (line_wrap_index > 0) {
+ last_wrap_column += wrap_rows[line_wrap_index - 1].length();
+ }
+
+ if (minimap_line == cursor.line && cursor_wrap_index == line_wrap_index && highlight_current_line) {
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2((xmargin_end + 2), i * 3, cache.minimap_width, 2), cache.current_line_color);
+ }
+
+ Color previous_color;
+ int characters = 0;
+ int tabs = 0;
+ for (int j = 0; j < str.length(); j++) {
+ if (syntax_coloring) {
+ if (color_map.has(last_wrap_column + j)) {
+ current_color = color_map[last_wrap_column + j].color;
+ if (readonly) {
+ current_color.a = cache.font_color_readonly.a;
+ }
+ }
+ color = current_color;
+ }
+
+ if (j == 0) {
+ previous_color = color;
+ }
+
+ int xpos = indent_px + ((xmargin_end + minimap_char_size.x) + (minimap_char_size.x * j)) + tabs;
+ bool out_of_bounds = (xpos >= xmargin_end + cache.minimap_width);
+
+ bool is_whitespace = _is_whitespace(str[j]);
+ if (!is_whitespace) {
+ characters++;
+
+ if (j < str.length() - 1 && color == previous_color && !out_of_bounds) {
+ continue;
+ }
+
+ // If we've changed colour we are at the start of a new section, therefore we need to go back to the end
+ // of the previous section to draw it, we'll also add the character back on.
+ if (color != previous_color) {
+ characters--;
+ j--;
+
+ if (str[j] == '\t') {
+ tabs -= minimap_tab_size;
+ }
+ }
+ }
+
+ if (characters > 0) {
+ previous_color.a *= 0.6;
+ // take one for zero indexing, and if we hit whitespace / the end of a word.
+ int chars = MAX(0, (j - (characters - 1)) - (is_whitespace ? 1 : 0)) + 1;
+ int char_x_ofs = indent_px + ((xmargin_end + minimap_char_size.x) + (minimap_char_size.x * chars)) + tabs;
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(char_x_ofs, minimap_line_height * i), Point2(minimap_char_size.x * characters, minimap_char_size.y)), previous_color);
+ }
+
+ if (out_of_bounds) {
+ break;
+ }
+
+ // re-adjust if we went backwards.
+ if (color != previous_color && !is_whitespace) {
+ characters++;
+ }
+
+ if (str[j] == '\t') {
+ tabs += minimap_tab_size;
+ }
+
+ previous_color = color;
+ characters = 0;
+ }
+ }
+ }
+ }
+
+ // draw main text
+ int line = first_visible_line;
for (int i = 0; i < draw_amount; i++) {
line++;
@@ -875,7 +1087,7 @@ void TextEdit::_notification(int p_what) {
if (syntax_coloring) {
color_map = _get_line_syntax_highlighting(line);
}
- // ensure we at least use the font color
+ // Ensure we at least use the font color.
Color current_color = readonly ? cache.font_color_readonly : cache.font_color;
bool underlined = false;
@@ -916,7 +1128,7 @@ void TextEdit::_notification(int p_what) {
if (smooth_scroll_enabled)
ofs_y += (-get_v_scroll_offset()) * get_row_height();
- // check if line contains highlighted word
+ // Check if line contains highlighted word.
int highlighted_text_col = -1;
int search_text_col = -1;
int highlighted_word_col = -1;
@@ -938,25 +1150,25 @@ void TextEdit::_notification(int p_what) {
}
if (str.length() == 0) {
- // draw line background if empty as we won't loop at at all
+ // Draw line background if empty as we won't loop at at all.
if (line == cursor.line && cursor_wrap_index == line_wrap_index && highlight_current_line) {
VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(ofs_x, ofs_y, xmargin_end, get_row_height()), cache.current_line_color);
}
- // give visual indication of empty selected line
+ // Give visual indication of empty selected line.
if (selection.active && line >= selection.from_line && line <= selection.to_line && char_margin >= xmargin_beg) {
int char_w = cache.font->get_char_size(' ').width;
VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg + ofs_x, ofs_y, char_w, get_row_height()), cache.selection_color);
}
} else {
- // if it has text, then draw current line marker in the margin, as line number etc will draw over it, draw the rest of line marker later.
+ // If it has text, then draw current line marker in the margin, as line number etc will draw over it, draw the rest of line marker later.
if (line == cursor.line && cursor_wrap_index == line_wrap_index && highlight_current_line) {
- VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(0, ofs_y, xmargin_beg, get_row_height()), cache.current_line_color);
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(0, ofs_y, xmargin_beg + ofs_x, get_row_height()), cache.current_line_color);
}
}
if (line_wrap_index == 0) {
- // only do these if we are on the first wrapped part of a line
+ // Only do these if we are on the first wrapped part of a line.
if (text.is_breakpoint(line) && !draw_breakpoint_gutter) {
#ifdef TOOLS_ENABLED
@@ -966,7 +1178,7 @@ void TextEdit::_notification(int p_what) {
#endif
}
- // draw bookmark marker
+ // Draw bookmark marker.
if (text.is_bookmark(line)) {
if (draw_bookmark_gutter) {
int vertical_gap = (get_row_height() * 40) / 100;
@@ -976,26 +1188,26 @@ void TextEdit::_notification(int p_what) {
}
}
- // draw breakpoint marker
+ // Draw breakpoint marker.
if (text.is_breakpoint(line)) {
if (draw_breakpoint_gutter) {
int vertical_gap = (get_row_height() * 40) / 100;
int horizontal_gap = (cache.breakpoint_gutter_width * 30) / 100;
int marker_height = get_row_height() - (vertical_gap * 2);
int marker_width = cache.breakpoint_gutter_width - (horizontal_gap * 2);
- // no transparency on marker
+ // No transparency on marker.
VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(cache.style_normal->get_margin(MARGIN_LEFT) + horizontal_gap - 2, ofs_y + vertical_gap, marker_width, marker_height), Color(cache.breakpoint_color.r, cache.breakpoint_color.g, cache.breakpoint_color.b));
}
}
- // draw info icons
+ // Draw info icons.
if (draw_info_gutter && text.has_info_icon(line)) {
int vertical_gap = (get_row_height() * 40) / 100;
int horizontal_gap = (cache.info_gutter_width * 30) / 100;
int gutter_left = cache.style_normal->get_margin(MARGIN_LEFT) + cache.breakpoint_gutter_width;
Ref<Texture> info_icon = text.get_info_icon(line);
- // ensure the icon fits the gutter size
+ // Ensure the icon fits the gutter size.
Size2i icon_size = info_icon->get_size();
if (icon_size.width > cache.info_gutter_width - horizontal_gap) {
icon_size.width = cache.info_gutter_width - horizontal_gap;
@@ -1013,7 +1225,7 @@ void TextEdit::_notification(int p_what) {
draw_texture_rect(info_icon, Rect2(icon_pos, icon_size));
}
- // draw execution marker
+ // Draw execution marker.
if (executing_line == line) {
if (draw_breakpoint_gutter) {
int icon_extra_size = 4;
@@ -1031,7 +1243,7 @@ void TextEdit::_notification(int p_what) {
}
}
- // draw fold markers
+ // Draw fold markers.
if (draw_fold_gutter) {
int horizontal_gap = (cache.fold_gutter_width * 30) / 100;
int gutter_left = cache.style_normal->get_margin(MARGIN_LEFT) + cache.breakpoint_gutter_width + cache.line_number_w + cache.info_gutter_width;
@@ -1046,7 +1258,7 @@ void TextEdit::_notification(int p_what) {
}
}
- // draw line numbers
+ // Draw line numbers.
if (cache.line_number_w) {
int yofs = ofs_y + (get_row_height() - cache.font->get_height()) / 2;
String fc = String::num(line + 1);
@@ -1058,32 +1270,35 @@ void TextEdit::_notification(int p_what) {
}
}
- //loop through characters in one line
+ // Loop through characters in one line.
for (int j = 0; j < str.length(); j++) {
if (syntax_coloring) {
if (color_map.has(last_wrap_column + j)) {
- current_color = readonly ? cache.font_color_readonly : color_map[last_wrap_column + j].color;
+ current_color = color_map[last_wrap_column + j].color;
+ if (readonly && current_color.a > cache.font_color_readonly.a) {
+ current_color.a = cache.font_color_readonly.a;
+ }
}
color = current_color;
}
int char_w;
- //handle tabulator
+ // Handle tabulator.
char_w = text.get_char_width(str[j], str[j + 1], char_ofs);
if ((char_ofs + char_margin) < xmargin_beg) {
char_ofs += char_w;
- // line highlighting handle horizontal clipping
+ // Line highlighting handle horizontal clipping.
if (line == cursor.line && cursor_wrap_index == line_wrap_index && highlight_current_line) {
if (j == str.length() - 1) {
- // end of line when last char is skipped
+ // End of line when last char is skipped.
VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg + ofs_x, ofs_y, xmargin_end - (char_ofs + char_margin + char_w), get_row_height()), cache.current_line_color);
} else if ((char_ofs + char_margin) > xmargin_beg) {
- // char next to margin is skipped
+ // Char next to margin is skipped.
VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg + ofs_x, ofs_y, (char_ofs + char_margin) - (xmargin_beg + ofs_x), get_row_height()), cache.current_line_color);
}
}
@@ -1097,7 +1312,7 @@ void TextEdit::_notification(int p_what) {
bool in_search_result = false;
if (search_text_col != -1) {
- // if we are at the end check for new search result on same line
+ // If we are at the end check for new search result on same line.
if (j >= search_text_col + search_text.length())
search_text_col = _get_column_pos_of_word(search_text, str, search_flags, j);
@@ -1108,19 +1323,19 @@ void TextEdit::_notification(int p_what) {
}
}
- //current line highlighting
+ // Current line highlighting.
bool in_selection = (selection.active && line >= selection.from_line && line <= selection.to_line && (line > selection.from_line || last_wrap_column + j >= selection.from_column) && (line < selection.to_line || last_wrap_column + j < selection.to_column));
if (line == cursor.line && cursor_wrap_index == line_wrap_index && highlight_current_line) {
- // draw the wrap indent offset highlight
+ // Draw the wrap indent offset highlight.
if (line_wrap_index != 0 && j == 0) {
- VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(char_ofs + char_margin - indent_px, ofs_y, indent_px, get_row_height()), cache.current_line_color);
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(char_ofs + char_margin + ofs_x - indent_px, ofs_y, indent_px, get_row_height()), cache.current_line_color);
}
- // if its the last char draw to end of the line
+ // If its the last char draw to end of the line.
if (j == str.length() - 1) {
- VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(char_ofs + char_margin + char_w, ofs_y, xmargin_end - (char_ofs + char_margin + char_w), get_row_height()), cache.current_line_color);
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(char_ofs + char_margin + char_w + ofs_x, ofs_y, xmargin_end - (char_ofs + char_margin + char_w), get_row_height()), cache.current_line_color);
}
- // actual text
+ // Actual text.
if (!in_selection) {
VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin + ofs_x, ofs_y), Size2i(char_w, get_row_height())), cache.current_line_color);
}
@@ -1145,14 +1360,14 @@ void TextEdit::_notification(int p_what) {
if (highlight_all_occurrences && !only_whitespaces_highlighted) {
if (highlighted_text_col != -1) {
- // if we are at the end check for new word on same line
+ // If we are at the end check for new word on same line.
if (j > highlighted_text_col + highlighted_text.length()) {
highlighted_text_col = _get_column_pos_of_word(highlighted_text, str, SEARCH_MATCH_CASE | SEARCH_WHOLE_WORDS, j);
}
bool in_highlighted_word = (j >= highlighted_text_col && j < highlighted_text_col + highlighted_text.length());
- // if this is the original highlighted text we don't want to highlight it again
+ // If this is the original highlighted text we don't want to highlight it again.
if (cursor.line == line && cursor_wrap_index == line_wrap_index && (cursor.column >= highlighted_text_col && cursor.column <= highlighted_text_col + highlighted_text.length())) {
in_highlighted_word = false;
}
@@ -1349,7 +1564,7 @@ void TextEdit::_notification(int p_what) {
bool completion_below = false;
if (completion_active) {
- // code completion box
+ // Code completion box.
Ref<StyleBox> csb = get_stylebox("completion");
int maxlines = get_constant("completion_lines");
int cmax_width = get_constant("completion_max_width") * cache.font->get_char_size('x').x;
@@ -1371,7 +1586,7 @@ void TextEdit::_notification(int p_what) {
w = cmax_width;
}
- // Add space for completion icons
+ // Add space for completion icons.
const int icon_hsep = get_constant("hseparation", "ItemList");
Size2 icon_area_size(get_row_height(), get_row_height());
w += icon_area_size.width + icon_hsep;
@@ -1403,7 +1618,7 @@ void TextEdit::_notification(int p_what) {
}
int line_from = CLAMP(completion_index - lines / 2, 0, completion_options.size() - lines);
VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(completion_rect.position.x, completion_rect.position.y + (completion_index - line_from) * get_row_height()), Size2(completion_rect.size.width, get_row_height())), cache.completion_selected_color);
- draw_rect(Rect2(completion_rect.position + Vector2(icon_area_size.x + icon_hsep, 0), Size2(nofs, completion_rect.size.height)), cache.completion_existing_color);
+ draw_rect(Rect2(completion_rect.position + Vector2(icon_area_size.x + icon_hsep, 0), Size2(MIN(nofs, completion_rect.size.width - (icon_area_size.x + icon_hsep)), completion_rect.size.height)), cache.completion_existing_color);
for (int i = 0; i < lines; i++) {
@@ -1418,7 +1633,7 @@ void TextEdit::_notification(int p_what) {
int yofs = (get_row_height() - cache.font->get_height()) / 2;
Point2 title_pos(completion_rect.position.x, completion_rect.position.y + i * get_row_height() + cache.font->get_ascent() + yofs);
- //draw completion icon if it is valid
+ // Draw completion icon if it is valid.
Ref<Texture> icon = completion_options[l].icon;
Rect2 icon_area(completion_rect.position.x, completion_rect.position.y + i * get_row_height(), icon_area_size.width, icon_area_size.height);
if (icon.is_valid()) {
@@ -1430,11 +1645,11 @@ void TextEdit::_notification(int p_what) {
}
title_pos.x = icon_area.position.x + icon_area.size.width + icon_hsep;
- draw_string(cache.font, title_pos, completion_options[l].display, text_color, completion_rect.size.width);
+ draw_string(cache.font, title_pos, completion_options[l].display, text_color, completion_rect.size.width - (icon_area_size.x + icon_hsep));
}
if (scrollw) {
- //draw a small scroll rectangle to show a position in the options
+ // Draw a small scroll rectangle to show a position in the options.
float r = maxlines / (float)completion_options.size();
float o = line_from / (float)completion_options.size();
draw_rect(Rect2(completion_rect.position.x + completion_rect.size.width, completion_rect.position.y + o * completion_rect.size.y, scrollw, completion_rect.size.y * r), scrollc);
@@ -1443,7 +1658,7 @@ void TextEdit::_notification(int p_what) {
completion_line_ofs = line_from;
}
- // check to see if the hint should be drawn
+ // Check to see if the hint should be drawn.
bool show_hint = false;
if (completion_hint != "") {
if (completion_active) {
@@ -1520,7 +1735,6 @@ void TextEdit::_notification(int p_what) {
OS::get_singleton()->set_ime_active(true);
OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos + Point2(0, get_row_height()));
}
-
} break;
case NOTIFICATION_FOCUS_ENTER: {
@@ -1662,9 +1876,9 @@ void TextEdit::backspace_at_cursor() {
_is_pair_left_symbol(text[cursor.line][cursor.column - 1])) {
_consume_backspace_for_pair_symbol(prev_line, prev_column);
} else {
- // handle space indentation
+ // Handle space indentation.
if (cursor.column != 0 && indent_using_spaces) {
- // check if there are no other chars before cursor, just indentation
+ // Check if there are no other chars before cursor, just indentation.
bool unindent = true;
int i = 0;
while (i < cursor.column && i < text[cursor.line].length()) {
@@ -1675,10 +1889,9 @@ void TextEdit::backspace_at_cursor() {
i++;
}
- // then we can remove all spaces as a single character.
+ // Then we can remove all spaces as a single character.
if (unindent) {
- // we want to remove spaces up to closest indent
- // or whole indent if cursor is pointing at it
+ // We want to remove spaces up to closest indent, or whole indent if cursor is pointing at it.
int spaces_to_delete = _calculate_spaces_till_next_left_indent(cursor.column);
prev_column = cursor.column - spaces_to_delete;
_remove_text(cursor.line, prev_column, cursor.line, cursor.column);
@@ -1699,8 +1912,8 @@ void TextEdit::indent_right() {
int start_line;
int end_line;
- // this value informs us by how much we changed selection position by indenting right
- // default is 1 for tab indentation
+ // This value informs us by how much we changed selection position by indenting right.
+ // Default is 1 for tab indentation.
int selection_offset = 1;
begin_complex_operation();
@@ -1712,7 +1925,7 @@ void TextEdit::indent_right() {
end_line = start_line;
}
- // ignore if the cursor is not past the first column
+ // Ignore if the cursor is not past the first column.
if (is_selection_active() && get_selection_to_column() == 0) {
end_line--;
}
@@ -1720,10 +1933,10 @@ void TextEdit::indent_right() {
for (int i = start_line; i <= end_line; i++) {
String line_text = get_line(i);
if (indent_using_spaces) {
- // we don't really care where selection is - we just need to know indentation level at the beginning of the line
+ // We don't really care where selection is - we just need to know indentation level at the beginning of the line.
int left = _find_first_non_whitespace_column_of_line(line_text);
int spaces_to_add = _calculate_spaces_till_next_right_indent(left);
- // since we will add this much spaces we want move whole selection and cursor by this much
+ // Since we will add this much spaces we want move whole selection and cursor by this much.
selection_offset = spaces_to_add;
for (int j = 0; j < spaces_to_add; j++)
line_text = ' ' + line_text;
@@ -1733,7 +1946,7 @@ void TextEdit::indent_right() {
set_line(i, line_text);
}
- // fix selection and cursor being off after shifting selection right
+ // Fix selection and cursor being off after shifting selection right.
if (is_selection_active()) {
select(selection.from_line, selection.from_column + selection_offset, selection.to_line, selection.to_column + selection_offset);
}
@@ -1747,10 +1960,9 @@ void TextEdit::indent_left() {
int start_line;
int end_line;
- // moving cursor and selection after unindenting can get tricky
- // because changing content of line can move cursor and selection on it's own (if new line ends before previous position of either)
- // therefore we just remember initial values
- // and at the end of the operation offset them by number of removed characters
+ // Moving cursor and selection after unindenting can get tricky because
+ // changing content of line can move cursor and selection on it's own (if new line ends before previous position of either),
+ // therefore we just remember initial values and at the end of the operation offset them by number of removed characters.
int removed_characters = 0;
int initial_selection_end_column = selection.to_column;
int initial_cursor_column = cursor.column;
@@ -1765,7 +1977,7 @@ void TextEdit::indent_left() {
end_line = start_line;
}
- // ignore if the cursor is not past the first column
+ // Ignore if the cursor is not past the first column.
if (is_selection_active() && get_selection_to_column() == 0) {
end_line--;
}
@@ -1779,12 +1991,12 @@ void TextEdit::indent_left() {
set_line(i, line_text);
removed_characters = 1;
} else if (line_text.begins_with(" ")) {
- // when unindenting we aim to remove spaces before line that has selection no matter what is selected
+ // When unindenting we aim to remove spaces before line that has selection no matter what is selected,
// so we start of by finding first non whitespace character of line
int left = _find_first_non_whitespace_column_of_line(line_text);
- // here we remove only enough spaces to align text to nearest full multiple of indentation_size
- // in case where selection begins at the start of indentation_size multiple we remove whole indentation level
+ // Here we remove only enough spaces to align text to nearest full multiple of indentation_size.
+ // In case where selection begins at the start of indentation_size multiple we remove whole indentation level.
int spaces_to_remove = _calculate_spaces_till_next_left_indent(left);
line_text = line_text.substr(spaces_to_remove, line_text.length());
@@ -1793,7 +2005,7 @@ void TextEdit::indent_left() {
}
}
- // fix selection and cursor being off by one on the last line
+ // Fix selection and cursor being off by one on the last line.
if (is_selection_active() && last_line_text != get_line(end_line)) {
select(selection.from_line, selection.from_column - removed_characters,
selection.to_line, initial_selection_end_column - removed_characters);
@@ -1834,7 +2046,7 @@ void TextEdit::_get_mouse_pos(const Point2i &p_mouse, int &r_row, int &r_col) co
}
if (row < 0)
- row = 0; //todo
+ row = 0; // TODO.
int col = 0;
@@ -1848,7 +2060,7 @@ void TextEdit::_get_mouse_pos(const Point2i &p_mouse, int &r_row, int &r_col) co
colx += cursor.x_ofs;
col = get_char_pos_for_line(colx, row, wrap_index);
if (is_wrap_enabled() && wrap_index < times_line_wraps(row)) {
- // move back one if we are at the end of the row
+ // Move back one if we are at the end of the row.
Vector<String> rows2 = get_wrap_rows_text(row);
int row_end_col = 0;
for (int i = 0; i < wrap_index + 1; i++) {
@@ -1863,6 +2075,61 @@ void TextEdit::_get_mouse_pos(const Point2i &p_mouse, int &r_row, int &r_col) co
r_col = col;
}
+void TextEdit::_get_minimap_mouse_row(const Point2i &p_mouse, int &r_row) const {
+
+ float rows = p_mouse.y;
+ rows -= cache.style_normal->get_margin(MARGIN_TOP);
+ rows /= (minimap_char_size.y + minimap_line_spacing);
+ rows += get_v_scroll_offset();
+
+ // calculate visible lines
+ int minimap_visible_lines = _get_minimap_visible_rows();
+ int visible_rows = get_visible_rows() + 1;
+ int first_visible_line = get_first_visible_line() - 1;
+ int draw_amount = visible_rows + (smooth_scroll_enabled ? 1 : 0);
+ draw_amount += times_line_wraps(first_visible_line + 1);
+ int minimap_line_height = (minimap_char_size.y + minimap_line_spacing);
+
+ // calculate viewport size and y offset
+ int viewport_height = (draw_amount - 1) * minimap_line_height;
+ int control_height = _get_control_height() - viewport_height;
+ int viewport_offset_y = round(get_scroll_pos_for_line(first_visible_line) * control_height) / ((v_scroll->get_max() <= minimap_visible_lines) ? (minimap_visible_lines - draw_amount) : (v_scroll->get_max() - draw_amount));
+
+ // calculate the first line.
+ int num_lines_before = round((viewport_offset_y) / minimap_line_height);
+ int wi;
+ int minimap_line = (v_scroll->get_max() <= minimap_visible_lines) ? -1 : first_visible_line;
+ if (first_visible_line > 0 && minimap_line >= 0) {
+ minimap_line -= num_lines_from_rows(first_visible_line, 0, -num_lines_before, wi);
+ minimap_line -= (smooth_scroll_enabled ? 1 : 0);
+ } else {
+ minimap_line = 0;
+ }
+
+ int row = minimap_line + Math::floor(rows);
+ int wrap_index = 0;
+
+ if (is_wrap_enabled() || is_hiding_enabled()) {
+
+ int f_ofs = num_lines_from_rows(minimap_line, cursor.wrap_ofs, rows + (1 * SGN(rows)), wrap_index) - 1;
+ if (rows < 0) {
+ row = minimap_line - f_ofs;
+ } else {
+ row = minimap_line + f_ofs;
+ }
+ }
+
+ if (row < 0) {
+ row = 0;
+ }
+
+ if (row >= text.size()) {
+ row = text.size() - 1;
+ }
+
+ r_row = row;
+}
+
void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
double prev_v_scroll = v_scroll->get_value();
@@ -1936,13 +2203,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
int row, col;
_get_mouse_pos(Point2i(mb->get_position().x, mb->get_position().y), row, col);
- if (mb->get_command() && highlighted_word != String()) {
-
- emit_signal("symbol_lookup", highlighted_word, row, col);
- return;
- }
-
- // toggle breakpoint on gutter click
+ // Toggle breakpoint on gutter click.
if (draw_breakpoint_gutter) {
int gutter = cache.style_normal->get_margin(MARGIN_LEFT);
if (mb->get_position().x > gutter - 6 && mb->get_position().x <= gutter + cache.breakpoint_gutter_width - 3) {
@@ -1952,7 +2213,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
}
}
- // emit info clicked
+ // Emit info clicked.
if (draw_info_gutter && text.has_info_icon(row)) {
int left_margin = cache.style_normal->get_margin(MARGIN_LEFT);
int gutter_left = left_margin + cache.breakpoint_gutter_width;
@@ -1962,7 +2223,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
}
}
- // toggle fold on gutter click if can
+ // Toggle fold on gutter click if can.
if (draw_fold_gutter) {
int left_margin = cache.style_normal->get_margin(MARGIN_LEFT);
@@ -1977,7 +2238,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
}
}
- // unfold on folded icon click
+ // Unfold on folded icon click.
if (is_folded(row)) {
int line_width = text.get_line_width(row);
line_width += cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.info_gutter_width + cache.fold_gutter_width - cursor.x_ofs;
@@ -1987,6 +2248,14 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
}
}
+ // minimap
+ if (draw_minimap) {
+ _update_minimap_click();
+ if (dragging_minimap) {
+ return;
+ }
+ }
+
int prev_col = cursor.column;
int prev_line = cursor.line;
@@ -2044,9 +2313,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
} else {
- //if sel active and dblick last time < something
-
- //else
selection.active = false;
selection.selecting_mode = Selection::MODE_POINTER;
selection.selecting_line = row;
@@ -2054,14 +2320,14 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
}
if (!mb->is_doubleclick() && (OS::get_singleton()->get_ticks_msec() - last_dblclk) < 600 && cursor.line == prev_line) {
- //tripleclick select line
+
+ // Triple-click select line.
selection.selecting_mode = Selection::MODE_LINE;
_update_selection_mode_line();
last_dblclk = 0;
-
} else if (mb->is_doubleclick() && text[cursor.line].length()) {
- //doubleclick select word
+ // Double-click select word.
selection.selecting_mode = Selection::MODE_WORD;
_update_selection_mode_word();
last_dblclk = OS::get_singleton()->get_ticks_msec();
@@ -2086,7 +2352,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
int to_column = get_selection_to_column();
if (row < from_line || row > to_line || (row == from_line && col < from_column) || (row == to_line && col > to_column)) {
- // Right click is outside the selected text
+ // Right click is outside the selected text.
deselect();
}
}
@@ -2104,10 +2370,22 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
}
} else {
- if (mb->get_button_index() == BUTTON_LEFT)
+ if (mb->get_button_index() == BUTTON_LEFT) {
+ if (mb->get_command() && highlighted_word != String()) {
+ int row, col;
+ _get_mouse_pos(Point2i(mb->get_position().x, mb->get_position().y), row, col);
+
+ emit_signal("symbol_lookup", highlighted_word, row, col);
+ return;
+ }
+
+ dragging_minimap = false;
+ dragging_selection = false;
+ can_drag_minimap = false;
click_select_held->stop();
+ }
- // notify to show soft keyboard
+ // Notify to show soft keyboard.
notification(NOTIFICATION_FOCUS_ENTER);
}
}
@@ -2123,7 +2401,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
}
h_scroll->set_value(h_scroll->get_value() + pan_gesture->get_delta().x * 100);
if (v_scroll->get_value() != prev_v_scroll || h_scroll->get_value() != prev_h_scroll)
- accept_event(); //accept event if scroll changed
+ accept_event(); // Accept event if scroll changed.
return;
}
@@ -2148,34 +2426,40 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
}
}
- if (mm->get_button_mask() & BUTTON_MASK_LEFT && get_viewport()->gui_get_drag_data() == Variant()) { //ignore if dragging
+ if (mm->get_button_mask() & BUTTON_MASK_LEFT && get_viewport()->gui_get_drag_data() == Variant()) { // Ignore if dragging.
_reset_caret_blink_timer();
- switch (selection.selecting_mode) {
- case Selection::MODE_POINTER: {
- _update_selection_mode_pointer();
- } break;
- case Selection::MODE_WORD: {
- _update_selection_mode_word();
- } break;
- case Selection::MODE_LINE: {
- _update_selection_mode_line();
- } break;
- default: {
- break;
+ if (draw_minimap && !dragging_selection) {
+ _update_minimap_drag();
+ }
+
+ if (!dragging_minimap) {
+ switch (selection.selecting_mode) {
+ case Selection::MODE_POINTER: {
+ _update_selection_mode_pointer();
+ } break;
+ case Selection::MODE_WORD: {
+ _update_selection_mode_word();
+ } break;
+ case Selection::MODE_LINE: {
+ _update_selection_mode_line();
+ } break;
+ default: {
+ break;
+ }
}
}
}
}
if (v_scroll->get_value() != prev_v_scroll || h_scroll->get_value() != prev_h_scroll)
- accept_event(); //accept event if scroll changed
+ accept_event(); // Accept event if scroll changed.
Ref<InputEventKey> k = p_gui_input;
if (k.is_valid()) {
- k = k->duplicate(); //it will be modified later on
+ k = k->duplicate(); // It will be modified later on.
#ifdef OSX_ENABLED
if (k->get_scancode() == KEY_META) {
@@ -2311,11 +2595,11 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
_consume_pair_symbol(chr[0]);
} else {
- // remove the old character if in insert mode
+ // Remove the old character if in insert mode.
if (insert_mode) {
begin_complex_operation();
- // make sure we don't try and remove empty space
+ // Make sure we don't try and remove empty space.
if (cursor.column < get_line(cursor.line).length()) {
_remove_text(cursor.line, cursor.column, cursor.line, cursor.column + 1);
}
@@ -2337,9 +2621,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
_cancel_completion();
}
- /* TEST CONTROL FIRST!! */
+ /* TEST CONTROL FIRST! */
- // some remaps for duplicate functions..
+ // Some remaps for duplicate functions.
if (k->get_command() && !k->get_shift() && !k->get_alt() && !k->get_metakey() && k->get_scancode() == KEY_INSERT) {
k->set_scancode(KEY_C);
@@ -2383,10 +2667,10 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
_reset_caret_blink_timer();
- // save here for insert mode, just in case it is cleared in the following section
+ // Save here for insert mode, just in case it is cleared in the following section.
bool had_selection = selection.active;
- // stuff to do when selection is active..
+ // Stuff to do when selection is active.
if (!readonly && selection.active) {
bool clear = false;
@@ -2406,7 +2690,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
} break;
case KEY_X:
case KEY_C:
- //special keys often used with control, wait...
+ // Special keys often used with control, wait.
clear = (!k->get_command() || k->get_shift() || k->get_alt());
break;
case KEY_DELETE:
@@ -2431,7 +2715,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
case KEY_PAGEDOWN:
case KEY_HOME:
case KEY_END:
- // ignore arrows if any modifiers are held (shift = selecting, others may be used for editor hotkeys)
+ // Ignore arrows if any modifiers are held (shift = selecting, others may be used for editor hotkeys).
if (k->get_command() || k->get_shift() || k->get_alt())
break;
unselect = true;
@@ -2469,7 +2753,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
bool scancode_handled = true;
- // special scancode test...
+ // Special scancode test.
switch (k->get_scancode()) {
@@ -2481,7 +2765,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
String ins = "\n";
- //keep indentation
+ // Keep indentation.
int space_count = 0;
for (int i = 0; i < cursor.column; i++) {
if (text[cursor.line][i] == '\t') {
@@ -2512,10 +2796,10 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
bool brace_indent = false;
- // no need to indent if we are going upwards.
+ // No need to indent if we are going upwards.
if (auto_indent && !(k->get_command() && k->get_shift())) {
- // indent once again if previous line will end with ':' or '{' and the line is not a comment
- // (i.e. colon/brace precedes current cursor position)
+ // Indent once again if previous line will end with ':' or '{' and the line is not a comment
+ // (i.e. colon/brace precedes current cursor position).
if (cursor.column > 0 && (text[cursor.line][cursor.column - 1] == ':' || text[cursor.line][cursor.column - 1] == '{') && !is_line_comment(cursor.line)) {
if (indent_using_spaces) {
ins += space_indent;
@@ -2523,7 +2807,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
ins += "\t";
}
- // no need to move the brace below if we are not taking the text with us.
+ // No need to move the brace below if we are not taking the text with us.
if (text[cursor.line][cursor.column] == '}' && !k->get_command()) {
brace_indent = true;
ins += "\n" + ins.substr(1, ins.length() - 2);
@@ -2565,7 +2849,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
}
} break;
case KEY_TAB: {
- if (k->get_command()) break; // avoid tab when command
+ if (k->get_command()) break; // Avoid tab when command.
if (readonly)
break;
@@ -2579,7 +2863,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
} else {
if (k->get_shift()) {
- // simple unindent
+ // Simple unindent.
int cc = cursor.column;
const String &line = text[cursor.line];
@@ -2591,17 +2875,17 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
if (cc > 0 && cc <= text[cursor.line].length()) {
if (text[cursor.line][cc - 1] == '\t') {
- // tabs unindentation
+ // Tabs unindentation.
_remove_text(cursor.line, cc - 1, cursor.line, cc);
if (cursor.column >= left)
cursor_set_column(MAX(0, cursor.column - 1));
update();
} else {
- // spaces unindentation
+ // Spaces unindentation.
int spaces_to_remove = _calculate_spaces_till_next_left_indent(cc);
if (spaces_to_remove > 0) {
_remove_text(cursor.line, cc - spaces_to_remove, cursor.line, cc);
- if (cursor.column > left - spaces_to_remove) // inside text?
+ if (cursor.column > left - spaces_to_remove) // Inside text?
cursor_set_column(MAX(0, cursor.column - spaces_to_remove));
update();
}
@@ -2611,9 +2895,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
update();
}
} else {
- // simple indent
+ // Simple indent.
if (indent_using_spaces) {
- // insert only as much spaces as needed till next indentation level
+ // Insert only as much spaces as needed till next indentation level.
int spaces_to_add = _calculate_spaces_till_next_right_indent(cursor.column);
String indent_to_insert = String();
for (int i = 0; i < spaces_to_add; i++)
@@ -2641,20 +2925,20 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
int line = cursor.line;
int column = cursor.column;
- // check if we are removing a single whitespace, if so remove it and the next char type
- // else we just remove the whitespace
+ // Check if we are removing a single whitespace, if so remove it and the next char type,
+ // else we just remove the whitespace.
bool only_whitespace = false;
if (_is_whitespace(text[line][column - 1]) && _is_whitespace(text[line][column - 2])) {
only_whitespace = true;
} else if (_is_whitespace(text[line][column - 1])) {
- // remove the single whitespace
+ // Remove the single whitespace.
column--;
}
- // check if its a text char
+ // Check if its a text char.
bool only_char = (_is_text_char(text[line][column - 1]) && !only_whitespace);
- // if its not whitespace or char then symbol.
+ // If its not whitespace or char then symbol.
bool only_symbols = !(only_whitespace || only_char);
while (column > 0) {
@@ -2940,7 +3224,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
int curline_len = text[cursor.line].length();
if (cursor.line == text.size() - 1 && cursor.column == curline_len)
- break; //nothing to do
+ break; // Nothing to do.
int next_line = cursor.column < curline_len ? cursor.line : cursor.line + 1;
int next_column;
@@ -2957,20 +3241,20 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
int line = cursor.line;
int column = cursor.column;
- // check if we are removing a single whitespace, if so remove it and the next char type
- // else we just remove the whitespace
+ // Check if we are removing a single whitespace, if so remove it and the next char type,
+ // else we just remove the whitespace.
bool only_whitespace = false;
if (_is_whitespace(text[line][column]) && _is_whitespace(text[line][column + 1])) {
only_whitespace = true;
} else if (_is_whitespace(text[line][column])) {
- // remove the single whitespace
+ // Remove the single whitespace.
column++;
}
- // check if its a text char
+ // Check if its a text char.
bool only_char = (_is_text_char(text[line][column]) && !only_whitespace);
- // if its not whitespace or char then symbol.
+ // If its not whitespace or char then symbol.
bool only_symbols = !(only_whitespace || only_char);
while (column < curline_len) {
@@ -3029,7 +3313,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
cursor_set_column(0);
} else {
- // move cursor column to start of wrapped row and then to start of text
+ // Move cursor column to start of wrapped row and then to start of text.
Vector<String> rows = get_wrap_rows_text(cursor.line);
int wi = get_cursor_wrap_index();
int row_start_col = 0;
@@ -3037,7 +3321,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
row_start_col += rows[i].length();
}
if (cursor.column == row_start_col || wi == 0) {
- // compute whitespace symbols seq length
+ // Compute whitespace symbols seq length.
int current_line_whitespace_len = 0;
while (current_line_whitespace_len < text[cursor.line].length()) {
CharType c = text[cursor.line][current_line_whitespace_len];
@@ -3088,7 +3372,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
if (k->get_command())
cursor_set_line(get_last_unhidden_line(), true, false, 9999);
- // move cursor column to end of wrapped row and then to end of text
+ // Move cursor column to end of wrapped row and then to end of text.
Vector<String> rows = get_wrap_rows_text(cursor.line);
int wi = get_cursor_wrap_index();
int row_end_col = -1;
@@ -3241,6 +3525,10 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
} break;
case KEY_Z: {
+ if (readonly) {
+ break;
+ }
+
if (!k->get_command()) {
scancode_handled = false;
break;
@@ -3253,6 +3541,10 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
} break;
case KEY_Y: {
+ if (readonly) {
+ break;
+ }
+
if (!k->get_command()) {
scancode_handled = false;
break;
@@ -3274,7 +3566,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
} break;
case KEY_SPACE: {
#ifdef OSX_ENABLED
- if (completion_enabled && k->get_metakey()) { //cmd-space is spotlight shortcut in OSX
+ if (completion_enabled && k->get_metakey()) { // cmd-space is spotlight shortcut in OSX
#else
if (completion_enabled && k->get_command()) {
#endif
@@ -3302,18 +3594,18 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
return;
}
- if (!scancode_handled && !k->get_command()) { //for German kbds
+ if (!scancode_handled && !k->get_command()) { // For German keyboards.
if (k->get_unicode() >= 32) {
if (readonly)
return;
- // remove the old character if in insert mode and no selection
+ // Remove the old character if in insert mode and no selection.
if (insert_mode && !had_selection) {
begin_complex_operation();
- // make sure we don't try and remove empty space
+ // Make sure we don't try and remove empty space.
if (cursor.column < get_line(cursor.line).length()) {
_remove_text(cursor.line, cursor.column, cursor.line, cursor.column + 1);
}
@@ -3347,8 +3639,10 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
void TextEdit::_scroll_up(real_t p_delta) {
- if (scrolling && smooth_scroll_enabled && SGN(target_v_scroll - v_scroll->get_value()) != SGN(-p_delta))
+ if (scrolling && smooth_scroll_enabled && SGN(target_v_scroll - v_scroll->get_value()) != SGN(-p_delta)) {
scrolling = false;
+ minimap_clicked = false;
+ }
if (scrolling) {
target_v_scroll = (target_v_scroll - p_delta);
@@ -3373,8 +3667,10 @@ void TextEdit::_scroll_up(real_t p_delta) {
void TextEdit::_scroll_down(real_t p_delta) {
- if (scrolling && smooth_scroll_enabled && SGN(target_v_scroll - v_scroll->get_value()) != SGN(p_delta))
+ if (scrolling && smooth_scroll_enabled && SGN(target_v_scroll - v_scroll->get_value()) != SGN(p_delta)) {
scrolling = false;
+ minimap_clicked = false;
+ }
if (scrolling) {
target_v_scroll = (target_v_scroll + p_delta);
@@ -3423,11 +3719,12 @@ void TextEdit::_post_shift_selection() {
void TextEdit::_scroll_lines_up() {
scrolling = false;
+ minimap_clicked = false;
- // adjust the vertical scroll
+ // Adjust the vertical scroll.
set_v_scroll(get_v_scroll() - 1);
- // adjust the cursor to viewport
+ // Adjust the cursor to viewport.
if (!selection.active) {
int cur_line = cursor.line;
int cur_wrap = get_cursor_wrap_index();
@@ -3442,11 +3739,12 @@ void TextEdit::_scroll_lines_up() {
void TextEdit::_scroll_lines_down() {
scrolling = false;
+ minimap_clicked = false;
- // adjust the vertical scroll
+ // Adjust the vertical scroll.
set_v_scroll(get_v_scroll() + 1);
- // adjust the cursor to viewport
+ // Adjust the cursor to viewport.
if (!selection.active) {
int cur_line = cursor.line;
int cur_wrap = get_cursor_wrap_index();
@@ -3463,15 +3761,15 @@ void TextEdit::_scroll_lines_down() {
void TextEdit::_base_insert_text(int p_line, int p_char, const String &p_text, int &r_end_line, int &r_end_column) {
- //save for undo...
+ // Save for undo.
ERR_FAIL_INDEX(p_line, text.size());
ERR_FAIL_COND(p_char < 0);
- /* STEP 1 remove \r from source text and separate in substrings */
+ /* STEP 1: Remove \r from source text and separate in substrings. */
Vector<String> substrings = p_text.replace("\r", "").split("\n");
- /* STEP 2 fire breakpoint_toggled signals */
+ /* STEP 2: Fire breakpoint_toggled signals. */
// Is this just a new empty line?
bool shift_first_line = p_char == 0 && p_text.replace("\r", "") == "\n";
@@ -3487,19 +3785,19 @@ void TextEdit::_base_insert_text(int p_line, int p_char, const String &p_text, i
}
}
- /* STEP 3 add spaces if the char is greater than the end of the line */
+ /* STEP 3: Add spaces if the char is greater than the end of the line. */
while (p_char > text[p_line].length()) {
text.set(p_line, text[p_line] + String::chr(' '));
}
- /* STEP 4 separate dest string in pre and post text */
+ /* STEP 4: Separate dest string in pre and post text. */
String preinsert_text = text[p_line].substr(0, p_char);
String postinsert_text = text[p_line].substr(p_char, text[p_line].size());
for (int j = 0; j < substrings.size(); j++) {
- //insert the substrings
+ // Insert the substrings.
if (j == 0) {
@@ -3544,8 +3842,8 @@ String TextEdit::_base_get_text(int p_from_line, int p_from_column, int p_to_lin
ERR_FAIL_INDEX_V(p_from_column, text[p_from_line].length() + 1, String());
ERR_FAIL_INDEX_V(p_to_line, text.size(), String());
ERR_FAIL_INDEX_V(p_to_column, text[p_to_line].length() + 1, String());
- ERR_FAIL_COND_V(p_to_line < p_from_line, String()); // from > to
- ERR_FAIL_COND_V(p_to_line == p_from_line && p_to_column < p_from_column, String()); // from > to
+ ERR_FAIL_COND_V(p_to_line < p_from_line, String()); // 'from > to'.
+ ERR_FAIL_COND_V(p_to_line == p_from_line && p_to_column < p_from_column, String()); // 'from > to'.
String ret;
@@ -3568,8 +3866,8 @@ void TextEdit::_base_remove_text(int p_from_line, int p_from_column, int p_to_li
ERR_FAIL_INDEX(p_from_column, text[p_from_line].length() + 1);
ERR_FAIL_INDEX(p_to_line, text.size());
ERR_FAIL_INDEX(p_to_column, text[p_to_line].length() + 1);
- ERR_FAIL_COND(p_to_line < p_from_line); // from > to
- ERR_FAIL_COND(p_to_line == p_from_line && p_to_column < p_from_column); // from > to
+ ERR_FAIL_COND(p_to_line < p_from_line); // 'from > to'.
+ ERR_FAIL_COND(p_to_line == p_from_line && p_to_column < p_from_column); // 'from > to'.
String pre_text = text[p_from_line].substr(0, p_from_column);
String post_text = text[p_to_line].substr(p_to_column, text[p_to_line].length());
@@ -3631,22 +3929,22 @@ void TextEdit::_insert_text(int p_line, int p_char, const String &p_text, int *r
op.chain_forward = false;
op.chain_backward = false;
- //see if it should just be set as current op
+ // See if it should just be set as current op.
if (current_op.type != op.type) {
op.prev_version = get_version();
_push_current_op();
current_op = op;
- return; //set as current op, return
+ return; // Set as current op, return.
}
- //see if it can be merged
+ // See if it can be merged.
if (current_op.to_line != p_line || current_op.to_column != p_char) {
op.prev_version = get_version();
_push_current_op();
current_op = op;
- return; //set as current op, return
+ return; // Set as current op, return.
}
- //merge current op
+ // Merge current op.
current_op.text += p_text;
current_op.to_column = retchar;
@@ -3670,7 +3968,7 @@ void TextEdit::_remove_text(int p_from_line, int p_from_column, int p_to_line, i
if (!undo_enabled)
return;
- /* UNDO!! */
+ /* UNDO! */
TextOperation op;
op.type = TextOperation::TYPE_REMOVE;
op.from_line = p_from_line;
@@ -3682,27 +3980,20 @@ void TextEdit::_remove_text(int p_from_line, int p_from_column, int p_to_line, i
op.chain_forward = false;
op.chain_backward = false;
- //see if it should just be set as current op
+ // See if it should just be set as current op.
if (current_op.type != op.type) {
op.prev_version = get_version();
_push_current_op();
current_op = op;
- return; //set as current op, return
+ return; // Set as current op, return.
}
- //see if it can be merged
+ // See if it can be merged.
if (current_op.from_line == p_to_line && current_op.from_column == p_to_column) {
- //basckace or similar
+ // Backspace or similar.
current_op.text = text + current_op.text;
current_op.from_line = p_from_line;
current_op.from_column = p_from_column;
- return; //update current op
- }
- if (current_op.from_line == p_from_line && current_op.from_column == p_from_column) {
-
- //current_op.text=text+current_op.text;
- //current_op.from_line=p_from_line;
- //current_op.from_column=p_from_column;
- //return; //update current op
+ return; // Update current op.
}
op.prev_version = get_version();
@@ -3725,6 +4016,15 @@ void TextEdit::_line_edited_from(int p_line) {
for (int i = p_line; i < cache_size; i++) {
color_region_cache.erase(i);
}
+
+ if (syntax_highlighting_cache.size() > 0) {
+ cache_size = syntax_highlighting_cache.back()->key();
+ for (int i = p_line - 1; i <= cache_size; i++) {
+ if (syntax_highlighting_cache.has(i)) {
+ syntax_highlighting_cache.erase(i);
+ }
+ }
+ }
}
int TextEdit::get_char_count() {
@@ -3734,11 +4034,11 @@ int TextEdit::get_char_count() {
for (int i = 0; i < text.size(); i++) {
if (i > 0)
- totalsize++; // incliude \n
+ totalsize++; // Include \n.
totalsize += text[i].length();
}
- return totalsize; // omit last \n
+ return totalsize; // Omit last \n.
}
Size2 TextEdit::get_minimum_size() const {
@@ -3746,19 +4046,26 @@ Size2 TextEdit::get_minimum_size() const {
return cache.style_normal->get_minimum_size();
}
+int TextEdit::_get_control_height() const {
+ int control_height = get_size().height;
+ control_height -= cache.style_normal->get_minimum_size().height;
+ if (h_scroll->is_visible_in_tree()) {
+ control_height -= h_scroll->get_size().height;
+ }
+ return control_height;
+}
+
int TextEdit::get_visible_rows() const {
+ return _get_control_height() / get_row_height();
+}
- int total = get_size().height;
- total -= cache.style_normal->get_minimum_size().height;
- if (h_scroll->is_visible_in_tree())
- total -= h_scroll->get_size().height;
- total /= get_row_height();
- return total;
+int TextEdit::_get_minimap_visible_rows() const {
+ return _get_control_height() / (minimap_char_size.y + minimap_line_spacing);
}
int TextEdit::get_total_visible_rows() const {
- // returns the total amount of rows we need in the editor.
+ // Returns the total amount of rows we need in the editor.
// This skips hidden lines and counts each wrapping of a line.
if (!is_hiding_enabled() && !is_wrap_enabled())
return text.size();
@@ -3775,12 +4082,12 @@ int TextEdit::get_total_visible_rows() const {
void TextEdit::_update_wrap_at() {
- wrap_at = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - cache.info_gutter_width - wrap_right_offset;
+ wrap_at = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - cache.info_gutter_width - cache.minimap_width - wrap_right_offset;
update_cursor_wrap_offset();
text.clear_wrap_cache();
for (int i = 0; i < text.size(); i++) {
- // update all values that wrap
+ // Update all values that wrap.
if (!line_wraps(i))
continue;
Vector<String> rows = get_wrap_rows_text(i);
@@ -3790,8 +4097,9 @@ void TextEdit::_update_wrap_at() {
void TextEdit::adjust_viewport_to_cursor() {
- // make sure cursor is visible on the screen
+ // Make sure cursor is visible on the screen.
scrolling = false;
+ minimap_clicked = false;
int cur_line = cursor.line;
int cur_wrap = get_cursor_wrap_index();
@@ -3802,20 +4110,20 @@ void TextEdit::adjust_viewport_to_cursor() {
int last_vis_wrap = get_last_visible_line_wrap_index();
if (cur_line < first_vis_line || (cur_line == first_vis_line && cur_wrap < first_vis_wrap)) {
- // cursor is above screen
+ // Cursor is above screen.
set_line_as_first_visible(cur_line, cur_wrap);
} else if (cur_line > last_vis_line || (cur_line == last_vis_line && cur_wrap > last_vis_wrap)) {
- // cursor is below screen
+ // Cursor is below screen.
set_line_as_last_visible(cur_line, cur_wrap);
}
- int visible_width = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - cache.info_gutter_width;
+ int visible_width = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - cache.info_gutter_width - cache.minimap_width;
if (v_scroll->is_visible_in_tree())
visible_width -= v_scroll->get_combined_minimum_size().width;
- visible_width -= 20; // give it a little more space
+ visible_width -= 20; // Give it a little more space.
if (!is_wrap_enabled()) {
- // adjust x offset
+ // Adjust x offset.
int cursor_x = get_column_x_offset(cursor.column, text[cursor.line]);
if (cursor_x > (cursor.x_ofs + visible_width))
@@ -3833,20 +4141,21 @@ void TextEdit::adjust_viewport_to_cursor() {
void TextEdit::center_viewport_to_cursor() {
- // move viewport so the cursor is in the center of the screen
+ // Move viewport so the cursor is in the center of the screen.
scrolling = false;
+ minimap_clicked = false;
if (is_line_hidden(cursor.line))
unfold_line(cursor.line);
set_line_as_center_visible(cursor.line, get_cursor_wrap_index());
- int visible_width = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - cache.info_gutter_width;
+ int visible_width = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - cache.info_gutter_width - cache.minimap_width;
if (v_scroll->is_visible_in_tree())
visible_width -= v_scroll->get_combined_minimum_size().width;
- visible_width -= 20; // give it a little more space
+ visible_width -= 20; // Give it a little more space.
if (is_wrap_enabled()) {
- // center x offset
+ // Center x offset.
int cursor_x = get_column_x_offset_for_line(cursor.column, cursor.line);
if (cursor_x > (cursor.x_ofs + visible_width))
@@ -3888,7 +4197,7 @@ int TextEdit::times_line_wraps(int line) const {
int wrap_amount = text.get_line_wrap_amount(line);
if (wrap_amount == -1) {
- // update the value
+ // Update the value.
Vector<String> rows = get_wrap_rows_text(line);
wrap_amount = rows.size() - 1;
text.set_line_wrap_amount(line, wrap_amount);
@@ -3928,7 +4237,7 @@ Vector<String> TextEdit::get_wrap_rows_text(int p_line) const {
int indent_ofs = (cur_wrap_index != 0 ? tab_offset_px : 0);
if (indent_ofs + word_px + w > wrap_at) {
- // not enough space to add this char; start next line
+ // Not enough space to add this char; start next line.
wrap_substring += word_str;
lines.push_back(wrap_substring);
cur_wrap_index++;
@@ -3942,7 +4251,7 @@ Vector<String> TextEdit::get_wrap_rows_text(int p_line) const {
word_str += c;
word_px += w;
if (c == ' ') {
- // end of a word; add this word to the substring
+ // End of a word; add this word to the substring.
wrap_substring += word_str;
px += word_px;
word_str = "";
@@ -3950,9 +4259,9 @@ Vector<String> TextEdit::get_wrap_rows_text(int p_line) const {
}
if (indent_ofs + px + word_px > wrap_at) {
- // this word will be moved to the next line
+ // This word will be moved to the next line.
lines.push_back(wrap_substring);
- // reset for next wrap
+ // Reset for next wrap.
cur_wrap_index++;
wrap_substring = "";
px = 0;
@@ -3960,11 +4269,11 @@ Vector<String> TextEdit::get_wrap_rows_text(int p_line) const {
}
col++;
}
- // line ends before hit wrap_at; add this word to the substring
+ // Line ends before hit wrap_at; add this word to the substring.
wrap_substring += word_str;
lines.push_back(wrap_substring);
- // update cache
+ // Update cache.
text.set_line_wrap_amount(p_line, lines.size() - 1);
return lines;
@@ -3982,7 +4291,7 @@ int TextEdit::get_line_wrap_index_at_col(int p_line, int p_column) const {
if (!line_wraps(p_line))
return 0;
- // loop through wraps in the line text until we get to the column
+ // Loop through wraps in the line text until we get to the column.
int wrap_index = 0;
int col = 0;
Vector<String> rows = get_wrap_rows_text(p_line);
@@ -4123,6 +4432,7 @@ bool TextEdit::is_right_click_moving_caret() const {
void TextEdit::_v_scroll_input() {
scrolling = false;
+ minimap_clicked = false;
}
void TextEdit::_scroll_moved(double p_to_val) {
@@ -4134,7 +4444,7 @@ void TextEdit::_scroll_moved(double p_to_val) {
cursor.x_ofs = h_scroll->get_value();
if (v_scroll->is_visible_in_tree()) {
- // set line ofs and wrap ofs
+ // Set line ofs and wrap ofs.
int v_scroll_i = floor(get_v_scroll());
int sc = 0;
int n_line;
@@ -4289,12 +4599,12 @@ Control::CursorShape TextEdit::get_cursor_shape(const Point2 &p_pos) const {
_get_mouse_pos(p_pos, row, col);
int left_margin = cache.style_normal->get_margin(MARGIN_LEFT);
- // breakpoint icon
+ // Breakpoint icon.
if (draw_breakpoint_gutter && p_pos.x > left_margin - 6 && p_pos.x <= left_margin + cache.breakpoint_gutter_width - 3) {
return CURSOR_POINTING_HAND;
}
- // info icons
+ // Info icons.
int gutter_left = left_margin + cache.breakpoint_gutter_width + cache.info_gutter_width;
if (draw_info_gutter && p_pos.x > left_margin + cache.breakpoint_gutter_width - 6 && p_pos.x <= gutter_left - 3) {
if (text.has_info_icon(row)) {
@@ -4303,7 +4613,7 @@ Control::CursorShape TextEdit::get_cursor_shape(const Point2 &p_pos) const {
return CURSOR_ARROW;
}
- // fold icon
+ // Fold icon.
if (draw_fold_gutter && p_pos.x > gutter_left + cache.line_number_w - 6 && p_pos.x <= gutter_left + cache.line_number_w + cache.fold_gutter_width - 3) {
if (is_folded(row) || can_fold(row))
return CURSOR_POINTING_HAND;
@@ -4313,9 +4623,14 @@ Control::CursorShape TextEdit::get_cursor_shape(const Point2 &p_pos) const {
return CURSOR_ARROW;
} else {
+ int xmargin_end = get_size().width - cache.style_normal->get_margin(MARGIN_RIGHT);
+ if (draw_minimap && p_pos.x > xmargin_end - minimap_width && p_pos.x <= xmargin_end) {
+ return CURSOR_ARROW;
+ }
+
int row, col;
_get_mouse_pos(p_pos, row, col);
- // eol fold icon
+ // EOL fold icon.
if (is_folded(row)) {
int line_width = text.get_line_width(row);
line_width += cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.fold_gutter_width + cache.info_gutter_width - cursor.x_ofs;
@@ -4349,8 +4664,6 @@ void TextEdit::set_text(String p_text) {
update();
setting_text = false;
-
- //get_range()->set(0);
};
String TextEdit::get_text() {
@@ -4377,7 +4690,7 @@ String TextEdit::get_text_for_lookup_completion() {
if (i == row) {
longthing += text[i].substr(0, col);
- longthing += String::chr(0xFFFF); //not unicode, represents the cursor
+ longthing += String::chr(0xFFFF); // Not unicode, represents the cursor.
longthing += text[i].substr(col, text[i].size());
} else {
@@ -4399,7 +4712,7 @@ String TextEdit::get_text_for_completion() {
if (i == cursor.line) {
longthing += text[i].substr(0, cursor.column);
- longthing += String::chr(0xFFFF); //not unicode, represents the cursor
+ longthing += String::chr(0xFFFF); // Not unicode, represents the cursor.
longthing += text[i].substr(cursor.column, text[i].size());
} else {
@@ -4450,18 +4763,28 @@ void TextEdit::set_readonly(bool p_readonly) {
// Reorganize context menu.
menu->clear();
- if (!readonly)
+
+ if (!readonly) {
+ menu->add_item(RTR("Undo"), MENU_UNDO, KEY_MASK_CMD | KEY_Z);
+ menu->add_item(RTR("Redo"), MENU_REDO, KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_Z);
+ }
+
+ if (!readonly) {
+ menu->add_separator();
menu->add_item(RTR("Cut"), MENU_CUT, KEY_MASK_CMD | KEY_X);
+ }
+
menu->add_item(RTR("Copy"), MENU_COPY, KEY_MASK_CMD | KEY_C);
- if (!readonly)
+
+ if (!readonly) {
menu->add_item(RTR("Paste"), MENU_PASTE, KEY_MASK_CMD | KEY_V);
+ }
+
menu->add_separator();
menu->add_item(RTR("Select All"), MENU_SELECT_ALL, KEY_MASK_CMD | KEY_A);
+
if (!readonly) {
menu->add_item(RTR("Clear"), MENU_CLEAR);
- menu->add_separator();
- menu->add_item(RTR("Undo"), MENU_UNDO, KEY_MASK_CMD | KEY_Z);
- menu->add_item(RTR("Redo"), MENU_REDO, KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_Z);
}
update();
@@ -4572,17 +4895,18 @@ void TextEdit::_set_syntax_highlighting(SyntaxHighlighter *p_syntax_highlighter)
syntax_highlighter->set_text_editor(this);
syntax_highlighter->_update_cache();
}
+ syntax_highlighting_cache.clear();
update();
}
int TextEdit::_is_line_in_region(int p_line) {
- // do we have in cache?
+ // Do we have in cache?
if (color_region_cache.has(p_line)) {
return color_region_cache[p_line];
}
- // if not find the closest line we have
+ // If not find the closest line we have.
int previous_line = p_line - 1;
for (; previous_line > -1; previous_line--) {
if (color_region_cache.has(p_line)) {
@@ -4590,7 +4914,7 @@ int TextEdit::_is_line_in_region(int p_line) {
}
}
- // calculate up to line we need and update the cache along the way.
+ // Calculate up to line we need and update the cache along the way.
int in_region = color_region_cache[previous_line];
if (previous_line == -1) {
in_region = -1;
@@ -4638,6 +4962,7 @@ void TextEdit::clear_colors() {
keywords.clear();
color_regions.clear();
color_region_cache.clear();
+ syntax_highlighting_cache.clear();
text.clear_width_cache();
}
@@ -4718,7 +5043,7 @@ void TextEdit::cut() {
OS::get_singleton()->set_clipboard(clipboard);
_remove_text(selection.from_line, selection.from_column, selection.to_line, selection.to_column);
- cursor_set_line(selection.from_line); // set afterwards else it causes the view to be offset
+ cursor_set_line(selection.from_line); // Set afterwards else it causes the view to be offset.
cursor_set_column(selection.from_column);
selection.active = false;
@@ -4947,7 +5272,7 @@ int TextEdit::_get_column_pos_of_word(const String &p_key, const String &p_searc
col = p_search.findn(p_key, p_from_column);
}
- // whole words only
+ // Whole words only.
if (col != -1 && p_search_flags & SEARCH_WHOLE_WORDS) {
p_from_column = col;
@@ -4987,14 +5312,12 @@ bool TextEdit::search(const String &p_key, uint32_t p_search_flags, int p_from_l
ERR_FAIL_INDEX_V(p_from_line, text.size(), false);
ERR_FAIL_INDEX_V(p_from_column, text[p_from_line].length() + 1, false);
- //search through the whole document, but start by current line
+ // Search through the whole document, but start by current line.
int line = p_from_line;
int pos = -1;
for (int i = 0; i < text.size() + 1; i++) {
- //backwards is broken...
- //int idx=(p_search_flags&SEARCH_BACKWARDS)?(text.size()-i):i; //do backwards seearch
if (line < 0) {
line = text.size() - 1;
@@ -5008,7 +5331,7 @@ bool TextEdit::search(const String &p_key, uint32_t p_search_flags, int p_from_l
if (line == p_from_line) {
if (i == text.size()) {
- //wrapped
+ // Wrapped.
if (p_search_flags & SEARCH_BACKWARDS) {
from_column = text_line.length();
@@ -5042,6 +5365,9 @@ bool TextEdit::search(const String &p_key, uint32_t p_search_flags, int p_from_l
break;
}
pos_from = last_pos - p_key.length();
+ if (pos_from < 0) {
+ break;
+ }
}
} else {
while ((last_pos = (p_search_flags & SEARCH_MATCH_CASE) ? text_line.find(p_key, pos_from) : text_line.findn(p_key, pos_from)) != -1) {
@@ -5056,7 +5382,7 @@ bool TextEdit::search(const String &p_key, uint32_t p_search_flags, int p_from_l
bool is_match = true;
if (pos != -1 && (p_search_flags & SEARCH_WHOLE_WORDS)) {
- //validate for whole words
+ // Validate for whole words.
if (pos > 0 && _is_text_char(text_line[pos - 1]))
is_match = false;
else if (pos + p_key.length() < text_line.length() && _is_text_char(text_line[pos + p_key.length()]))
@@ -5254,7 +5580,7 @@ void TextEdit::unhide_all_lines() {
int TextEdit::num_lines_from(int p_line_from, int visible_amount) const {
- // returns the number of lines (hidden and unhidden) from p_line_from to (p_line_from + visible_amount of unhidden lines)
+ // Returns the number of lines (hidden and unhidden) from p_line_from to (p_line_from + visible_amount of unhidden lines).
ERR_FAIL_INDEX_V(p_line_from, text.size(), ABS(visible_amount));
if (!is_hiding_enabled())
@@ -5287,8 +5613,8 @@ int TextEdit::num_lines_from(int p_line_from, int visible_amount) const {
int TextEdit::num_lines_from_rows(int p_line_from, int p_wrap_index_from, int visible_amount, int &wrap_index) const {
- // returns the number of lines (hidden and unhidden) from (p_line_from + p_wrap_index_from) row to (p_line_from + visible_amount of unhidden and wrapped rows)
- // wrap index is set to the wrap index of the last line
+ // Returns the number of lines (hidden and unhidden) from (p_line_from + p_wrap_index_from) row to (p_line_from + visible_amount of unhidden and wrapped rows).
+ // Wrap index is set to the wrap index of the last line.
wrap_index = 0;
ERR_FAIL_INDEX_V(p_line_from, text.size(), ABS(visible_amount));
@@ -5334,7 +5660,7 @@ int TextEdit::num_lines_from_rows(int p_line_from, int p_wrap_index_from, int vi
int TextEdit::get_last_unhidden_line() const {
- // returns the last line in the text that is not hidden
+ // Returns the last line in the text that is not hidden.
if (!is_hiding_enabled())
return text.size() - 1;
@@ -5351,7 +5677,7 @@ int TextEdit::get_indent_level(int p_line) const {
ERR_FAIL_INDEX_V(p_line, text.size(), 0);
- // counts number of tabs and spaces before line starts
+ // Counts number of tabs and spaces before line starts.
int tab_count = 0;
int whitespace_count = 0;
int line_length = text[p_line].size();
@@ -5369,7 +5695,7 @@ int TextEdit::get_indent_level(int p_line) const {
bool TextEdit::is_line_comment(int p_line) const {
- // checks to see if this line is the start of a comment
+ // Checks to see if this line is the start of a comment.
ERR_FAIL_INDEX_V(p_line, text.size(), false);
const Map<int, Text::ColorRegionInfo> &cri_map = text.get_color_region_info(p_line);
@@ -5449,7 +5775,7 @@ void TextEdit::fold_line(int p_line) {
if (!can_fold(p_line))
return;
- // hide lines below this one
+ // Hide lines below this one.
int start_indent = get_indent_level(p_line);
int last_line = start_indent;
for (int i = p_line + 1; i < text.size(); i++) {
@@ -5467,7 +5793,7 @@ void TextEdit::fold_line(int p_line) {
set_line_as_hidden(i, true);
}
- // fix selection
+ // Fix selection.
if (is_selection_active()) {
if (is_line_hidden(selection.from_line) && is_line_hidden(selection.to_line)) {
deselect();
@@ -5478,7 +5804,7 @@ void TextEdit::fold_line(int p_line) {
}
}
- // reset cursor
+ // Reset cursor.
if (is_line_hidden(cursor.line)) {
cursor_set_line(p_line, false, false);
cursor_set_column(get_line(p_line).length(), false);
@@ -5539,8 +5865,8 @@ void TextEdit::_do_text_op(const TextOperation &p_op, bool p_reverse) {
int check_line;
int check_column;
_base_insert_text(p_op.from_line, p_op.from_column, p_op.text, check_line, check_column);
- ERR_FAIL_COND(check_line != p_op.to_line); // BUG
- ERR_FAIL_COND(check_column != p_op.to_column); // BUG
+ ERR_FAIL_COND(check_line != p_op.to_line); // BUG.
+ ERR_FAIL_COND(check_column != p_op.to_column); // BUG.
} else {
_base_remove_text(p_op.from_line, p_op.from_column, p_op.to_line, p_op.to_column);
@@ -5550,7 +5876,7 @@ void TextEdit::_do_text_op(const TextOperation &p_op, bool p_reverse) {
void TextEdit::_clear_redo() {
if (undo_stack_pos == NULL)
- return; //nothing to clear
+ return; // Nothing to clear.
_push_current_op();
@@ -5568,12 +5894,12 @@ void TextEdit::undo() {
if (undo_stack_pos == NULL) {
if (!undo_stack.size())
- return; //nothing to undo
+ return; // Nothing to undo.
undo_stack_pos = undo_stack.back();
} else if (undo_stack_pos == undo_stack.front())
- return; // at the bottom of the undo stack
+ return; // At the bottom of the undo stack.
else
undo_stack_pos = undo_stack_pos->prev();
@@ -5614,7 +5940,7 @@ void TextEdit::redo() {
_push_current_op();
if (undo_stack_pos == NULL)
- return; //nothing to do.
+ return; // Nothing to do.
deselect();
@@ -5668,7 +5994,7 @@ void TextEdit::end_complex_operation() {
void TextEdit::_push_current_op() {
if (current_op.type == TextOperation::TYPE_NONE)
- return; // do nothing
+ return; // Nothing to do.
if (next_operation_is_complex) {
current_op.chain_forward = true;
@@ -5768,7 +6094,7 @@ double TextEdit::get_scroll_pos_for_line(int p_line, int p_wrap_index) const {
if (!is_wrap_enabled() && !is_hiding_enabled())
return p_line;
- // count the number of visible lines up to this line
+ // Count the number of visible lines up to this line.
double new_line_scroll_pos = 0;
int to = CLAMP(p_line, 0, text.size() - 1);
for (int i = 0; i < to; i++) {
@@ -5828,10 +6154,7 @@ int TextEdit::get_last_visible_line_wrap_index() const {
double TextEdit::get_visible_rows_offset() const {
- double total = get_size().height;
- total -= cache.style_normal->get_minimum_size().height;
- if (h_scroll->is_visible_in_tree())
- total -= h_scroll->get_size().height;
+ double total = _get_control_height();
total /= (double)get_row_height();
total = total - floor(total);
total = -CLAMP(total, 0.001, 1) + 1;
@@ -5969,7 +6292,7 @@ void TextEdit::_update_completion_candidates() {
String s;
- //look for keywords first
+ // Look for keywords first.
bool inquote = false;
int first_quote = -1;
@@ -5994,7 +6317,7 @@ void TextEdit::_update_completion_candidates() {
bool cancel = false;
if (!inquote && first_quote == cofs - 1) {
- //no completion here
+ // No completion here.
cancel = true;
} else if (inquote && first_quote != -1) {
@@ -6032,11 +6355,12 @@ void TextEdit::_update_completion_candidates() {
bool prev_is_prefix = false;
if (cofs > 0 && completion_prefixes.has(String::chr(l[cofs - 1])))
prev_is_prefix = true;
- if (cofs > 1 && l[cofs - 1] == ' ' && completion_prefixes.has(String::chr(l[cofs - 2]))) //check with one space before prefix, to allow indent
+ // Check with one space before prefix, to allow indent.
+ if (cofs > 1 && l[cofs - 1] == ' ' && completion_prefixes.has(String::chr(l[cofs - 2])))
prev_is_prefix = true;
if (cancel || (!pre_keyword && s == "" && (cofs == 0 || !prev_is_prefix))) {
- //none to complete, cancel
+ // None to complete, cancel.
_cancel_completion();
return;
}
@@ -6086,18 +6410,18 @@ void TextEdit::_update_completion_candidates() {
}
if (completion_options.size() == 0) {
- //no options to complete, cancel
+ // No options to complete, cancel.
_cancel_completion();
return;
}
if (completion_options.size() == 1 && s == completion_options[0].display) {
- // A perfect match, stop completion
+ // A perfect match, stop completion.
_cancel_completion();
return;
}
- // The top of the list is the best match
+ // The top of the list is the best match.
completion_current = completion_options[0];
completion_enabled = true;
}
@@ -6116,10 +6440,30 @@ void TextEdit::query_code_comple() {
c--;
}
- if (ofs > 0 && (inquote || _is_completable(l[ofs - 1]) || completion_prefixes.has(String::chr(l[ofs - 1]))))
- emit_signal("request_completion");
- else if (ofs > 1 && l[ofs - 1] == ' ' && completion_prefixes.has(String::chr(l[ofs - 2]))) //make it work with a space too, it's good enough
- emit_signal("request_completion");
+ bool ignored = completion_active && !completion_options.empty();
+ if (ignored) {
+ ScriptCodeCompletionOption::Kind kind = ScriptCodeCompletionOption::KIND_PLAIN_TEXT;
+ const ScriptCodeCompletionOption *previous_option = NULL;
+ for (int i = 0; i < completion_options.size(); i++) {
+ const ScriptCodeCompletionOption &current_option = completion_options[i];
+ if (!previous_option) {
+ previous_option = &current_option;
+ kind = current_option.kind;
+ }
+ if (previous_option->kind != current_option.kind) {
+ ignored = false;
+ break;
+ }
+ }
+ ignored = ignored && (kind == ScriptCodeCompletionOption::KIND_FILE_PATH || kind == ScriptCodeCompletionOption::KIND_NODE_PATH || kind == ScriptCodeCompletionOption::KIND_SIGNAL);
+ }
+
+ if (!ignored) {
+ if (ofs > 0 && (inquote || _is_completable(l[ofs - 1]) || completion_prefixes.has(String::chr(l[ofs - 1]))))
+ emit_signal("request_completion");
+ else if (ofs > 1 && l[ofs - 1] == ' ' && completion_prefixes.has(String::chr(l[ofs - 2]))) // Make it work with a space too, it's good enough.
+ emit_signal("request_completion");
+ }
}
void TextEdit::set_code_hint(const String &p_hint) {
@@ -6220,9 +6564,21 @@ void TextEdit::set_line(int line, String new_text) {
}
void TextEdit::insert_at(const String &p_text, int at) {
- cursor_set_column(0);
- cursor_set_line(at, false, true);
_insert_text(at, 0, p_text + "\n");
+ if (cursor.line >= at) {
+ // offset cursor when located after inserted line
+ ++cursor.line;
+ }
+ if (is_selection_active()) {
+ if (selection.from_line >= at) {
+ // offset selection when located after inserted line
+ ++selection.from_line;
+ ++selection.to_line;
+ } else if (selection.to_line >= at) {
+ // extend selection that includes inserted line
+ ++selection.to_line;
+ }
+ }
}
void TextEdit::set_show_line_numbers(bool p_show) {
@@ -6314,6 +6670,24 @@ int TextEdit::get_info_gutter_width() const {
return info_gutter_width;
}
+void TextEdit::set_draw_minimap(bool p_draw) {
+ draw_minimap = p_draw;
+ update();
+}
+
+bool TextEdit::is_drawing_minimap() const {
+ return draw_minimap;
+}
+
+void TextEdit::set_minimap_width(int p_minimap_width) {
+ minimap_width = p_minimap_width;
+ update();
+}
+
+int TextEdit::get_minimap_width() const {
+ return minimap_width;
+}
+
void TextEdit::set_hiding_enabled(bool p_enabled) {
if (!p_enabled)
unhide_all_lines();
@@ -6443,8 +6817,6 @@ void TextEdit::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_wrap_enabled", "enable"), &TextEdit::set_wrap_enabled);
ClassDB::bind_method(D_METHOD("is_wrap_enabled"), &TextEdit::is_wrap_enabled);
- // ClassDB::bind_method(D_METHOD("set_max_chars", "amount"), &TextEdit::set_max_chars);
- // ClassDB::bind_method(D_METHOD("get_max_char"), &TextEdit::get_max_chars);
ClassDB::bind_method(D_METHOD("set_context_menu_enabled", "enable"), &TextEdit::set_context_menu_enabled);
ClassDB::bind_method(D_METHOD("is_context_menu_enabled"), &TextEdit::is_context_menu_enabled);
@@ -6520,6 +6892,11 @@ void TextEdit::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_breakpoints"), &TextEdit::get_breakpoints_array);
ClassDB::bind_method(D_METHOD("remove_breakpoints"), &TextEdit::remove_breakpoints);
+ ClassDB::bind_method(D_METHOD("draw_minimap", "draw"), &TextEdit::set_draw_minimap);
+ ClassDB::bind_method(D_METHOD("is_drawing_minimap"), &TextEdit::is_drawing_minimap);
+ ClassDB::bind_method(D_METHOD("set_minimap_width", "width"), &TextEdit::set_minimap_width);
+ ClassDB::bind_method(D_METHOD("get_minimap_width"), &TextEdit::get_minimap_width);
+
ADD_PROPERTY(PropertyInfo(Variant::STRING, "text", PROPERTY_HINT_MULTILINE_TEXT), "set_text", "get_text");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "readonly"), "set_readonly", "is_readonly");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "highlight_current_line"), "set_highlight_current_line", "is_highlight_current_line_enabled");
@@ -6536,7 +6913,10 @@ void TextEdit::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::REAL, "v_scroll_speed"), "set_v_scroll_speed", "get_v_scroll_speed");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "hiding_enabled"), "set_hiding_enabled", "is_hiding_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "wrap_enabled"), "set_wrap_enabled", "is_wrap_enabled");
- // ADD_PROPERTY(PropertyInfo(Variant::BOOL, "max_chars"), "set_max_chars", "get_max_chars");
+
+ ADD_GROUP("Minimap", "minimap_");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "minimap_draw"), "draw_minimap", "is_drawing_minimap");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "minimap_width"), "set_minimap_width", "get_minimap_width");
ADD_GROUP("Caret", "caret_");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "caret_block_mode"), "cursor_set_block_mode", "cursor_is_block_mode");
@@ -6561,7 +6941,7 @@ void TextEdit::_bind_methods() {
BIND_ENUM_CONSTANT(MENU_MAX);
GLOBAL_DEF("gui/timers/text_edit_idle_detect_sec", 3);
- ProjectSettings::get_singleton()->set_custom_property_info("gui/timers/text_edit_idle_detect_sec", PropertyInfo(Variant::REAL, "gui/timers/text_edit_idle_detect_sec", PROPERTY_HINT_RANGE, "0,10,0.01,or_greater")); // No negative numbers
+ ProjectSettings::get_singleton()->set_custom_property_info("gui/timers/text_edit_idle_detect_sec", PropertyInfo(Variant::REAL, "gui/timers/text_edit_idle_detect_sec", PROPERTY_HINT_RANGE, "0,10,0.01,or_greater")); // No negative numbers.
}
TextEdit::TextEdit() {
@@ -6592,8 +6972,6 @@ TextEdit::TextEdit() {
indent_size = 4;
text.set_indent_size(indent_size);
text.clear();
- //text.insert(1,"Mongolia...");
- //text.insert(2,"PAIS GENEROSO!!");
text.set_color_regions(&color_regions);
h_scroll = memnew(HScrollBar);
@@ -6676,13 +7054,23 @@ TextEdit::TextEdit() {
select_identifiers_enabled = false;
smooth_scroll_enabled = false;
scrolling = false;
+ minimap_clicked = false;
+ dragging_minimap = false;
+ can_drag_minimap = false;
+ minimap_scroll_ratio = 0;
+ minimap_scroll_click_pos = 0;
+ dragging_selection = false;
target_v_scroll = 0;
v_scroll_speed = 80;
+ draw_minimap = false;
+ minimap_width = 80;
+ minimap_char_size = Point2(1, 2);
+ minimap_line_spacing = 1;
context_menu_enabled = true;
menu = memnew(PopupMenu);
add_child(menu);
- readonly = true; // initialise to opposite first, so we get past the early-out in set_readonly
+ readonly = true; // Initialise to opposite first, so we get past the early-out in set_readonly.
set_readonly(false);
menu->connect("id_pressed", this, "menu_option");
first_draw = true;
@@ -6696,8 +7084,14 @@ TextEdit::~TextEdit() {
///////////////////////////////////////////////////////////////////////////////
Map<int, TextEdit::HighlighterInfo> TextEdit::_get_line_syntax_highlighting(int p_line) {
+ if (syntax_highlighting_cache.has(p_line)) {
+ return syntax_highlighting_cache[p_line];
+ }
+
if (syntax_highlighter != NULL) {
- return syntax_highlighter->_get_line_syntax_highlighting(p_line);
+ Map<int, HighlighterInfo> color_map = syntax_highlighter->_get_line_syntax_highlighting(p_line);
+ syntax_highlighting_cache[p_line] = color_map;
+ return color_map;
}
Map<int, HighlighterInfo> color_map;
@@ -6743,14 +7137,14 @@ Map<int, TextEdit::HighlighterInfo> TextEdit::_get_line_syntax_highlighting(int
bool is_symbol = _is_symbol(str[j]);
bool is_number = _is_number(str[j]);
- // allow ABCDEF in hex notation
+ // Allow ABCDEF in hex notation.
if (is_hex_notation && (_is_hex_symbol(str[j]) || is_number)) {
is_number = true;
} else {
is_hex_notation = false;
}
- // check for dot or underscore or 'x' for hex notation in floating point number or 'e' for scientific notation
+ // Check for dot or underscore or 'x' for hex notation in floating point number or 'e' for scientific notation.
if ((str[j] == '.' || str[j] == 'x' || str[j] == '_' || str[j] == 'f' || str[j] == 'e') && !in_word && prev_is_number && !is_number) {
is_number = true;
is_symbol = false;
@@ -6780,7 +7174,7 @@ Map<int, TextEdit::HighlighterInfo> TextEdit::_get_line_syntax_highlighting(int
if (!cri.end) {
in_region = cri.region;
}
- } else if (in_region == cri.region && !color_regions[cri.region].line_only) { //ignore otherwise
+ } else if (in_region == cri.region && !color_regions[cri.region].line_only) { // Ignore otherwise.
if (cri.end || color_regions[cri.region].eq) {
deregion = color_regions[cri.region].eq ? color_regions[cri.region].begin_key.length() : color_regions[cri.region].end_key.length();
}
@@ -6808,7 +7202,7 @@ Map<int, TextEdit::HighlighterInfo> TextEdit::_get_line_syntax_highlighting(int
if (col) {
for (int k = j - 1; k >= 0; k--) {
if (str[k] == '.') {
- col = NULL; //member indexing not allowed
+ col = NULL; // Member indexing not allowed.
break;
} else if (str[k] > 32) {
break;
@@ -6830,7 +7224,7 @@ Map<int, TextEdit::HighlighterInfo> TextEdit::_get_line_syntax_highlighting(int
k++;
}
- // check for space between name and bracket
+ // Check for space between name and bracket.
while (k < str.length() && (str[k] == '\t' || str[k] == ' ')) {
k++;
}
@@ -6879,6 +7273,7 @@ Map<int, TextEdit::HighlighterInfo> TextEdit::_get_line_syntax_highlighting(int
}
}
+ syntax_highlighting_cache[p_line] = color_map;
return color_map;
}
diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h
index b47dac0902..9c568acd93 100644
--- a/scene/gui/text_edit.h
+++ b/scene/gui/text_edit.h
@@ -211,9 +211,11 @@ private:
int breakpoint_gutter_width;
int fold_gutter_width;
int info_gutter_width;
+ int minimap_width;
} cache;
Map<int, int> color_region_cache;
+ Map<int, Map<int, HighlighterInfo> > syntax_highlighting_cache;
struct TextOperation {
@@ -313,6 +315,10 @@ private:
bool hiding_enabled;
bool draw_info_gutter;
int info_gutter_width;
+ bool draw_minimap;
+ int minimap_width;
+ Point2 minimap_char_size;
+ int minimap_line_spacing;
bool highlight_all_occurrences;
bool scroll_past_end_of_file_enabled;
@@ -326,6 +332,12 @@ private:
bool smooth_scroll_enabled;
bool scrolling;
+ bool dragging_selection;
+ bool dragging_minimap;
+ bool can_drag_minimap;
+ bool minimap_clicked;
+ double minimap_scroll_ratio;
+ double minimap_scroll_click_pos;
float target_v_scroll;
float v_scroll_speed;
@@ -360,6 +372,8 @@ private:
int get_visible_rows() const;
int get_total_visible_rows() const;
+ int _get_minimap_visible_rows() const;
+
void update_cursor_wrap_offset();
void _update_wrap_at();
bool line_wraps(int line) const;
@@ -395,6 +409,8 @@ private:
void _update_selection_mode_word();
void _update_selection_mode_line();
+ void _update_minimap_click();
+ void _update_minimap_drag();
void _scroll_up(real_t p_delta);
void _scroll_down(real_t p_delta);
@@ -406,6 +422,7 @@ private:
//void mouse_motion(const Point& p_pos, const Point& p_rel, int p_button_mask);
Size2 get_minimum_size() const;
+ int _get_control_height() const;
int get_row_height() const;
@@ -484,6 +501,7 @@ public:
virtual CursorShape get_cursor_shape(const Point2 &p_pos = Point2i()) const;
void _get_mouse_pos(const Point2i &p_mouse, int &r_row, int &r_col) const;
+ void _get_minimap_mouse_row(const Point2i &p_mouse, int &r_row) const;
//void delete_char();
//void delete_line();
@@ -697,6 +715,12 @@ public:
void set_info_gutter_width(int p_gutter_width);
int get_info_gutter_width() const;
+ void set_draw_minimap(bool p_draw);
+ bool is_drawing_minimap() const;
+
+ void set_minimap_width(int p_minimap_width);
+ int get_minimap_width() const;
+
void set_hiding_enabled(bool p_enabled);
bool is_hiding_enabled() const;
diff --git a/scene/gui/texture_button.cpp b/scene/gui/texture_button.cpp
index b5f949aeb7..e9b0bd8f38 100644
--- a/scene/gui/texture_button.cpp
+++ b/scene/gui/texture_button.cpp
@@ -205,24 +205,26 @@ void TextureButton::_notification(int p_what) {
case STRETCH_KEEP_ASPECT_COVERED: {
size = get_size();
Size2 tex_size = texdraw->get_size();
- Size2 scaleSize(size.width / tex_size.width, size.height / tex_size.height);
- float scale = scaleSize.width > scaleSize.height ? scaleSize.width : scaleSize.height;
- Size2 scaledTexSize = tex_size * scale;
- Point2 ofs2 = ((scaledTexSize - size) / scale).abs() / 2.0f;
+ Size2 scale_size(size.width / tex_size.width, size.height / tex_size.height);
+ float scale = scale_size.width > scale_size.height ? scale_size.width : scale_size.height;
+ Size2 scaled_tex_size = tex_size * scale;
+ Point2 ofs2 = ((scaled_tex_size - size) / scale).abs() / 2.0f;
_texture_region = Rect2(ofs2, size / scale);
} break;
}
}
+
_position_rect = Rect2(ofs, size);
- if (_tile)
+ if (_tile) {
draw_texture_rect(texdraw, _position_rect, _tile);
- else
+ } else {
draw_texture_rect_region(texdraw, _position_rect, _texture_region);
+ }
} else {
_position_rect = Rect2();
}
- if (has_focus() && focused.is_valid()) {
+ if (has_focus() && focused.is_valid()) {
draw_texture_rect(focused, _position_rect, false);
};
} break;
diff --git a/scene/gui/texture_rect.h b/scene/gui/texture_rect.h
index 3ab35324e5..1c5bd9d99c 100644
--- a/scene/gui/texture_rect.h
+++ b/scene/gui/texture_rect.h
@@ -32,9 +32,7 @@
#define TEXTURE_FRAME_H
#include "scene/gui/control.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class TextureRect : public Control {
GDCLASS(TextureRect, Control);
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp
index 6c8aa35e3c..b7451faad3 100644
--- a/scene/gui/tree.cpp
+++ b/scene/gui/tree.cpp
@@ -224,14 +224,14 @@ Rect2 TreeItem::get_icon_region(int p_column) const {
return cells[p_column].icon_region;
}
-void TreeItem::set_icon_color(int p_column, const Color &p_icon_color) {
+void TreeItem::set_icon_modulate(int p_column, const Color &p_modulate) {
ERR_FAIL_INDEX(p_column, cells.size());
- cells.write[p_column].icon_color = p_icon_color;
+ cells.write[p_column].icon_color = p_modulate;
_changed_notify(p_column);
}
-Color TreeItem::get_icon_color(int p_column) const {
+Color TreeItem::get_icon_modulate(int p_column) const {
ERR_FAIL_INDEX_V(p_column, cells.size(), Color());
return cells[p_column].icon_color;
@@ -744,6 +744,9 @@ void TreeItem::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_icon_max_width", "column", "width"), &TreeItem::set_icon_max_width);
ClassDB::bind_method(D_METHOD("get_icon_max_width", "column"), &TreeItem::get_icon_max_width);
+ ClassDB::bind_method(D_METHOD("set_icon_modulate", "column", "modulate"), &TreeItem::set_icon_modulate);
+ ClassDB::bind_method(D_METHOD("get_icon_modulate", "column"), &TreeItem::get_icon_modulate);
+
ClassDB::bind_method(D_METHOD("set_range", "column", "value"), &TreeItem::set_range);
ClassDB::bind_method(D_METHOD("get_range", "column"), &TreeItem::get_range);
ClassDB::bind_method(D_METHOD("set_range_config", "column", "min", "max", "step", "expr"), &TreeItem::set_range_config, DEFVAL(false));
@@ -1259,10 +1262,9 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
check_ofs.y += Math::floor((real_t)(item_rect.size.y - checked->get_height()) / 2);
if (p_item->cells[i].checked) {
-
- checked->draw(ci, check_ofs, icon_col);
+ checked->draw(ci, check_ofs);
} else {
- unchecked->draw(ci, check_ofs, icon_col);
+ unchecked->draw(ci, check_ofs);
}
int check_w = checked->get_width() + cache.hseparation;
@@ -1274,8 +1276,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
draw_item_rect(p_item->cells[i], item_rect, col, icon_col);
- //font->draw( ci, text_pos, p_item->cells[i].text, col,item_rect.size.x-check_w );
-
} break;
case TreeItem::CELL_MODE_RANGE: {
if (p_item->cells[i].text != "") {
@@ -1305,18 +1305,16 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
font->draw(ci, text_pos, s, col, item_rect.size.x - downarrow->get_width());
- //?
Point2i arrow_pos = item_rect.position;
arrow_pos.x += item_rect.size.x - downarrow->get_width();
arrow_pos.y += Math::floor(((item_rect.size.y - downarrow->get_height())) / 2.0);
- downarrow->draw(ci, arrow_pos, icon_col);
+ downarrow->draw(ci, arrow_pos);
} else {
Ref<Texture> updown = cache.updown;
String valtext = String::num(p_item->cells[i].val, Math::range_step_decimals(p_item->cells[i].step));
- //String valtext = rtos( p_item->cells[i].val );
if (p_item->cells[i].suffix != String())
valtext += " " + p_item->cells[i].suffix;
@@ -1330,7 +1328,7 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
updown_pos.x += item_rect.size.x - updown->get_width();
updown_pos.y += Math::floor(((item_rect.size.y - updown->get_height())) / 2.0);
- updown->draw(ci, updown_pos, icon_col);
+ updown->draw(ci, updown_pos);
}
} break;
@@ -1348,13 +1346,10 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
icon_ofs += item_rect.position;
draw_texture_rect(p_item->cells[i].icon, Rect2(icon_ofs, icon_size), false, icon_col);
- //p_item->cells[i].icon->draw(ci, icon_ofs);
} break;
case TreeItem::CELL_MODE_CUSTOM: {
- //int option = (int)p_item->cells[i].val;
-
if (p_item->cells[i].custom_draw_obj) {
Object *cdo = ObjectDB::get_instance(p_item->cells[i].custom_draw_obj);
@@ -1429,10 +1424,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
arrow->draw(ci, p_pos + p_draw_ofs + Point2i(0, (label_h - arrow->get_height()) / 2) - cache.offset);
}
- //separator
- //get_painter()->draw_fill_rect( Point2i(0,pos.y),Size2i(get_size().width,1),color( COLOR_TREE_GRID) );
-
- //pos=p_pos; //reset pos
}
Point2 children_pos = p_pos;
diff --git a/scene/gui/tree.h b/scene/gui/tree.h
index b6cdab766f..fdc6da5055 100644
--- a/scene/gui/tree.h
+++ b/scene/gui/tree.h
@@ -37,10 +37,6 @@
#include "scene/gui/scroll_bar.h"
#include "scene/gui/slider.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class Tree;
class TreeItem : public Object {
@@ -197,8 +193,8 @@ public:
void set_icon_region(int p_column, const Rect2 &p_icon_region);
Rect2 get_icon_region(int p_column) const;
- void set_icon_color(int p_column, const Color &p_icon_color);
- Color get_icon_color(int p_column) const;
+ void set_icon_modulate(int p_column, const Color &p_modulate);
+ Color get_icon_modulate(int p_column) const;
void set_icon_max_width(int p_column, int p_max);
int get_icon_max_width(int p_column) const;
diff --git a/scene/gui/viewport_container.cpp b/scene/gui/viewport_container.cpp
index 3f7a110c1b..35696a0459 100644
--- a/scene/gui/viewport_container.cpp
+++ b/scene/gui/viewport_container.cpp
@@ -211,4 +211,5 @@ ViewportContainer::ViewportContainer() {
stretch = false;
shrink = 1;
set_process_input(true);
+ set_process_unhandled_input(true);
}
diff --git a/scene/main/http_request.cpp b/scene/main/http_request.cpp
index e21e47f8a8..6c922adbd2 100644
--- a/scene/main/http_request.cpp
+++ b/scene/main/http_request.cpp
@@ -60,10 +60,10 @@ Error HTTPRequest::_parse_url(const String &p_url) {
use_ssl = true;
port = 443;
} else {
- ERR_FAIL_V_MSG(ERR_INVALID_PARAMETER, "Malformed URL.");
+ ERR_FAIL_V_MSG(ERR_INVALID_PARAMETER, "Malformed URL: " + url + ".");
}
- ERR_FAIL_COND_V_MSG(url.length() < 1, ERR_INVALID_PARAMETER, "URL too short.");
+ ERR_FAIL_COND_V_MSG(url.length() < 1, ERR_INVALID_PARAMETER, "URL too short: " + url + ".");
int slash_pos = url.find("/");
diff --git a/scene/main/node.cpp b/scene/main/node.cpp
index 0aaba5491a..bd01ca2886 100644
--- a/scene/main/node.cpp
+++ b/scene/main/node.cpp
@@ -1716,14 +1716,17 @@ void Node::get_groups(List<GroupInfo> *p_groups) const {
}
}
-bool Node::has_persistent_groups() const {
+int Node::get_persistent_group_count() const {
+
+ int count = 0;
for (const Map<StringName, GroupData>::Element *E = data.grouped.front(); E; E = E->next()) {
- if (E->get().persistent)
- return true;
+ if (E->get().persistent) {
+ count += 1;
+ }
}
- return false;
+ return count;
}
void Node::_print_tree_pretty(const String &prefix, const bool last) {
@@ -1872,6 +1875,19 @@ String Node::get_filename() const {
return data.filename;
}
+void Node::set_editor_description(const String &p_editor_description) {
+
+ set_meta("_editor_description_", p_editor_description);
+}
+String Node::get_editor_description() const {
+
+ if (has_meta("_editor_description_")) {
+ return get_meta("_editor_description_");
+ } else {
+ return "";
+ }
+}
+
void Node::set_editable_instance(Node *p_node, bool p_editable) {
ERR_FAIL_NULL(p_node);
@@ -2785,6 +2801,10 @@ void Node::_bind_methods() {
ClassDB::bind_method(D_METHOD("rpc_config", "method", "mode"), &Node::rpc_config);
ClassDB::bind_method(D_METHOD("rset_config", "property", "mode"), &Node::rset_config);
+ ClassDB::bind_method(D_METHOD("_set_editor_description", "editor_description"), &Node::set_editor_description);
+ ClassDB::bind_method(D_METHOD("_get_editor_description"), &Node::get_editor_description);
+ ADD_PROPERTY(PropertyInfo(Variant::STRING, "editor_description", PROPERTY_HINT_MULTILINE_TEXT, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_editor_description", "_get_editor_description");
+
ClassDB::bind_method(D_METHOD("_set_import_path", "import_path"), &Node::set_import_path);
ClassDB::bind_method(D_METHOD("_get_import_path"), &Node::get_import_path);
ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "_import_path", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_import_path", "_get_import_path");
@@ -2857,10 +2877,6 @@ void Node::_bind_methods() {
ADD_SIGNAL(MethodInfo("tree_exiting"));
ADD_SIGNAL(MethodInfo("tree_exited"));
- //ADD_PROPERTY( PropertyInfo( Variant::BOOL, "process/process" ),"set_process","is_processing") ;
- //ADD_PROPERTY( PropertyInfo( Variant::BOOL, "process/physics_process" ), "set_physics_process","is_physics_processing") ;
- //ADD_PROPERTY( PropertyInfo( Variant::BOOL, "process/input" ), "set_process_input","is_processing_input" ) ;
- //ADD_PROPERTY( PropertyInfo( Variant::BOOL, "process/unhandled_input" ), "set_process_unhandled_input","is_processing_unhandled_input" ) ;
ADD_GROUP("Pause", "pause_");
ADD_PROPERTY(PropertyInfo(Variant::INT, "pause_mode", PROPERTY_HINT_ENUM, "Inherit,Stop,Process"), "set_pause_mode", "get_pause_mode");
@@ -2884,9 +2900,6 @@ void Node::_bind_methods() {
BIND_VMETHOD(MethodInfo("_unhandled_input", PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent")));
BIND_VMETHOD(MethodInfo("_unhandled_key_input", PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEventKey")));
BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_configuration_warning"));
-
- //ClassDB::bind_method(D_METHOD("get_child",&Node::get_child,PH("index")));
- //ClassDB::bind_method(D_METHOD("get_node",&Node::get_node,PH("path")));
}
String Node::_get_name_num_separator() {
diff --git a/scene/main/node.h b/scene/main/node.h
index 982bfcd620..51a1436014 100644
--- a/scene/main/node.h
+++ b/scene/main/node.h
@@ -300,7 +300,7 @@ public:
};
void get_groups(List<GroupInfo> *p_groups) const;
- bool has_persistent_groups() const;
+ int get_persistent_group_count() const;
void move_child(Node *p_child, int p_pos);
void raise();
@@ -318,6 +318,9 @@ public:
void set_filename(const String &p_filename);
String get_filename() const;
+ void set_editor_description(const String &p_editor_description);
+ String get_editor_description() const;
+
void set_editable_instance(Node *p_node, bool p_editable);
bool is_editable_instance(const Node *p_node) const;
void set_editable_instances(const HashMap<NodePath, int> &p_editable_instances);
@@ -363,8 +366,6 @@ public:
Node *duplicate_from_editor(Map<const Node *, Node *> &r_duplimap) const;
#endif
- //Node *clone_tree() const;
-
// used by editors, to save what has changed only
void set_scene_instance_state(const Ref<SceneState> &p_state);
Ref<SceneState> get_scene_instance_state() const;
diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp
index 98d63650d3..6c89016ea3 100644
--- a/scene/main/scene_tree.cpp
+++ b/scene/main/scene_tree.cpp
@@ -33,6 +33,7 @@
#include "core/io/marshalls.h"
#include "core/io/resource_loader.h"
#include "core/message_queue.h"
+#include "core/os/dir_access.h"
#include "core/os/keyboard.h"
#include "core/os/os.h"
#include "core/print_string.h"
@@ -1673,6 +1674,12 @@ void SceneTree::drop_files(const Vector<String> &p_files, int p_from_screen) {
MainLoop::drop_files(p_files, p_from_screen);
}
+void SceneTree::global_menu_action(const Variant &p_id, const Variant &p_meta) {
+
+ emit_signal("global_menu_action", p_id, p_meta);
+ MainLoop::global_menu_action(p_id, p_meta);
+}
+
Ref<SceneTreeTimer> SceneTree::create_timer(float p_delay_sec, bool p_process_pause) {
Ref<SceneTreeTimer> stt;
@@ -1894,6 +1901,7 @@ void SceneTree::_bind_methods() {
ADD_SIGNAL(MethodInfo("physics_frame"));
ADD_SIGNAL(MethodInfo("files_dropped", PropertyInfo(Variant::POOL_STRING_ARRAY, "files"), PropertyInfo(Variant::INT, "screen")));
+ ADD_SIGNAL(MethodInfo("global_menu_action", PropertyInfo(Variant::NIL, "id"), PropertyInfo(Variant::NIL, "meta")));
ADD_SIGNAL(MethodInfo("network_peer_connected", PropertyInfo(Variant::INT, "id")));
ADD_SIGNAL(MethodInfo("network_peer_disconnected", PropertyInfo(Variant::INT, "id")));
ADD_SIGNAL(MethodInfo("connected_to_server"));
@@ -1946,6 +1954,38 @@ bool SceneTree::is_using_font_oversampling() const {
return use_font_oversampling;
}
+void SceneTree::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const {
+
+ if (p_function == "change_scene") {
+ DirAccessRef dir_access = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ List<String> directories;
+ directories.push_back(dir_access->get_current_dir());
+
+ while (!directories.empty()) {
+ dir_access->change_dir(directories.back()->get());
+ directories.pop_back();
+
+ dir_access->list_dir_begin();
+ String filename = dir_access->get_next();
+
+ while (filename != "") {
+ if (filename == "." || filename == "..") {
+ filename = dir_access->get_next();
+ continue;
+ }
+
+ if (dir_access->dir_exists(filename)) {
+ directories.push_back(dir_access->get_current_dir().plus_file(filename));
+ } else if (filename.ends_with(".tscn") || filename.ends_with(".scn")) {
+ r_options->push_back("\"" + dir_access->get_current_dir().plus_file(filename) + "\"");
+ }
+
+ filename = dir_access->get_next();
+ }
+ }
+ }
+}
+
SceneTree::SceneTree() {
if (singleton == NULL) singleton = this;
diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h
index 98f2fe5e35..d387886d61 100644
--- a/scene/main/scene_tree.h
+++ b/scene/main/scene_tree.h
@@ -39,10 +39,6 @@
#include "scene/resources/world.h"
#include "scene/resources/world_2d.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class PackedScene;
class Node;
class Viewport;
@@ -411,6 +407,8 @@ public:
static SceneTree *get_singleton() { return singleton; }
void drop_files(const Vector<String> &p_files, int p_from_screen = 0);
+ void global_menu_action(const Variant &p_id, const Variant &p_meta);
+ void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const;
//network API
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp
index 93eea2ad0b..b5c82ce4e3 100644
--- a/scene/main/viewport.cpp
+++ b/scene/main/viewport.cpp
@@ -2289,32 +2289,34 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
if (from && p_event->is_pressed()) {
Control *next = NULL;
- if (p_event->is_action_pressed("ui_focus_next")) {
+ Input *input = Input::get_singleton();
+
+ if (p_event->is_action_pressed("ui_focus_next") && input->is_action_just_pressed("ui_focus_next")) {
next = from->find_next_valid_focus();
}
- if (p_event->is_action_pressed("ui_focus_prev")) {
+ if (p_event->is_action_pressed("ui_focus_prev") && input->is_action_just_pressed("ui_focus_prev")) {
next = from->find_prev_valid_focus();
}
- if (!mods && p_event->is_action_pressed("ui_up")) {
+ if (!mods && p_event->is_action_pressed("ui_up") && input->is_action_just_pressed("ui_up")) {
next = from->_get_focus_neighbour(MARGIN_TOP);
}
- if (!mods && p_event->is_action_pressed("ui_left")) {
+ if (!mods && p_event->is_action_pressed("ui_left") && input->is_action_just_pressed("ui_left")) {
next = from->_get_focus_neighbour(MARGIN_LEFT);
}
- if (!mods && p_event->is_action_pressed("ui_right")) {
+ if (!mods && p_event->is_action_pressed("ui_right") && input->is_action_just_pressed("ui_right")) {
next = from->_get_focus_neighbour(MARGIN_RIGHT);
}
- if (!mods && p_event->is_action_pressed("ui_down")) {
+ if (!mods && p_event->is_action_pressed("ui_down") && input->is_action_just_pressed("ui_down")) {
next = from->_get_focus_neighbour(MARGIN_BOTTOM);
}
diff --git a/scene/main/viewport.h b/scene/main/viewport.h
index b7160d5139..6393785b22 100644
--- a/scene/main/viewport.h
+++ b/scene/main/viewport.h
@@ -36,9 +36,6 @@
#include "scene/resources/texture.h"
#include "scene/resources/world_2d.h"
#include "servers/visual_server.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class Camera;
class Camera2D;
diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp
index fd7cd3c17b..06d84302a3 100644
--- a/scene/register_scene_types.cpp
+++ b/scene/register_scene_types.cpp
@@ -304,6 +304,7 @@ void register_scene_types() {
ClassDB::register_class<TextureRect>();
ClassDB::register_class<ColorRect>();
ClassDB::register_class<NinePatchRect>();
+ ClassDB::register_class<ReferenceRect>();
ClassDB::register_class<TabContainer>();
ClassDB::register_class<Tabs>();
ClassDB::register_virtual_class<Separator>();
@@ -339,7 +340,6 @@ void register_scene_types() {
ClassDB::register_virtual_class<TreeItem>();
ClassDB::register_class<OptionButton>();
ClassDB::register_class<SpinBox>();
- ClassDB::register_class<ReferenceRect>();
ClassDB::register_class<ColorPicker>();
ClassDB::register_class<ColorPickerButton>();
ClassDB::register_class<RichTextLabel>();
@@ -475,6 +475,7 @@ void register_scene_types() {
ClassDB::register_class<Shader>();
ClassDB::register_class<VisualShader>();
ClassDB::register_virtual_class<VisualShaderNode>();
+ ClassDB::register_class<VisualShaderNodeCustom>();
ClassDB::register_class<VisualShaderNodeInput>();
ClassDB::register_virtual_class<VisualShaderNodeOutput>();
ClassDB::register_class<VisualShaderNodeGroupBase>();
@@ -529,6 +530,7 @@ void register_scene_types() {
ClassDB::register_class<VisualShaderNodeSwitch>();
ClassDB::register_class<VisualShaderNodeFresnel>();
ClassDB::register_class<VisualShaderNodeExpression>();
+ ClassDB::register_class<VisualShaderNodeGlobalExpression>();
ClassDB::register_class<VisualShaderNodeIs>();
ClassDB::register_class<VisualShaderNodeCompare>();
diff --git a/scene/register_scene_types.h b/scene/register_scene_types.h
index 3645f88807..b551ad2ac4 100644
--- a/scene/register_scene_types.h
+++ b/scene/register_scene_types.h
@@ -31,10 +31,6 @@
#ifndef REGISTER_SCENE_TYPES_H
#define REGISTER_SCENE_TYPES_H
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
void register_scene_types();
void unregister_scene_types();
diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp
index 8c8552ac54..985b38f913 100644
--- a/scene/resources/animation.cpp
+++ b/scene/resources/animation.cpp
@@ -2870,9 +2870,9 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons
const Vector3 &v1 = t1.value.loc;
const Vector3 &v2 = t2.value.loc;
- if (Math::is_zero_approx(v0.distance_to(v2))) {
+ if (v0 == v2) {
//0 and 2 are close, let's see if 1 is close
- if (!Math::is_zero_approx(v0.distance_to(v1))) {
+ if (v0 != v1) {
//not close, not optimizable
return false;
}
@@ -2959,9 +2959,9 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons
const Vector3 &v1 = t1.value.scale;
const Vector3 &v2 = t2.value.scale;
- if (Math::is_zero_approx(v0.distance_to(v2))) {
+ if (v0 == v2) {
//0 and 2 are close, let's see if 1 is close
- if (!Math::is_zero_approx(v0.distance_to(v1))) {
+ if (v0 != v1) {
//not close, not optimizable
return false;
}
diff --git a/scene/resources/animation.h b/scene/resources/animation.h
index 6fff77d746..d59dfab2c8 100644
--- a/scene/resources/animation.h
+++ b/scene/resources/animation.h
@@ -32,9 +32,7 @@
#define ANIMATION_H
#include "core/resource.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class Animation : public Resource {
GDCLASS(Animation, Resource);
diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp
index fb0fb4f8e3..d761eb01fe 100644
--- a/scene/resources/default_theme/default_theme.cpp
+++ b/scene/resources/default_theme/default_theme.cpp
@@ -611,6 +611,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
theme->set_font("title_font", "GraphNode", default_font);
theme->set_color("title_color", "GraphNode", Color(0, 0, 0, 1));
theme->set_color("close_color", "GraphNode", Color(0, 0, 0, 1));
+ theme->set_color("resizer_color", "GraphNode", Color(0, 0, 0, 1));
theme->set_constant("title_offset", "GraphNode", 20 * scale);
theme->set_constant("close_offset", "GraphNode", 18 * scale);
theme->set_constant("port_offset", "GraphNode", 3 * scale);
@@ -760,6 +761,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
// FileDialog
theme->set_icon("folder", "FileDialog", make_icon(icon_folder_png));
+ theme->set_color("folder_icon_modulate", "FileDialog", Color(1, 1, 1));
theme->set_color("files_disabled", "FileDialog", Color(0, 0, 0, 0.7));
// colorPicker
@@ -892,8 +894,9 @@ void make_default_theme(bool p_hidpi, Ref<Font> p_font) {
void clear_default_theme() {
- Theme::set_default(Ref<Theme>());
- Theme::set_default_icon(Ref<Texture>());
- Theme::set_default_style(Ref<StyleBox>());
- Theme::set_default_font(Ref<Font>());
+ Theme::set_project_default(NULL);
+ Theme::set_default(NULL);
+ Theme::set_default_icon(NULL);
+ Theme::set_default_style(NULL);
+ Theme::set_default_font(NULL);
}
diff --git a/scene/resources/default_theme/default_theme.h b/scene/resources/default_theme/default_theme.h
index cbf0cc1b79..e7d80ffb3d 100644
--- a/scene/resources/default_theme/default_theme.h
+++ b/scene/resources/default_theme/default_theme.h
@@ -32,9 +32,6 @@
#define DEFAULT_THEME_H
#include "scene/resources/theme.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const Ref<Font> &large_font, Ref<Texture> &default_icon, Ref<StyleBox> &default_style, float p_scale);
void make_default_theme(bool p_hidpi, Ref<Font> p_font);
diff --git a/scene/resources/dynamic_font.cpp b/scene/resources/dynamic_font.cpp
index df8d4a7fed..2364a4a8a3 100644
--- a/scene/resources/dynamic_font.cpp
+++ b/scene/resources/dynamic_font.cpp
@@ -193,14 +193,6 @@ Error DynamicFontAtSize::_load() {
ERR_FAIL_COND_V(error, ERR_FILE_CANT_OPEN);
- /*error = FT_Set_Char_Size(face,0,64*size,512,512);
-
- if ( error ) {
- FT_Done_FreeType( library );
- ERR_EXPLAIN(TTR("Invalid font size."));
- ERR_FAIL_COND_V( error, ERR_INVALID_PARAMETER );
- }*/
-
if (FT_HAS_COLOR(face)) {
int best_match = 0;
int diff = ABS(id.size - ((int64_t)face->available_sizes[0].width));
diff --git a/scene/resources/environment.cpp b/scene/resources/environment.cpp
index 0f0974114f..afb7f1102b 100644
--- a/scene/resources/environment.cpp
+++ b/scene/resources/environment.cpp
@@ -1399,7 +1399,7 @@ Environment::Environment() :
fog_depth_enabled = true;
fog_depth_begin = 10;
- fog_depth_end = 0;
+ fog_depth_end = 100;
fog_depth_curve = 1;
fog_transmit_enabled = false;
diff --git a/scene/resources/font.h b/scene/resources/font.h
index 436ed43c42..9b99b85d22 100644
--- a/scene/resources/font.h
+++ b/scene/resources/font.h
@@ -34,9 +34,6 @@
#include "core/map.h"
#include "core/resource.h"
#include "scene/resources/texture.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class Font : public Resource {
diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp
index daa51aabd7..0de462d616 100644
--- a/scene/resources/material.cpp
+++ b/scene/resources/material.cpp
@@ -1772,7 +1772,7 @@ SpatialMaterial::TextureChannel SpatialMaterial::get_refraction_texture_channel(
return refraction_texture_channel;
}
-RID SpatialMaterial::get_material_rid_for_2d(bool p_shaded, bool p_transparent, bool p_double_sided, bool p_cut_alpha, bool p_opaque_prepass) {
+RID SpatialMaterial::get_material_rid_for_2d(bool p_shaded, bool p_transparent, bool p_double_sided, bool p_cut_alpha, bool p_opaque_prepass, bool p_billboard, bool p_billboard_y) {
int version = 0;
if (p_shaded)
@@ -1785,6 +1785,10 @@ RID SpatialMaterial::get_material_rid_for_2d(bool p_shaded, bool p_transparent,
version |= 8;
if (p_double_sided)
version |= 16;
+ if (p_billboard)
+ version |= 32;
+ if (p_billboard_y)
+ version |= 64;
if (materials_for_2d[version].is_valid()) {
return materials_for_2d[version]->get_rid();
@@ -1800,6 +1804,11 @@ RID SpatialMaterial::get_material_rid_for_2d(bool p_shaded, bool p_transparent,
material->set_flag(FLAG_SRGB_VERTEX_COLOR, true);
material->set_flag(FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
material->set_flag(FLAG_USE_ALPHA_SCISSOR, p_cut_alpha);
+ if (p_billboard) {
+ material->set_billboard_mode(BILLBOARD_ENABLED);
+ } else if (p_billboard_y) {
+ material->set_billboard_mode(BILLBOARD_FIXED_Y);
+ }
materials_for_2d[version] = material;
diff --git a/scene/resources/material.h b/scene/resources/material.h
index 17e52527b3..2423d6d48b 100644
--- a/scene/resources/material.h
+++ b/scene/resources/material.h
@@ -37,9 +37,6 @@
#include "scene/resources/texture.h"
#include "servers/visual/shader_language.h"
#include "servers/visual_server.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class Material : public Resource {
@@ -440,9 +437,7 @@ private:
_FORCE_INLINE_ void _validate_feature(const String &text, Feature feature, PropertyInfo &property) const;
- enum {
- MAX_MATERIALS_FOR_2D = 32
- };
+ static const int MAX_MATERIALS_FOR_2D = 128;
static Ref<SpatialMaterial> materials_for_2d[MAX_MATERIALS_FOR_2D]; //used by Sprite3D and other stuff
@@ -629,7 +624,7 @@ public:
static void finish_shaders();
static void flush_changes();
- static RID get_material_rid_for_2d(bool p_shaded, bool p_transparent, bool p_double_sided, bool p_cut_alpha, bool p_opaque_prepass);
+ static RID get_material_rid_for_2d(bool p_shaded, bool p_transparent, bool p_double_sided, bool p_cut_alpha, bool p_opaque_prepass, bool p_billboard = false, bool p_billboard_y = false);
RID get_shader_rid() const;
diff --git a/scene/resources/mesh.h b/scene/resources/mesh.h
index b38791b9a6..6b6ee8a209 100644
--- a/scene/resources/mesh.h
+++ b/scene/resources/mesh.h
@@ -37,9 +37,6 @@
#include "scene/resources/material.h"
#include "scene/resources/shape.h"
#include "servers/visual_server.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class Mesh : public Resource {
GDCLASS(Mesh, Resource);
diff --git a/scene/resources/room.h b/scene/resources/room.h
index 8990056f46..2c53ea1aed 100644
--- a/scene/resources/room.h
+++ b/scene/resources/room.h
@@ -33,9 +33,6 @@
#include "core/math/bsp_tree.h"
#include "core/resource.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
// FIXME: left for reference but will be removed when portals are reimplemented using Area
#if 0
diff --git a/scene/resources/style_box.h b/scene/resources/style_box.h
index c3965fe076..d02e107480 100644
--- a/scene/resources/style_box.h
+++ b/scene/resources/style_box.h
@@ -34,9 +34,7 @@
#include "core/resource.h"
#include "scene/resources/texture.h"
#include "servers/visual_server.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+
class CanvasItem;
class StyleBox : public Resource {
diff --git a/scene/resources/texture.h b/scene/resources/texture.h
index eb7a9ff25c..e535f7544a 100644
--- a/scene/resources/texture.h
+++ b/scene/resources/texture.h
@@ -42,10 +42,6 @@
#include "servers/camera_server.h"
#include "servers/visual_server.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
class Texture : public Resource {
GDCLASS(Texture, Resource);
diff --git a/scene/resources/theme.h b/scene/resources/theme.h
index d27180e9eb..187694de65 100644
--- a/scene/resources/theme.h
+++ b/scene/resources/theme.h
@@ -38,9 +38,6 @@
#include "scene/resources/style_box.h"
#include "scene/resources/texture.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class Theme : public Resource {
GDCLASS(Theme, Resource);
diff --git a/scene/resources/visual_shader.cpp b/scene/resources/visual_shader.cpp
index cd0c1b5b07..e85609468b 100644
--- a/scene/resources/visual_shader.cpp
+++ b/scene/resources/visual_shader.cpp
@@ -117,6 +117,12 @@ void VisualShaderNode::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::INT, "output_port_for_preview"), "set_output_port_for_preview", "get_output_port_for_preview");
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "default_input_values", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_default_input_values", "_get_default_input_values");
ADD_SIGNAL(MethodInfo("editor_refresh_request"));
+
+ BIND_ENUM_CONSTANT(PORT_TYPE_SCALAR);
+ BIND_ENUM_CONSTANT(PORT_TYPE_VECTOR);
+ BIND_ENUM_CONSTANT(PORT_TYPE_BOOLEAN);
+ BIND_ENUM_CONSTANT(PORT_TYPE_TRANSFORM);
+ BIND_ENUM_CONSTANT(PORT_TYPE_ICON_COLOR);
}
VisualShaderNode::VisualShaderNode() {
@@ -125,6 +131,147 @@ VisualShaderNode::VisualShaderNode() {
/////////////////////////////////////////////////////////
+void VisualShaderNodeCustom::update_ports() {
+ ERR_FAIL_COND(!get_script_instance());
+
+ input_ports.clear();
+ if (get_script_instance()->has_method("_get_input_port_count")) {
+ int input_port_count = (int)get_script_instance()->call("_get_input_port_count");
+ bool has_name = get_script_instance()->has_method("_get_input_port_name");
+ bool has_type = get_script_instance()->has_method("_get_input_port_type");
+ for (int i = 0; i < input_port_count; i++) {
+ Port port;
+ if (has_name) {
+ port.name = (String)get_script_instance()->call("_get_input_port_name", i);
+ } else {
+ port.name = "in" + itos(i);
+ }
+ if (has_type) {
+ port.type = (int)get_script_instance()->call("_get_input_port_type", i);
+ } else {
+ port.type = (int)PortType::PORT_TYPE_SCALAR;
+ }
+ input_ports.push_back(port);
+ }
+ }
+ output_ports.clear();
+ if (get_script_instance()->has_method("_get_output_port_count")) {
+ int output_port_count = (int)get_script_instance()->call("_get_output_port_count");
+ bool has_name = get_script_instance()->has_method("_get_output_port_name");
+ bool has_type = get_script_instance()->has_method("_get_output_port_type");
+ for (int i = 0; i < output_port_count; i++) {
+ Port port;
+ if (has_name) {
+ port.name = (String)get_script_instance()->call("_get_output_port_name", i);
+ } else {
+ port.name = "out" + itos(i);
+ }
+ if (has_type) {
+ port.type = (int)get_script_instance()->call("_get_output_port_type", i);
+ } else {
+ port.type = (int)PortType::PORT_TYPE_SCALAR;
+ }
+ output_ports.push_back(port);
+ }
+ }
+}
+
+String VisualShaderNodeCustom::get_caption() const {
+ ERR_FAIL_COND_V(!get_script_instance(), "");
+ if (get_script_instance()->has_method("_get_name")) {
+ return (String)get_script_instance()->call("_get_name");
+ }
+ return "Unnamed";
+}
+
+int VisualShaderNodeCustom::get_input_port_count() const {
+ return input_ports.size();
+}
+
+VisualShaderNodeCustom::PortType VisualShaderNodeCustom::get_input_port_type(int p_port) const {
+ ERR_FAIL_INDEX_V(p_port, input_ports.size(), PORT_TYPE_SCALAR);
+ return (PortType)input_ports[p_port].type;
+}
+
+String VisualShaderNodeCustom::get_input_port_name(int p_port) const {
+ ERR_FAIL_INDEX_V(p_port, input_ports.size(), "");
+ return input_ports[p_port].name;
+}
+
+int VisualShaderNodeCustom::get_output_port_count() const {
+ return output_ports.size();
+}
+
+VisualShaderNodeCustom::PortType VisualShaderNodeCustom::get_output_port_type(int p_port) const {
+ ERR_FAIL_INDEX_V(p_port, output_ports.size(), PORT_TYPE_SCALAR);
+ return (PortType)output_ports[p_port].type;
+}
+
+String VisualShaderNodeCustom::get_output_port_name(int p_port) const {
+ ERR_FAIL_INDEX_V(p_port, output_ports.size(), "");
+ return output_ports[p_port].name;
+}
+
+String VisualShaderNodeCustom::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
+
+ ERR_FAIL_COND_V(!get_script_instance(), "");
+ ERR_FAIL_COND_V(!get_script_instance()->has_method("_get_code"), "");
+ Array input_vars;
+ for (int i = 0; i < get_input_port_count(); i++) {
+ input_vars.push_back(p_input_vars[i]);
+ }
+ Array output_vars;
+ for (int i = 0; i < get_output_port_count(); i++) {
+ output_vars.push_back(p_output_vars[i]);
+ }
+ String code = "\t{\n";
+ String _code = (String)get_script_instance()->call("_get_code", input_vars, output_vars, (int)p_mode, (int)p_type);
+ bool nend = _code.ends_with("\n");
+ _code = _code.insert(0, "\t\t");
+ _code = _code.replace("\n", "\n\t\t");
+ code += _code;
+ if (!nend) {
+ code += "\n\t}";
+ } else {
+ code.remove(code.size() - 1);
+ code += "}";
+ }
+ return code;
+}
+
+String VisualShaderNodeCustom::generate_global_per_node(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
+ ERR_FAIL_COND_V(!get_script_instance(), "");
+ if (get_script_instance()->has_method("_get_global_code")) {
+ String code = "// " + get_caption() + "\n";
+ code += (String)get_script_instance()->call("_get_global_code", (int)p_mode);
+ code += "\n";
+ return code;
+ }
+ return "";
+}
+
+void VisualShaderNodeCustom::_bind_methods() {
+
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_name"));
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_description"));
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_category"));
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_subcategory"));
+ BIND_VMETHOD(MethodInfo(Variant::INT, "_get_return_icon_type"));
+ BIND_VMETHOD(MethodInfo(Variant::INT, "_get_input_port_count"));
+ BIND_VMETHOD(MethodInfo(Variant::INT, "_get_input_port_type", PropertyInfo(Variant::INT, "port")));
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_input_port_name", PropertyInfo(Variant::INT, "port")));
+ BIND_VMETHOD(MethodInfo(Variant::INT, "_get_output_port_count"));
+ BIND_VMETHOD(MethodInfo(Variant::INT, "_get_output_port_type", PropertyInfo(Variant::INT, "port")));
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_output_port_name", PropertyInfo(Variant::INT, "port")));
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_code", PropertyInfo(Variant::ARRAY, "input_vars"), PropertyInfo(Variant::ARRAY, "output_vars"), PropertyInfo(Variant::INT, "mode"), PropertyInfo(Variant::INT, "type")));
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_global_code", PropertyInfo(Variant::INT, "mode")));
+}
+
+VisualShaderNodeCustom::VisualShaderNodeCustom() {
+}
+
+/////////////////////////////////////////////////////////
+
void VisualShader::add_node(Type p_type, const Ref<VisualShaderNode> &p_node, const Vector2 &p_position, int p_id) {
ERR_FAIL_COND(p_node.is_null());
ERR_FAIL_COND(p_id < 2);
@@ -150,6 +297,11 @@ void VisualShader::add_node(Type p_type, const Ref<VisualShaderNode> &p_node, co
n.node->connect("changed", this, "_queue_update");
+ Ref<VisualShaderNodeCustom> custom = n.node;
+ if (custom.is_valid()) {
+ custom->update_ports();
+ }
+
g->nodes[p_id] = n;
_queue_update();
@@ -460,6 +612,25 @@ String VisualShader::generate_preview_shader(Type p_type, int p_node, int p_port
global_code += String() + "shader_type canvas_item;\n";
+ String global_expressions;
+ for (int i = 0, index = 0; i < TYPE_MAX; i++) {
+ for (Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) {
+ Ref<VisualShaderNodeGlobalExpression> global_expression = Object::cast_to<VisualShaderNodeGlobalExpression>(E->get().node.ptr());
+ if (global_expression.is_valid()) {
+
+ String expr = "";
+ expr += "// " + global_expression->get_caption() + ":" + itos(index++) + "\n";
+ expr += global_expression->generate_global(get_mode(), Type(i), -1);
+ expr = expr.replace("\n", "\n\t");
+ expr += "\n";
+ global_expressions += expr;
+ }
+ }
+ }
+
+ global_code += "\n";
+ global_code += global_expressions;
+
//make it faster to go around through shader
VMap<ConnectionKey, const List<Connection>::Element *> input_connections;
VMap<ConnectionKey, const List<Connection>::Element *> output_connections;
@@ -965,6 +1136,7 @@ Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBui
bool skip_global = input.is_valid() && for_preview;
if (!skip_global) {
+
global_code += vsnode->generate_global(get_mode(), type, node);
if (!r_classes.has(vsnode->get_class_name())) {
@@ -976,7 +1148,6 @@ Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBui
}
}
- //handle normally
code += vsnode->generate_code(get_mode(), type, node, inputs, outputs, for_preview);
code += "\n"; //
@@ -1053,6 +1224,22 @@ void VisualShader::_update_shader() const {
static const char *func_name[TYPE_MAX] = { "vertex", "fragment", "light" };
+ String global_expressions;
+ for (int i = 0, index = 0; i < TYPE_MAX; i++) {
+ for (Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) {
+ Ref<VisualShaderNodeGlobalExpression> global_expression = Object::cast_to<VisualShaderNodeGlobalExpression>(E->get().node.ptr());
+ if (global_expression.is_valid()) {
+
+ String expr = "";
+ expr += "// " + global_expression->get_caption() + ":" + itos(index++) + "\n";
+ expr += global_expression->generate_global(get_mode(), Type(i), -1);
+ expr = expr.replace("\n", "\n\t");
+ expr += "\n";
+ global_expressions += expr;
+ }
+ }
+ }
+
for (int i = 0; i < TYPE_MAX; i++) {
//make it faster to go around through shader
@@ -1087,6 +1274,7 @@ void VisualShader::_update_shader() const {
global_code += "\n\n";
String final_code = global_code;
final_code += global_code_per_node;
+ final_code += global_expressions;
String tcode = code;
for (int i = 0; i < TYPE_MAX; i++) {
tcode = tcode.insert(insertion_pos[i], global_code_per_func[Type(i)]);
@@ -1097,6 +1285,10 @@ void VisualShader::_update_shader() const {
for (int i = 0; i < default_tex_params.size(); i++) {
const_cast<VisualShader *>(this)->set_default_texture_param(default_tex_params[i].name, default_tex_params[i].param);
}
+ if (previous_code != final_code) {
+ const_cast<VisualShader *>(this)->emit_signal("changed");
+ }
+ previous_code = final_code;
}
void VisualShader::_queue_update() {
@@ -2181,6 +2373,14 @@ void VisualShaderNodeGroupBase::_apply_port_changes() {
}
}
+void VisualShaderNodeGroupBase::set_editable(bool p_enabled) {
+ editable = p_enabled;
+}
+
+bool VisualShaderNodeGroupBase::is_editable() const {
+ return editable;
+}
+
void VisualShaderNodeGroupBase::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_size", "size"), &VisualShaderNodeGroupBase::set_size);
@@ -2216,6 +2416,11 @@ void VisualShaderNodeGroupBase::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_control", "control", "index"), &VisualShaderNodeGroupBase::set_control);
ClassDB::bind_method(D_METHOD("get_control", "index"), &VisualShaderNodeGroupBase::get_control);
+
+ ClassDB::bind_method(D_METHOD("set_editable", "enabled"), &VisualShaderNodeGroupBase::set_editable);
+ ClassDB::bind_method(D_METHOD("is_editable"), &VisualShaderNodeGroupBase::is_editable);
+
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "editable"), "set_editable", "is_editable");
}
String VisualShaderNodeGroupBase::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
@@ -2226,6 +2431,7 @@ VisualShaderNodeGroupBase::VisualShaderNodeGroupBase() {
size = Size2(0, 0);
inputs = "";
outputs = "";
+ editable = false;
}
////////////// Expression
@@ -2257,6 +2463,7 @@ String VisualShaderNodeExpression::generate_code(Shader::Mode p_mode, VisualShad
if (pre_symbols.empty()) {
pre_symbols.push_back("\t");
pre_symbols.push_back(",");
+ pre_symbols.push_back(";");
pre_symbols.push_back("{");
pre_symbols.push_back("[");
pre_symbols.push_back("(");
@@ -2273,9 +2480,9 @@ String VisualShaderNodeExpression::generate_code(Shader::Mode p_mode, VisualShad
static Vector<String> post_symbols;
if (post_symbols.empty()) {
- post_symbols.push_back("\0");
post_symbols.push_back("\t");
post_symbols.push_back("\n");
+ post_symbols.push_back(",");
post_symbols.push_back(";");
post_symbols.push_back("}");
post_symbols.push_back("]");
@@ -2352,4 +2559,19 @@ void VisualShaderNodeExpression::_bind_methods() {
VisualShaderNodeExpression::VisualShaderNodeExpression() {
expression = "";
+ set_editable(true);
+}
+
+////////////// Global Expression
+
+String VisualShaderNodeGlobalExpression::get_caption() const {
+ return "GlobalExpression";
+}
+
+String VisualShaderNodeGlobalExpression::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
+ return expression;
+}
+
+VisualShaderNodeGlobalExpression::VisualShaderNodeGlobalExpression() {
+ set_editable(false);
}
diff --git a/scene/resources/visual_shader.h b/scene/resources/visual_shader.h
index b3c0ab6e0b..45beb8e6ca 100644
--- a/scene/resources/visual_shader.h
+++ b/scene/resources/visual_shader.h
@@ -73,6 +73,7 @@ private:
} graph[TYPE_MAX];
Shader::Mode shader_mode;
+ mutable String previous_code;
Array _get_node_connections(Type p_type) const;
@@ -183,7 +184,7 @@ public:
PORT_TYPE_VECTOR,
PORT_TYPE_BOOLEAN,
PORT_TYPE_TRANSFORM,
- PORT_TYPE_COLOR // just a hint for node tree icons, do not use it as actual port type !
+ PORT_TYPE_ICON_COLOR // just a hint for node tree icons, do not use it as actual port type !
};
virtual String get_caption() const = 0;
@@ -216,6 +217,44 @@ public:
VisualShaderNode();
};
+
+VARIANT_ENUM_CAST(VisualShaderNode::PortType)
+
+class VisualShaderNodeCustom : public VisualShaderNode {
+ GDCLASS(VisualShaderNodeCustom, VisualShaderNode);
+
+ struct Port {
+ String name;
+ int type;
+ };
+
+ List<Port> input_ports;
+ List<Port> output_ports;
+
+ friend class VisualShaderEditor;
+
+protected:
+ virtual String get_caption() const;
+
+ virtual int get_input_port_count() const;
+ virtual PortType get_input_port_type(int p_port) const;
+ virtual String get_input_port_name(int p_port) const;
+
+ virtual int get_output_port_count() const;
+ virtual PortType get_output_port_type(int p_port) const;
+ virtual String get_output_port_name(int p_port) const;
+
+protected:
+ virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const;
+ virtual String generate_global_per_node(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const;
+
+ static void _bind_methods();
+
+public:
+ VisualShaderNodeCustom();
+ void update_ports();
+};
+
/////
class VisualShaderNodeInput : public VisualShaderNode {
@@ -333,6 +372,7 @@ protected:
Vector2 size;
String inputs;
String outputs;
+ bool editable;
struct Port {
PortType type;
@@ -388,6 +428,9 @@ public:
void set_control(Control *p_control, int p_index);
Control *get_control(int p_index);
+ void set_editable(bool p_enabled);
+ bool is_editable() const;
+
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const;
VisualShaderNodeGroupBase();
@@ -396,10 +439,9 @@ public:
class VisualShaderNodeExpression : public VisualShaderNodeGroupBase {
GDCLASS(VisualShaderNodeExpression, VisualShaderNodeGroupBase);
-private:
+protected:
String expression;
-protected:
static void _bind_methods();
public:
@@ -415,4 +457,15 @@ public:
VisualShaderNodeExpression();
};
+class VisualShaderNodeGlobalExpression : public VisualShaderNodeExpression {
+ GDCLASS(VisualShaderNodeGlobalExpression, VisualShaderNodeExpression);
+
+public:
+ virtual String get_caption() const;
+
+ virtual String generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const;
+
+ VisualShaderNodeGlobalExpression();
+};
+
#endif // VISUAL_SHADER_H
diff --git a/servers/arvr/arvr_interface.h b/servers/arvr/arvr_interface.h
index ffafa4fcf5..85556b2757 100644
--- a/servers/arvr/arvr_interface.h
+++ b/servers/arvr/arvr_interface.h
@@ -39,7 +39,7 @@
/**
@author Bastiaan Olij <mux213@gmail.com>
- The ARVR interface is a template class ontop of which we build interface to differt AR, VR and tracking SDKs.
+ The ARVR interface is a template class ontop of which we build interface to different AR, VR and tracking SDKs.
The idea is that we subclass this class, implement the logic, and then instantiate a singleton of each interface
when Godot starts. These instances do not initialize themselves but register themselves with the AR/VR server.
diff --git a/servers/physics/body_sw.cpp b/servers/physics/body_sw.cpp
index 172a2a3429..a3bb581cb5 100644
--- a/servers/physics/body_sw.cpp
+++ b/servers/physics/body_sw.cpp
@@ -266,6 +266,7 @@ void BodySW::set_mode(PhysicsServer::BodyMode p_mode) {
_inv_mass = mass > 0 ? (1.0 / mass) : 0;
_set_static(false);
+ angular_velocity = Vector3();
} break;
}
diff --git a/servers/physics/gjk_epa.h b/servers/physics/gjk_epa.h
index 0b7885c9a5..d3fa192804 100644
--- a/servers/physics/gjk_epa.h
+++ b/servers/physics/gjk_epa.h
@@ -31,11 +31,8 @@
#ifndef GJK_EPA_H
#define GJK_EPA_H
-#include "shape_sw.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
#include "collision_solver_sw.h"
+#include "shape_sw.h"
bool gjk_epa_calculate_penetration(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, CollisionSolverSW::CallbackResult p_result_callback, void *p_userdata, bool p_swap = false);
bool gjk_epa_calculate_distance(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, Vector3 &r_result_A, Vector3 &r_result_B);
diff --git a/servers/physics_2d/body_2d_sw.cpp b/servers/physics_2d/body_2d_sw.cpp
index b9ebd30021..6ba159ca0a 100644
--- a/servers/physics_2d/body_2d_sw.cpp
+++ b/servers/physics_2d/body_2d_sw.cpp
@@ -47,8 +47,10 @@ void Body2DSW::update_inertias() {
case Physics2DServer::BODY_MODE_RIGID: {
- if (user_inertia) break;
-
+ if (user_inertia) {
+ _inv_inertia = inertia > 0 ? (1.0 / inertia) : 0;
+ break;
+ }
//update tensor for allshapes, not the best way but should be somehow OK. (inspired from bullet)
real_t total_area = 0;
@@ -57,7 +59,7 @@ void Body2DSW::update_inertias() {
total_area += get_shape_aabb(i).get_area();
}
- real_t _inertia = 0;
+ inertia = 0;
for (int i = 0; i < get_shape_count(); i++) {
@@ -73,15 +75,10 @@ void Body2DSW::update_inertias() {
Transform2D mtx = get_shape_transform(i);
Vector2 scale = mtx.get_scale();
- _inertia += shape->get_moment_of_inertia(mass, scale) + mass * mtx.get_origin().length_squared();
- //Rect2 ab = get_shape_aabb(i);
- //_inertia+=mass*ab.size.dot(ab.size)/12.0f;
+ inertia += shape->get_moment_of_inertia(mass, scale) + mass * mtx.get_origin().length_squared();
}
- if (_inertia != 0)
- _inv_inertia = 1.0 / _inertia;
- else
- _inv_inertia = 0.0; //wathever
+ _inv_inertia = inertia > 0 ? (1.0 / inertia) : 0;
if (mass)
_inv_mass = 1.0 / mass;
@@ -160,6 +157,7 @@ void Body2DSW::set_param(Physics2DServer::BodyParameter p_param, real_t p_value)
_update_inertia();
} else {
user_inertia = true;
+ inertia = p_value;
_inv_inertia = 1.0 / p_value;
}
} break;
@@ -194,7 +192,7 @@ real_t Body2DSW::get_param(Physics2DServer::BodyParameter p_param) const {
return mass;
}
case Physics2DServer::BODY_PARAM_INERTIA: {
- return _inv_inertia == 0 ? 0 : 1.0 / _inv_inertia;
+ return inertia;
}
case Physics2DServer::BODY_PARAM_GRAVITY_SCALE: {
return gravity_scale;
@@ -226,6 +224,7 @@ void Body2DSW::set_mode(Physics2DServer::BodyMode p_mode) {
_set_inv_transform(get_transform().affine_inverse());
_inv_mass = 0;
+ _inv_inertia = 0;
_set_static(p_mode == Physics2DServer::BODY_MODE_STATIC);
set_active(p_mode == Physics2DServer::BODY_MODE_KINEMATIC && contacts.size());
linear_velocity = Vector2();
@@ -237,17 +236,21 @@ void Body2DSW::set_mode(Physics2DServer::BodyMode p_mode) {
case Physics2DServer::BODY_MODE_RIGID: {
_inv_mass = mass > 0 ? (1.0 / mass) : 0;
+ _inv_inertia = inertia > 0 ? (1.0 / inertia) : 0;
_set_static(false);
} break;
case Physics2DServer::BODY_MODE_CHARACTER: {
_inv_mass = mass > 0 ? (1.0 / mass) : 0;
+ _inv_inertia = 0;
_set_static(false);
+ angular_velocity = 0;
} break;
}
-
- _update_inertia();
+ if (p_mode == Physics2DServer::BODY_MODE_RIGID && _inv_inertia == 0) {
+ _update_inertia();
+ }
/*
if (get_space())
_update_queries();
@@ -668,6 +671,7 @@ Body2DSW::Body2DSW() :
angular_velocity = 0;
biased_angular_velocity = 0;
mass = 1;
+ inertia = 0;
user_inertia = false;
_inv_inertia = 0;
_inv_mass = 1;
diff --git a/servers/physics_2d/body_2d_sw.h b/servers/physics_2d/body_2d_sw.h
index 8c64dc9230..5df184c894 100644
--- a/servers/physics_2d/body_2d_sw.h
+++ b/servers/physics_2d/body_2d_sw.h
@@ -52,6 +52,7 @@ class Body2DSW : public CollisionObject2DSW {
real_t gravity_scale;
real_t mass;
+ real_t inertia;
real_t bounce;
real_t friction;
diff --git a/servers/visual/shader_language.cpp b/servers/visual/shader_language.cpp
index 5f39d3ff49..4bc65a8f4f 100644
--- a/servers/visual/shader_language.cpp
+++ b/servers/visual/shader_language.cpp
@@ -283,6 +283,7 @@ const ShaderLanguage::KeyWord ShaderLanguage::keyword_list[] = {
{ TK_CF_DO, "do" },
{ TK_CF_SWITCH, "switch" },
{ TK_CF_CASE, "case" },
+ { TK_CF_DEFAULT, "default" },
{ TK_CF_BREAK, "break" },
{ TK_CF_CONTINUE, "continue" },
{ TK_CF_RETURN, "return" },
@@ -3778,6 +3779,14 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const Map<StringName, Bui
TkPos pos = _get_tkpos();
Token tk = _get_token();
+
+ if (p_block && p_block->block_type == BlockNode::BLOCK_TYPE_SWITCH) {
+ if (tk.type != TK_CF_CASE && tk.type != TK_CF_DEFAULT && tk.type != TK_CURLY_BRACKET_CLOSE) {
+ _set_error("Switch may contains only case and default blocks");
+ return ERR_PARSE_ERROR;
+ }
+ }
+
if (tk.type == TK_CURLY_BRACKET_CLOSE) { //end of block
if (p_just_one) {
_set_error("Unexpected '}'");
@@ -3862,14 +3871,13 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const Map<StringName, Bui
return ERR_PARSE_ERROR;
}
+ decl.size = ((uint32_t)tk.constant);
tk = _get_token();
if (tk.type != TK_BRACKET_CLOSE) {
_set_error("Expected ']'");
return ERR_PARSE_ERROR;
}
-
- decl.size = ((uint32_t)tk.constant);
var.array_size = decl.size;
}
@@ -4022,6 +4030,10 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const Map<StringName, Bui
_set_error("Expected array initialization");
return ERR_PARSE_ERROR;
}
+ if (is_const) {
+ _set_error("Expected initialization of constant");
+ return ERR_PARSE_ERROR;
+ }
}
node->declarations.push_back(decl);
@@ -4051,6 +4063,11 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const Map<StringName, Bui
tk = _get_token();
node->declarations.push_back(decl);
} else {
+ if (is_const) {
+ _set_error("Expected initialization of constant");
+ return ERR_PARSE_ERROR;
+ }
+
VariableDeclarationNode *node = alloc_node<VariableDeclarationNode>();
node->datatype = type;
node->precision = precision;
@@ -4124,37 +4141,250 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const Map<StringName, Bui
} else {
_set_tkpos(pos); //rollback
}
- } else if (tk.type == TK_CF_WHILE) {
- //if () {}
+ } else if (tk.type == TK_CF_SWITCH) {
+ // switch() {}
tk = _get_token();
if (tk.type != TK_PARENTHESIS_OPEN) {
- _set_error("Expected '(' after while");
+ _set_error("Expected '(' after switch");
return ERR_PARSE_ERROR;
}
-
ControlFlowNode *cf = alloc_node<ControlFlowNode>();
- cf->flow_op = FLOW_OP_WHILE;
+ cf->flow_op = FLOW_OP_SWITCH;
Node *n = _parse_and_reduce_expression(p_block, p_builtin_types);
if (!n)
return ERR_PARSE_ERROR;
-
+ if (n->get_datatype() != TYPE_INT) {
+ _set_error("Expected integer expression");
+ return ERR_PARSE_ERROR;
+ }
tk = _get_token();
if (tk.type != TK_PARENTHESIS_CLOSE) {
_set_error("Expected ')' after expression");
return ERR_PARSE_ERROR;
}
+ tk = _get_token();
+ if (tk.type != TK_CURLY_BRACKET_OPEN) {
+ _set_error("Expected '{' after switch statement");
+ return ERR_PARSE_ERROR;
+ }
+ BlockNode *switch_block = alloc_node<BlockNode>();
+ switch_block->block_type = BlockNode::BLOCK_TYPE_SWITCH;
+ switch_block->parent_block = p_block;
+ cf->expressions.push_back(n);
+ cf->blocks.push_back(switch_block);
+ p_block->statements.push_back(cf);
- BlockNode *block = alloc_node<BlockNode>();
- block->parent_block = p_block;
+ int prev_type = TK_CF_CASE;
+ while (true) { // Go-through multiple cases.
+
+ if (_parse_block(switch_block, p_builtin_types, true, true, false) != OK) {
+ return ERR_PARSE_ERROR;
+ }
+ pos = _get_tkpos();
+ tk = _get_token();
+ if (tk.type == TK_CF_CASE || tk.type == TK_CF_DEFAULT) {
+ if (prev_type == TK_CF_DEFAULT) {
+ if (tk.type == TK_CF_CASE) {
+ _set_error("Cases must be defined before default case.");
+ return ERR_PARSE_ERROR;
+ } else if (prev_type == TK_CF_DEFAULT) {
+ _set_error("Default case must be defined only once.");
+ return ERR_PARSE_ERROR;
+ }
+ }
+ prev_type = tk.type;
+ _set_tkpos(pos);
+ continue;
+ } else {
+ Set<int> constants;
+ for (int i = 0; i < switch_block->statements.size(); i++) { // Checks for duplicates.
+ ControlFlowNode *flow = (ControlFlowNode *)switch_block->statements[i];
+ if (flow) {
+ if (flow->flow_op == FLOW_OP_CASE) {
+ ConstantNode *n2 = static_cast<ConstantNode *>(flow->expressions[0]);
+ if (!n2) {
+ return ERR_PARSE_ERROR;
+ }
+ if (n2->values.empty()) {
+ return ERR_PARSE_ERROR;
+ }
+ if (constants.has(n2->values[0].sint)) {
+ _set_error("Duplicated case label: '" + itos(n2->values[0].sint) + "'");
+ return ERR_PARSE_ERROR;
+ }
+ constants.insert(n2->values[0].sint);
+ } else if (flow->flow_op == FLOW_OP_DEFAULT) {
+ continue;
+ } else {
+ return ERR_PARSE_ERROR;
+ }
+ } else {
+ return ERR_PARSE_ERROR;
+ }
+ }
+ break;
+ }
+ }
+
+ } else if (tk.type == TK_CF_CASE) {
+ // case x : break; | return;
+
+ if (p_block && p_block->block_type == BlockNode::BLOCK_TYPE_CASE) {
+ _set_tkpos(pos);
+ return OK;
+ }
+
+ if (!p_block || (p_block->block_type != BlockNode::BLOCK_TYPE_SWITCH)) {
+ _set_error("case must be placed within switch block");
+ return ERR_PARSE_ERROR;
+ }
+
+ tk = _get_token();
+
+ int sign = 1;
+
+ if (tk.type == TK_OP_SUB) {
+ sign = -1;
+ tk = _get_token();
+ }
+
+ if (tk.type != TK_INT_CONSTANT) {
+ _set_error("Expected integer constant");
+ return ERR_PARSE_ERROR;
+ }
+
+ int constant = (int)tk.constant * sign;
+
+ tk = _get_token();
+
+ if (tk.type != TK_COLON) {
+ _set_error("Expected ':'");
+ return ERR_PARSE_ERROR;
+ }
+
+ ControlFlowNode *cf = alloc_node<ControlFlowNode>();
+ cf->flow_op = FLOW_OP_CASE;
+
+ ConstantNode *n = alloc_node<ConstantNode>();
+ ConstantNode::Value v;
+ v.sint = constant;
+ n->values.push_back(v);
+ n->datatype = TYPE_INT;
+
+ BlockNode *case_block = alloc_node<BlockNode>();
+ case_block->block_type = BlockNode::BLOCK_TYPE_CASE;
+ case_block->parent_block = p_block;
cf->expressions.push_back(n);
- cf->blocks.push_back(block);
+ cf->blocks.push_back(case_block);
p_block->statements.push_back(cf);
- Error err = _parse_block(block, p_builtin_types, true, true, true);
+ Error err = _parse_block(case_block, p_builtin_types, false, true, false);
+ if (err)
+ return err;
+
+ return OK;
+
+ } else if (tk.type == TK_CF_DEFAULT) {
+
+ if (p_block && p_block->block_type == BlockNode::BLOCK_TYPE_CASE) {
+ _set_tkpos(pos);
+ return OK;
+ }
+
+ if (!p_block || (p_block->block_type != BlockNode::BLOCK_TYPE_SWITCH)) {
+ _set_error("default must be placed within switch block");
+ return ERR_PARSE_ERROR;
+ }
+
+ tk = _get_token();
+
+ if (tk.type != TK_COLON) {
+ _set_error("Expected ':'");
+ return ERR_PARSE_ERROR;
+ }
+
+ ControlFlowNode *cf = alloc_node<ControlFlowNode>();
+ cf->flow_op = FLOW_OP_DEFAULT;
+
+ BlockNode *default_block = alloc_node<BlockNode>();
+ default_block->block_type = BlockNode::BLOCK_TYPE_DEFAULT;
+ default_block->parent_block = p_block;
+ cf->blocks.push_back(default_block);
+ p_block->statements.push_back(cf);
+
+ Error err = _parse_block(default_block, p_builtin_types, false, true, false);
if (err)
return err;
+
+ return OK;
+
+ } else if (tk.type == TK_CF_DO || tk.type == TK_CF_WHILE) {
+ // do {} while()
+ // while() {}
+ bool is_do = tk.type == TK_CF_DO;
+
+ BlockNode *do_block = NULL;
+ if (is_do) {
+
+ do_block = alloc_node<BlockNode>();
+ do_block->parent_block = p_block;
+
+ Error err = _parse_block(do_block, p_builtin_types, true, true, true);
+ if (err)
+ return err;
+
+ tk = _get_token();
+ if (tk.type != TK_CF_WHILE) {
+ _set_error("Expected while after do");
+ return ERR_PARSE_ERROR;
+ }
+ }
+ tk = _get_token();
+
+ if (tk.type != TK_PARENTHESIS_OPEN) {
+ _set_error("Expected '(' after while");
+ return ERR_PARSE_ERROR;
+ }
+
+ ControlFlowNode *cf = alloc_node<ControlFlowNode>();
+ if (is_do) {
+ cf->flow_op = FLOW_OP_DO;
+ } else {
+ cf->flow_op = FLOW_OP_WHILE;
+ }
+ Node *n = _parse_and_reduce_expression(p_block, p_builtin_types);
+ if (!n)
+ return ERR_PARSE_ERROR;
+
+ tk = _get_token();
+ if (tk.type != TK_PARENTHESIS_CLOSE) {
+ _set_error("Expected ')' after expression");
+ return ERR_PARSE_ERROR;
+ }
+ if (!is_do) {
+ BlockNode *block = alloc_node<BlockNode>();
+ block->parent_block = p_block;
+ cf->expressions.push_back(n);
+ cf->blocks.push_back(block);
+ p_block->statements.push_back(cf);
+
+ Error err = _parse_block(block, p_builtin_types, true, true, true);
+ if (err)
+ return err;
+ } else {
+
+ cf->expressions.push_back(n);
+ cf->blocks.push_back(do_block);
+ p_block->statements.push_back(cf);
+
+ tk = _get_token();
+ if (tk.type != TK_SEMICOLON) {
+ _set_error("Expected ';'");
+ return ERR_PARSE_ERROR;
+ }
+ }
} else if (tk.type == TK_CF_FOR) {
- //if () {}
+ // for() {}
tk = _get_token();
if (tk.type != TK_PARENTHESIS_OPEN) {
_set_error("Expected '(' after for");
@@ -4255,6 +4485,9 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const Map<StringName, Bui
}
p_block->statements.push_back(flow);
+ if (p_block->block_type == BlockNode::BLOCK_TYPE_CASE || p_block->block_type == BlockNode::BLOCK_TYPE_DEFAULT) {
+ return OK;
+ }
} else if (tk.type == TK_CF_DISCARD) {
//check return type
@@ -4301,9 +4534,13 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const Map<StringName, Bui
}
p_block->statements.push_back(flow);
+ if (p_block->block_type == BlockNode::BLOCK_TYPE_CASE || p_block->block_type == BlockNode::BLOCK_TYPE_DEFAULT) {
+ return OK;
+ }
+
} else if (tk.type == TK_CF_CONTINUE) {
- if (!p_can_break) {
+ if (!p_can_continue) {
//all is good
_set_error("Continuing is not allowed here");
}
@@ -4904,6 +5141,14 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
if (err)
return err;
+ if (func_node->return_type != DataType::TYPE_VOID) {
+
+ BlockNode *block = func_node->body;
+ if (_find_last_flow_op_in_block(block, FlowOperation::FLOW_OP_RETURN) != OK) {
+ _set_error("Expected at least one return statement in a non-void function.");
+ return ERR_PARSE_ERROR;
+ }
+ }
current_function = StringName();
}
}
@@ -4914,6 +5159,57 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
return OK;
}
+Error ShaderLanguage::_find_last_flow_op_in_op(ControlFlowNode *p_flow, FlowOperation p_op) {
+
+ bool found = false;
+
+ for (int i = p_flow->blocks.size() - 1; i >= 0; i--) {
+ if (p_flow->blocks[i]->type == Node::TYPE_BLOCK) {
+ BlockNode *last_block = (BlockNode *)p_flow->blocks[i];
+ if (_find_last_flow_op_in_block(last_block, p_op) == OK) {
+ found = true;
+ break;
+ }
+ }
+ }
+ if (found) {
+ return OK;
+ }
+ return FAILED;
+}
+
+Error ShaderLanguage::_find_last_flow_op_in_block(BlockNode *p_block, FlowOperation p_op) {
+
+ bool found = false;
+
+ for (int i = p_block->statements.size() - 1; i >= 0; i--) {
+
+ if (p_block->statements[i]->type == Node::TYPE_CONTROL_FLOW) {
+ ControlFlowNode *flow = (ControlFlowNode *)p_block->statements[i];
+ if (flow->flow_op == p_op) {
+ found = true;
+ break;
+ } else {
+ if (_find_last_flow_op_in_op(flow, p_op) == OK) {
+ found = true;
+ break;
+ }
+ }
+ } else if (p_block->statements[i]->type == Node::TYPE_BLOCK) {
+ BlockNode *block = (BlockNode *)p_block->statements[i];
+ if (_find_last_flow_op_in_block(block, p_op) == OK) {
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if (found) {
+ return OK;
+ }
+ return FAILED;
+}
+
// skips over whitespace and /* */ and // comments
static int _get_first_ident_pos(const String &p_code) {
diff --git a/servers/visual/shader_language.h b/servers/visual/shader_language.h
index 36c691c3ae..6753456323 100644
--- a/servers/visual/shader_language.h
+++ b/servers/visual/shader_language.h
@@ -125,6 +125,7 @@ public:
TK_CF_DO,
TK_CF_SWITCH,
TK_CF_CASE,
+ TK_CF_DEFAULT,
TK_CF_BREAK,
TK_CF_CONTINUE,
TK_CF_RETURN,
@@ -266,6 +267,8 @@ public:
FLOW_OP_DO,
FLOW_OP_BREAK,
FLOW_OP_SWITCH,
+ FLOW_OP_CASE,
+ FLOW_OP_DEFAULT,
FLOW_OP_CONTINUE,
FLOW_OP_DISCARD
};
@@ -420,6 +423,15 @@ public:
FunctionNode *parent_function;
BlockNode *parent_block;
+ enum BlockType {
+ BLOCK_TYPE_STANDART,
+ BLOCK_TYPE_SWITCH,
+ BLOCK_TYPE_CASE,
+ BLOCK_TYPE_DEFAULT,
+ };
+
+ int block_type;
+
struct Variable {
DataType type;
DataPrecision precision;
@@ -436,6 +448,7 @@ public:
Node(TYPE_BLOCK),
parent_function(NULL),
parent_block(NULL),
+ block_type(BLOCK_TYPE_STANDART),
single_statement(false) {}
};
@@ -737,6 +750,9 @@ private:
Error _parse_block(BlockNode *p_block, const Map<StringName, BuiltInInfo> &p_builtin_types, bool p_just_one = false, bool p_can_break = false, bool p_can_continue = false);
Error _parse_shader(const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types);
+ Error _find_last_flow_op_in_block(BlockNode *p_block, FlowOperation p_op);
+ Error _find_last_flow_op_in_op(ControlFlowNode *p_flow, FlowOperation p_op);
+
public:
//static void get_keyword_list(ShaderType p_type,List<String> *p_keywords);
diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h
index f37d651dee..dcfbd28dd6 100644
--- a/servers/visual/visual_server_raster.h
+++ b/servers/visual/visual_server_raster.h
@@ -38,9 +38,6 @@
#include "visual_server_globals.h"
#include "visual_server_scene.h"
#include "visual_server_viewport.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class VisualServerRaster : public VisualServer {
diff --git a/servers/visual/visual_server_wrap_mt.h b/servers/visual/visual_server_wrap_mt.h
index 24e50eb99e..41993d7c88 100644
--- a/servers/visual/visual_server_wrap_mt.h
+++ b/servers/visual/visual_server_wrap_mt.h
@@ -35,9 +35,6 @@
#include "core/os/thread.h"
#include "servers/visual_server.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class VisualServerWrapMT : public VisualServer {
// the real visual server
diff --git a/servers/visual_server.h b/servers/visual_server.h
index a84d395e3f..1b0164e5ca 100644
--- a/servers/visual_server.h
+++ b/servers/visual_server.h
@@ -39,9 +39,6 @@
#include "core/rid.h"
#include "core/variant.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
class VisualServer : public Object {
GDCLASS(VisualServer, Object);
diff --git a/thirdparty/README.md b/thirdparty/README.md
index 99f917dbc1..3f2fc6d8f9 100644
--- a/thirdparty/README.md
+++ b/thirdparty/README.md
@@ -513,7 +513,7 @@ File extracted from upstream release tarball:
## xatlas
- Upstream: https://github.com/jpcy/xatlas
-- Version: git (f65a664, 2019)
+- Version: git (b4b5426, 2019)
- License: MIT
Files extracted from upstream source:
diff --git a/thirdparty/assimp/assimp/config.h b/thirdparty/assimp/assimp/config.h
index 382a698268..d0e4817349 100644
--- a/thirdparty/assimp/assimp/config.h
+++ b/thirdparty/assimp/assimp/config.h
@@ -983,6 +983,13 @@ enum aiComponent {
#define AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT 1.0f
#endif // !! AI_DEBONE_THRESHOLD
+#define AI_CONFIG_APP_SCALE_KEY "APP_SCALE_FACTOR"
+
+#if (!defined AI_CONFIG_APP_SCALE_KEY)
+# define AI_CONFIG_APP_SCALE_KEY 1.0
+#endif // AI_CONFIG_APP_SCALE_KEY
+
+
// ---------- All the Build/Compile-time defines ------------
/** @brief Specifies if double precision is supported inside assimp
diff --git a/thirdparty/assimp/code/Common/BaseImporter.cpp b/thirdparty/assimp/code/Common/BaseImporter.cpp
index 0a5694aa0e..de5018a250 100644
--- a/thirdparty/assimp/code/Common/BaseImporter.cpp
+++ b/thirdparty/assimp/code/Common/BaseImporter.cpp
@@ -76,9 +76,25 @@ BaseImporter::~BaseImporter() {
// nothing to do here
}
+void BaseImporter::UpdateImporterScale( Importer* pImp )
+{
+ ai_assert(pImp != nullptr);
+ ai_assert(importerScale != 0.0);
+ ai_assert(fileScale != 0.0);
+
+ double activeScale = importerScale * fileScale;
+
+ // Set active scaling
+ pImp->SetPropertyFloat( AI_CONFIG_APP_SCALE_KEY, activeScale);
+
+ ASSIMP_LOG_DEBUG_F("UpdateImporterScale scale set: %f", activeScale );
+}
+
// ------------------------------------------------------------------------------------------------
// Imports the given file and returns the imported data.
-aiScene* BaseImporter::ReadFile(const Importer* pImp, const std::string& pFile, IOSystem* pIOHandler) {
+aiScene* BaseImporter::ReadFile(Importer* pImp, const std::string& pFile, IOSystem* pIOHandler) {
+
+
m_progress = pImp->GetProgressHandler();
if (nullptr == m_progress) {
return nullptr;
@@ -100,6 +116,11 @@ aiScene* BaseImporter::ReadFile(const Importer* pImp, const std::string& pFile,
{
InternReadFile( pFile, sc.get(), &filter);
+ // Calculate import scale hook - required because pImp not available anywhere else
+ // passes scale into ScaleProcess
+ UpdateImporterScale(pImp);
+
+
} catch( const std::exception& err ) {
// extract error description
m_ErrorText = err.what();
@@ -112,7 +133,7 @@ aiScene* BaseImporter::ReadFile(const Importer* pImp, const std::string& pFile,
}
// ------------------------------------------------------------------------------------------------
-void BaseImporter::SetupProperties(const Importer* /*pImp*/)
+void BaseImporter::SetupProperties(const Importer* pImp)
{
// the default implementation does nothing
}
@@ -588,6 +609,8 @@ aiScene* BatchLoader::GetImport( unsigned int which )
return nullptr;
}
+
+
// ------------------------------------------------------------------------------------------------
void BatchLoader::LoadAll()
{
diff --git a/thirdparty/assimp/code/FBX/FBXConverter.cpp b/thirdparty/assimp/code/FBX/FBXConverter.cpp
index 9f940d3226..9bd970098e 100644
--- a/thirdparty/assimp/code/FBX/FBXConverter.cpp
+++ b/thirdparty/assimp/code/FBX/FBXConverter.cpp
@@ -66,6 +66,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <vector>
#include <sstream>
#include <iomanip>
+#include <cstdint>
namespace Assimp {
@@ -90,7 +91,6 @@ namespace Assimp {
, anim_fps()
, out(out)
, doc(doc)
- , mRemoveEmptyBones( removeEmptyBones )
, mCurrentUnit(FbxUnit::cm) {
// animations need to be converted first since this will
// populate the node_anim_chain_bits map, which is needed
@@ -119,7 +119,6 @@ namespace Assimp {
ConvertGlobalSettings();
TransferDataToScene();
- ConvertToUnitScale(unit);
// if we didn't read any meshes set the AI_SCENE_FLAGS_INCOMPLETE
// to make sure the scene passes assimp's validation. FBX files
@@ -685,30 +684,37 @@ namespace Assimp {
bool ok;
aiMatrix4x4 chain[TransformationComp_MAXIMUM];
+
+ ai_assert(TransformationComp_MAXIMUM < 32);
+ std::uint32_t chainBits = 0;
+ // A node won't need a node chain if it only has these.
+ const std::uint32_t chainMaskSimple = (1 << TransformationComp_Translation) + (1 << TransformationComp_Scaling) + (1 << TransformationComp_Rotation);
+ // A node will need a node chain if it has any of these.
+ const std::uint32_t chainMaskComplex = ((1 << (TransformationComp_MAXIMUM)) - 1) - chainMaskSimple;
+
std::fill_n(chain, static_cast<unsigned int>(TransformationComp_MAXIMUM), aiMatrix4x4());
// generate transformation matrices for all the different transformation components
const float zero_epsilon = 1e-6f;
const aiVector3D all_ones(1.0f, 1.0f, 1.0f);
- bool is_complex = false;
const aiVector3D& PreRotation = PropertyGet<aiVector3D>(props, "PreRotation", ok);
if (ok && PreRotation.SquareLength() > zero_epsilon) {
- is_complex = true;
+ chainBits = chainBits | (1 << TransformationComp_PreRotation);
GetRotationMatrix(Model::RotOrder::RotOrder_EulerXYZ, PreRotation, chain[TransformationComp_PreRotation]);
}
const aiVector3D& PostRotation = PropertyGet<aiVector3D>(props, "PostRotation", ok);
if (ok && PostRotation.SquareLength() > zero_epsilon) {
- is_complex = true;
+ chainBits = chainBits | (1 << TransformationComp_PostRotation);
GetRotationMatrix(Model::RotOrder::RotOrder_EulerXYZ, PostRotation, chain[TransformationComp_PostRotation]);
}
const aiVector3D& RotationPivot = PropertyGet<aiVector3D>(props, "RotationPivot", ok);
if (ok && RotationPivot.SquareLength() > zero_epsilon) {
- is_complex = true;
+ chainBits = chainBits | (1 << TransformationComp_RotationPivot) | (1 << TransformationComp_RotationPivotInverse);
aiMatrix4x4::Translation(RotationPivot, chain[TransformationComp_RotationPivot]);
aiMatrix4x4::Translation(-RotationPivot, chain[TransformationComp_RotationPivotInverse]);
@@ -716,21 +722,21 @@ namespace Assimp {
const aiVector3D& RotationOffset = PropertyGet<aiVector3D>(props, "RotationOffset", ok);
if (ok && RotationOffset.SquareLength() > zero_epsilon) {
- is_complex = true;
+ chainBits = chainBits | (1 << TransformationComp_RotationOffset);
aiMatrix4x4::Translation(RotationOffset, chain[TransformationComp_RotationOffset]);
}
const aiVector3D& ScalingOffset = PropertyGet<aiVector3D>(props, "ScalingOffset", ok);
if (ok && ScalingOffset.SquareLength() > zero_epsilon) {
- is_complex = true;
+ chainBits = chainBits | (1 << TransformationComp_ScalingOffset);
aiMatrix4x4::Translation(ScalingOffset, chain[TransformationComp_ScalingOffset]);
}
const aiVector3D& ScalingPivot = PropertyGet<aiVector3D>(props, "ScalingPivot", ok);
if (ok && ScalingPivot.SquareLength() > zero_epsilon) {
- is_complex = true;
+ chainBits = chainBits | (1 << TransformationComp_ScalingPivot) | (1 << TransformationComp_ScalingPivotInverse);
aiMatrix4x4::Translation(ScalingPivot, chain[TransformationComp_ScalingPivot]);
aiMatrix4x4::Translation(-ScalingPivot, chain[TransformationComp_ScalingPivotInverse]);
@@ -738,22 +744,28 @@ namespace Assimp {
const aiVector3D& Translation = PropertyGet<aiVector3D>(props, "Lcl Translation", ok);
if (ok && Translation.SquareLength() > zero_epsilon) {
+ chainBits = chainBits | (1 << TransformationComp_Translation);
+
aiMatrix4x4::Translation(Translation, chain[TransformationComp_Translation]);
}
const aiVector3D& Scaling = PropertyGet<aiVector3D>(props, "Lcl Scaling", ok);
if (ok && (Scaling - all_ones).SquareLength() > zero_epsilon) {
+ chainBits = chainBits | (1 << TransformationComp_Scaling);
+
aiMatrix4x4::Scaling(Scaling, chain[TransformationComp_Scaling]);
}
const aiVector3D& Rotation = PropertyGet<aiVector3D>(props, "Lcl Rotation", ok);
if (ok && Rotation.SquareLength() > zero_epsilon) {
+ chainBits = chainBits | (1 << TransformationComp_Rotation);
+
GetRotationMatrix(rot, Rotation, chain[TransformationComp_Rotation]);
}
const aiVector3D& GeometricScaling = PropertyGet<aiVector3D>(props, "GeometricScaling", ok);
if (ok && (GeometricScaling - all_ones).SquareLength() > zero_epsilon) {
- is_complex = true;
+ chainBits = chainBits | (1 << TransformationComp_GeometricScaling);
aiMatrix4x4::Scaling(GeometricScaling, chain[TransformationComp_GeometricScaling]);
aiVector3D GeometricScalingInverse = GeometricScaling;
bool canscale = true;
@@ -768,13 +780,14 @@ namespace Assimp {
}
}
if (canscale) {
+ chainBits = chainBits | (1 << TransformationComp_GeometricScalingInverse);
aiMatrix4x4::Scaling(GeometricScalingInverse, chain[TransformationComp_GeometricScalingInverse]);
}
}
const aiVector3D& GeometricRotation = PropertyGet<aiVector3D>(props, "GeometricRotation", ok);
if (ok && GeometricRotation.SquareLength() > zero_epsilon) {
- is_complex = true;
+ chainBits = chainBits | (1 << TransformationComp_GeometricRotation) | (1 << TransformationComp_GeometricRotationInverse);
GetRotationMatrix(rot, GeometricRotation, chain[TransformationComp_GeometricRotation]);
GetRotationMatrix(rot, GeometricRotation, chain[TransformationComp_GeometricRotationInverse]);
chain[TransformationComp_GeometricRotationInverse].Inverse();
@@ -782,7 +795,7 @@ namespace Assimp {
const aiVector3D& GeometricTranslation = PropertyGet<aiVector3D>(props, "GeometricTranslation", ok);
if (ok && GeometricTranslation.SquareLength() > zero_epsilon) {
- is_complex = true;
+ chainBits = chainBits | (1 << TransformationComp_GeometricTranslation) | (1 << TransformationComp_GeometricTranslationInverse);
aiMatrix4x4::Translation(GeometricTranslation, chain[TransformationComp_GeometricTranslation]);
aiMatrix4x4::Translation(-GeometricTranslation, chain[TransformationComp_GeometricTranslationInverse]);
}
@@ -790,12 +803,12 @@ namespace Assimp {
// is_complex needs to be consistent with NeedsComplexTransformationChain()
// or the interplay between this code and the animation converter would
// not be guaranteed.
- ai_assert(NeedsComplexTransformationChain(model) == is_complex);
+ ai_assert(NeedsComplexTransformationChain(model) == ((chainBits & chainMaskComplex) != 0));
// now, if we have more than just Translation, Scaling and Rotation,
// we need to generate a full node chain to accommodate for assimp's
// lack to express pivots and offsets.
- if (is_complex && doc.Settings().preservePivots) {
+ if ((chainBits & chainMaskComplex) && doc.Settings().preservePivots) {
FBXImporter::LogInfo("generating full transformation chain for node: " + name);
// query the anim_chain_bits dictionary to find out which chain elements
@@ -808,7 +821,7 @@ namespace Assimp {
for (size_t i = 0; i < TransformationComp_MAXIMUM; ++i, bit <<= 1) {
const TransformationComp comp = static_cast<TransformationComp>(i);
- if (chain[i].IsIdentity() && (anim_chain_bitmask & bit) == 0) {
+ if ((chainBits & bit) == 0 && (anim_chain_bitmask & bit) == 0) {
continue;
}
@@ -1462,14 +1475,8 @@ namespace Assimp {
const WeightIndexArray& indices = cluster->GetIndices();
- if (indices.empty() && mRemoveEmptyBones ) {
- continue;
- }
-
const MatIndexArray& mats = geo.GetMaterialIndices();
- bool ok = false;
-
const size_t no_index_sentinel = std::numeric_limits<size_t>::max();
count_out_indices.clear();
@@ -1509,8 +1516,7 @@ namespace Assimp {
out_indices.push_back(std::distance(outputVertStartIndices->begin(), it));
}
- ++count_out_indices.back();
- ok = true;
+ ++count_out_indices.back();
}
}
}
@@ -1518,10 +1524,8 @@ namespace Assimp {
// if we found at least one, generate the output bones
// XXX this could be heavily simplified by collecting the bone
// data in a single step.
- if (ok && mRemoveEmptyBones) {
- ConvertCluster(bones, model, *cluster, out_indices, index_out_indices,
+ ConvertCluster(bones, model, *cluster, out_indices, index_out_indices,
count_out_indices, node_global_transform);
- }
}
}
catch (std::exception&) {
@@ -3532,46 +3536,6 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa
out->mMetaData->Set(14, "CustomFrameRate", doc.GlobalSettings().CustomFrameRate());
}
- void FBXConverter::ConvertToUnitScale( FbxUnit unit ) {
- if (mCurrentUnit == unit) {
- return;
- }
-
- ai_real scale = 1.0;
- if (mCurrentUnit == FbxUnit::cm) {
- if (unit == FbxUnit::m) {
- scale = (ai_real)0.01;
- } else if (unit == FbxUnit::km) {
- scale = (ai_real)0.00001;
- }
- } else if (mCurrentUnit == FbxUnit::m) {
- if (unit == FbxUnit::cm) {
- scale = (ai_real)100.0;
- } else if (unit == FbxUnit::km) {
- scale = (ai_real)0.001;
- }
- } else if (mCurrentUnit == FbxUnit::km) {
- if (unit == FbxUnit::cm) {
- scale = (ai_real)100000.0;
- } else if (unit == FbxUnit::m) {
- scale = (ai_real)1000.0;
- }
- }
-
- for (auto mesh : meshes) {
- if (nullptr == mesh) {
- continue;
- }
-
- if (mesh->HasPositions()) {
- for (unsigned int i = 0; i < mesh->mNumVertices; ++i) {
- aiVector3D &pos = mesh->mVertices[i];
- pos *= scale;
- }
- }
- }
- }
-
void FBXConverter::TransferDataToScene()
{
ai_assert(!out->mMeshes);
diff --git a/thirdparty/assimp/code/FBX/FBXConverter.h b/thirdparty/assimp/code/FBX/FBXConverter.h
index 17a7bc56b7..b458627392 100644
--- a/thirdparty/assimp/code/FBX/FBXConverter.h
+++ b/thirdparty/assimp/code/FBX/FBXConverter.h
@@ -431,10 +431,6 @@ private:
void ConvertGlobalSettings();
// ------------------------------------------------------------------------------------------------
- // Will perform the conversion from a given unit to the requested unit.
- void ConvertToUnitScale(FbxUnit unit);
-
- // ------------------------------------------------------------------------------------------------
// copy generated meshes, animations, lights, cameras and textures to the output scene
void TransferDataToScene();
@@ -470,9 +466,6 @@ private:
aiScene* const out;
const FBX::Document& doc;
-
- bool mRemoveEmptyBones;
-
FbxUnit mCurrentUnit;
};
diff --git a/thirdparty/assimp/code/FBX/FBXDocument.cpp b/thirdparty/assimp/code/FBX/FBXDocument.cpp
index 1af08fe6d8..506fd978dd 100644
--- a/thirdparty/assimp/code/FBX/FBXDocument.cpp
+++ b/thirdparty/assimp/code/FBX/FBXDocument.cpp
@@ -90,14 +90,6 @@ const Object* LazyObject::Get(bool dieOnError)
return object.get();
}
- // if this is the root object, we return a dummy since there
- // is no root object int he fbx file - it is just referenced
- // with id 0.
- if(id == 0L) {
- object.reset(new Object(id, element, "Model::RootNode"));
- return object.get();
- }
-
const Token& key = element.KeyToken();
const TokenList& tokens = element.Tokens();
diff --git a/thirdparty/assimp/code/FBX/FBXExporter.cpp b/thirdparty/assimp/code/FBX/FBXExporter.cpp
index 153e676506..8ebc8555a2 100644
--- a/thirdparty/assimp/code/FBX/FBXExporter.cpp
+++ b/thirdparty/assimp/code/FBX/FBXExporter.cpp
@@ -1706,8 +1706,7 @@ void FBXExporter::WriteObjects ()
}
if (end) { break; }
}
- limbnodes.insert(parent);
- skeleton.insert(parent);
+
// if it was the skeleton root we can finish here
if (end) { break; }
}
@@ -1848,44 +1847,10 @@ void FBXExporter::WriteObjects ()
inverse_bone_xform.Inverse();
aiMatrix4x4 tr = inverse_bone_xform * mesh_xform;
- // this should be the same as the bone's mOffsetMatrix.
- // if it's not the same, the skeleton isn't in the bind pose.
- float epsilon = 1e-4f; // some error is to be expected
- float epsilon_custom = mProperties->GetPropertyFloat("BINDPOSE_EPSILON", -1);
- if(epsilon_custom > 0)
- epsilon = epsilon_custom;
- bool bone_xform_okay = true;
- if (b && ! tr.Equal(b->mOffsetMatrix, epsilon)) {
- not_in_bind_pose.insert(b);
- bone_xform_okay = false;
- }
+ sdnode.AddChild("Transform", tr);
- // if we have a bone we should use the mOffsetMatrix,
- // otherwise try to just use the calculated transform.
- if (b) {
- sdnode.AddChild("Transform", b->mOffsetMatrix);
- } else {
- sdnode.AddChild("Transform", tr);
- }
- // note: it doesn't matter if we mix these,
- // because if they disagree we'll throw an exception later.
- // it could be that the skeleton is not in the bone pose
- // but all bones are still defined,
- // in which case this would use the mOffsetMatrix for everything
- // and a correct skeleton would still be output.
-
- // transformlink should be the position of the bone in world space.
- // if the bone is in the bind pose (or nonexistent),
- // we can just use the matrix we already calculated
- if (bone_xform_okay) {
- sdnode.AddChild("TransformLink", bone_xform);
- // otherwise we can only work it out using the mesh position.
- } else {
- aiMatrix4x4 trl = b->mOffsetMatrix;
- trl.Inverse();
- trl *= mesh_xform;
- sdnode.AddChild("TransformLink", trl);
- }
+
+ sdnode.AddChild("TransformLink", bone_xform);
// note: this means we ALWAYS rely on the mesh node transform
// being unchanged from the time the skeleton was bound.
// there's not really any way around this at the moment.
diff --git a/thirdparty/assimp/code/FBX/FBXImporter.cpp b/thirdparty/assimp/code/FBX/FBXImporter.cpp
index ec8bbd2b47..bd359dbf29 100644
--- a/thirdparty/assimp/code/FBX/FBXImporter.cpp
+++ b/thirdparty/assimp/code/FBX/FBXImporter.cpp
@@ -189,8 +189,16 @@ void FBXImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS
if (settings.convertToMeters) {
unit = FbxUnit::m;
}
+
// convert the FBX DOM to aiScene
- ConvertToAssimpScene(pScene,doc, settings.removeEmptyBones, unit);
+ ConvertToAssimpScene(pScene, doc, settings.removeEmptyBones, unit);
+
+ // size relative to cm
+ float size_relative_to_cm = doc.GlobalSettings().UnitScaleFactor();
+
+ // Set FBX file scale is relative to CM must be converted to M for
+ // assimp universal format (M)
+ SetFileScale( size_relative_to_cm * 0.01f);
std::for_each(tokens.begin(),tokens.end(),Util::delete_fun<Token>());
}
diff --git a/thirdparty/assimp/code/FBX/FBXMeshGeometry.cpp b/thirdparty/assimp/code/FBX/FBXMeshGeometry.cpp
index 44a0264ca0..5c9a0e309d 100644
--- a/thirdparty/assimp/code/FBX/FBXMeshGeometry.cpp
+++ b/thirdparty/assimp/code/FBX/FBXMeshGeometry.cpp
@@ -115,7 +115,6 @@ MeshGeometry::MeshGeometry(uint64_t id, const Element& element, const std::strin
if(tempVerts.empty()) {
FBXImporter::LogWarn("encountered mesh with no vertices");
- return;
}
std::vector<int> tempFaces;
@@ -123,7 +122,6 @@ MeshGeometry::MeshGeometry(uint64_t id, const Element& element, const std::strin
if(tempFaces.empty()) {
FBXImporter::LogWarn("encountered mesh with no faces");
- return;
}
m_vertices.reserve(tempFaces.size());
@@ -612,7 +610,10 @@ void MeshGeometry::ReadVertexDataMaterials(std::vector<int>& materials_out, cons
const std::string& ReferenceInformationType)
{
const size_t face_count = m_faces.size();
- ai_assert(face_count);
+ if(face_count <= 0)
+ {
+ return;
+ }
// materials are handled separately. First of all, they are assigned per-face
// and not per polyvert. Secondly, ReferenceInformationType=IndexToDirect
diff --git a/thirdparty/assimp/code/PostProcessing/CalcTangentsProcess.cpp b/thirdparty/assimp/code/PostProcessing/CalcTangentsProcess.cpp
index b30f39c274..a3f7dd2557 100644
--- a/thirdparty/assimp/code/PostProcessing/CalcTangentsProcess.cpp
+++ b/thirdparty/assimp/code/PostProcessing/CalcTangentsProcess.cpp
@@ -212,7 +212,7 @@ bool CalcTangentsProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex)
// project tangent and bitangent into the plane formed by the vertex' normal
aiVector3D localTangent = tangent - meshNorm[p] * (tangent * meshNorm[p]);
aiVector3D localBitangent = bitangent - meshNorm[p] * (bitangent * meshNorm[p]);
- localTangent.Normalize(); localBitangent.Normalize();
+ localTangent.NormalizeSafe(); localBitangent.NormalizeSafe();
// reconstruct tangent/bitangent according to normal and bitangent/tangent when it's infinite or NaN.
bool invalid_tangent = is_special_float(localTangent.x) || is_special_float(localTangent.y) || is_special_float(localTangent.z);
@@ -220,10 +220,10 @@ bool CalcTangentsProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex)
if (invalid_tangent != invalid_bitangent) {
if (invalid_tangent) {
localTangent = meshNorm[p] ^ localBitangent;
- localTangent.Normalize();
+ localTangent.NormalizeSafe();
} else {
localBitangent = localTangent ^ meshNorm[p];
- localBitangent.Normalize();
+ localBitangent.NormalizeSafe();
}
}
diff --git a/thirdparty/assimp/code/PostProcessing/ScaleProcess.cpp b/thirdparty/assimp/code/PostProcessing/ScaleProcess.cpp
index 6d458c4b11..ac770c41f2 100644
--- a/thirdparty/assimp/code/PostProcessing/ScaleProcess.cpp
+++ b/thirdparty/assimp/code/PostProcessing/ScaleProcess.cpp
@@ -39,19 +39,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------
*/
-#ifndef ASSIMP_BUILD_NO_GLOBALSCALE_PROCESS
-
#include "ScaleProcess.h"
#include <assimp/scene.h>
#include <assimp/postprocess.h>
+#include <assimp/BaseImporter.h>
namespace Assimp {
ScaleProcess::ScaleProcess()
: BaseProcess()
, mScale( AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT ) {
- // empty
}
ScaleProcess::~ScaleProcess() {
@@ -71,10 +69,26 @@ bool ScaleProcess::IsActive( unsigned int pFlags ) const {
}
void ScaleProcess::SetupProperties( const Importer* pImp ) {
- mScale = pImp->GetPropertyFloat( AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY, 0 );
+ // User scaling
+ mScale = pImp->GetPropertyFloat( AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY, 1.0f );
+
+ // File scaling * Application Scaling
+ float importerScale = pImp->GetPropertyFloat( AI_CONFIG_APP_SCALE_KEY, 1.0f );
+
+ // apply scale to the scale
+ // helps prevent bugs with backward compatibility for anyone using normal scaling.
+ mScale *= importerScale;
}
void ScaleProcess::Execute( aiScene* pScene ) {
+ if(mScale == 1.0f) {
+ return; // nothing to scale
+ }
+
+ ai_assert( mScale != 0 );
+ ai_assert( nullptr != pScene );
+ ai_assert( nullptr != pScene->mRootNode );
+
if ( nullptr == pScene ) {
return;
}
@@ -82,22 +96,113 @@ void ScaleProcess::Execute( aiScene* pScene ) {
if ( nullptr == pScene->mRootNode ) {
return;
}
+
+ // Process animations and update position transform to new unit system
+ for( unsigned int animationID = 0; animationID < pScene->mNumAnimations; animationID++ )
+ {
+ aiAnimation* animation = pScene->mAnimations[animationID];
+
+ for( unsigned int animationChannel = 0; animationChannel < animation->mNumChannels; animationChannel++)
+ {
+ aiNodeAnim* anim = animation->mChannels[animationChannel];
+
+ for( unsigned int posKey = 0; posKey < anim->mNumPositionKeys; posKey++)
+ {
+ aiVectorKey& vectorKey = anim->mPositionKeys[posKey];
+ vectorKey.mValue *= mScale;
+ }
+ }
+ }
+
+ for( unsigned int meshID = 0; meshID < pScene->mNumMeshes; meshID++)
+ {
+ aiMesh *mesh = pScene->mMeshes[meshID];
+
+ // Reconstruct mesh vertexes to the new unit system
+ for( unsigned int vertexID = 0; vertexID < mesh->mNumVertices; vertexID++)
+ {
+ aiVector3D& vertex = mesh->mVertices[vertexID];
+ vertex *= mScale;
+ }
+
+
+ // bone placement / scaling
+ for( unsigned int boneID = 0; boneID < mesh->mNumBones; boneID++)
+ {
+ // Reconstruct matrix by transform rather than by scale
+ // This prevent scale values being changed which can
+ // be meaningful in some cases
+ // like when you want the modeller to see 1:1 compatibility.
+ aiBone* bone = mesh->mBones[boneID];
+
+ aiVector3D pos, scale;
+ aiQuaternion rotation;
+
+ bone->mOffsetMatrix.Decompose( scale, rotation, pos);
+
+ aiMatrix4x4 translation;
+ aiMatrix4x4::Translation( pos * mScale, translation );
+
+ aiMatrix4x4 scaling;
+ aiMatrix4x4::Scaling( aiVector3D(scale), scaling );
+
+ aiMatrix4x4 RotMatrix = aiMatrix4x4 (rotation.GetMatrix());
+
+ bone->mOffsetMatrix = translation * RotMatrix * scaling;
+ }
+
+
+ // animation mesh processing
+ // convert by position rather than scale.
+ for( unsigned int animMeshID = 0; animMeshID < mesh->mNumAnimMeshes; animMeshID++)
+ {
+ aiAnimMesh * animMesh = mesh->mAnimMeshes[animMeshID];
+
+ for( unsigned int vertexID = 0; vertexID < animMesh->mNumVertices; vertexID++)
+ {
+ aiVector3D& vertex = animMesh->mVertices[vertexID];
+ vertex *= mScale;
+ }
+ }
+ }
traverseNodes( pScene->mRootNode );
}
-void ScaleProcess::traverseNodes( aiNode *node ) {
+void ScaleProcess::traverseNodes( aiNode *node, unsigned int nested_node_id ) {
applyScaling( node );
+
+ for( size_t i = 0; i < node->mNumChildren; i++)
+ {
+ // recurse into the tree until we are done!
+ traverseNodes( node->mChildren[i], nested_node_id+1 );
+ }
}
void ScaleProcess::applyScaling( aiNode *currentNode ) {
if ( nullptr != currentNode ) {
- currentNode->mTransformation.a1 = currentNode->mTransformation.a1 * mScale;
- currentNode->mTransformation.b2 = currentNode->mTransformation.b2 * mScale;
- currentNode->mTransformation.c3 = currentNode->mTransformation.c3 * mScale;
+ // Reconstruct matrix by transform rather than by scale
+ // This prevent scale values being changed which can
+ // be meaningful in some cases
+ // like when you want the modeller to
+ // see 1:1 compatibility.
+
+ aiVector3D pos, scale;
+ aiQuaternion rotation;
+ currentNode->mTransformation.Decompose( scale, rotation, pos);
+
+ aiMatrix4x4 translation;
+ aiMatrix4x4::Translation( pos * mScale, translation );
+
+ aiMatrix4x4 scaling;
+
+ // note: we do not use mScale here, this is on purpose.
+ aiMatrix4x4::Scaling( scale, scaling );
+
+ aiMatrix4x4 RotMatrix = aiMatrix4x4 (rotation.GetMatrix());
+
+ currentNode->mTransformation = translation * RotMatrix * scaling;
}
}
} // Namespace Assimp
-
-#endif // !! ASSIMP_BUILD_NO_GLOBALSCALE_PROCESS
diff --git a/thirdparty/assimp/code/PostProcessing/ScaleProcess.h b/thirdparty/assimp/code/PostProcessing/ScaleProcess.h
index 2567378759..468a216736 100644
--- a/thirdparty/assimp/code/PostProcessing/ScaleProcess.h
+++ b/thirdparty/assimp/code/PostProcessing/ScaleProcess.h
@@ -39,7 +39,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------
*/
-#pragma once
+#ifndef SCALE_PROCESS_H_
+#define SCALE_PROCESS_H_
#include "Common/BaseProcess.h"
@@ -53,6 +54,11 @@ namespace Assimp {
// ---------------------------------------------------------------------------
/** ScaleProcess: Class to rescale the whole model.
+ * Now rescales animations, bones, and blend shapes properly.
+ * Please note this will not write to 'scale' transform it will rewrite mesh
+ * and matrixes so that your scale values
+ * from your model package are preserved, so this is completely intentional
+ * bugs should be reported as soon as they are found.
*/
class ASSIMP_API ScaleProcess : public BaseProcess {
public:
@@ -78,7 +84,7 @@ public:
virtual void Execute( aiScene* pScene );
private:
- void traverseNodes( aiNode *currentNode );
+ void traverseNodes( aiNode *currentNode, unsigned int nested_node_id = 0 );
void applyScaling( aiNode *currentNode );
private:
@@ -86,3 +92,6 @@ private:
};
} // Namespace Assimp
+
+
+#endif // SCALE_PROCESS_H_ \ No newline at end of file
diff --git a/thirdparty/assimp/contrib/utf8cpp/doc/ReleaseNotes b/thirdparty/assimp/contrib/utf8cpp/doc/ReleaseNotes
new file mode 100644
index 0000000000..364411a23d
--- /dev/null
+++ b/thirdparty/assimp/contrib/utf8cpp/doc/ReleaseNotes
@@ -0,0 +1,12 @@
+utf8 cpp library
+Release 2.3.4
+
+A minor bug fix release. Thanks to all who reported bugs.
+
+Note: Version 2.3.3 contained a regression, and therefore was removed.
+
+Changes from version 2.3.2
+- Bug fix [39]: checked.h Line 273 and unchecked.h Line 182 have an extra ';'
+- Bug fix [36]: replace_invalid() only works with back_inserter
+
+Files included in the release: utf8.h, core.h, checked.h, unchecked.h, utf8cpp.html, ReleaseNotes
diff --git a/thirdparty/assimp/contrib/utf8cpp/doc/utf8cpp.html b/thirdparty/assimp/contrib/utf8cpp/doc/utf8cpp.html
new file mode 100644
index 0000000000..6f2aacbe7b
--- /dev/null
+++ b/thirdparty/assimp/contrib/utf8cpp/doc/utf8cpp.html
@@ -0,0 +1,1789 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <meta name="generator" content=
+ "HTML Tidy for Linux/x86 (vers 1st November 2002), see www.w3.org">
+ <meta name="description" content=
+ "A simple, portable and lightweigt C++ library for easy handling of UTF-8 encoded strings">
+ <meta name="keywords" content="UTF-8 C++ portable utf8 unicode generic templates">
+ <meta name="author" content="Nemanja Trifunovic">
+ <title>
+ UTF8-CPP: UTF-8 with C++ in a Portable Way
+ </title>
+ <style type="text/css">
+ <!--
+ span.return_value {
+ color: brown;
+ }
+ span.keyword {
+ color: blue;
+ }
+ span.preprocessor {
+ color: navy;
+ }
+ span.literal {
+ color: olive;
+ }
+ span.comment {
+ color: green;
+ }
+ code {
+ font-weight: bold;
+ }
+ ul.toc {
+ list-style-type: none;
+ }
+ p.version {
+ font-size: small;
+ font-style: italic;
+ }
+ -->
+ </style>
+ </head>
+ <body>
+ <h1>
+ UTF8-CPP: UTF-8 with C++ in a Portable Way
+ </h1>
+ <p>
+ <a href="https://sourceforge.net/projects/utfcpp">The Sourceforge project page</a>
+ </p>
+ <div id="toc">
+ <h2>
+ Table of Contents
+ </h2>
+ <ul class="toc">
+ <li>
+ <a href="#introduction">Introduction</a>
+ </li>
+ <li>
+ <a href="#examples">Examples of Use</a>
+ <ul class="toc">
+ <li>
+ <a href=#introsample>Introductionary Sample </a>
+ </li>
+ <li>
+ <a href=#validfile>Checking if a file contains valid UTF-8 text</a>
+ </li>
+ <li>
+ <a href=#fixinvalid>Ensure that a string contains valid UTF-8 text</a>
+ </li>
+ </ul>
+ <li>
+ <a href="#reference">Reference</a>
+ <ul class="toc">
+ <li>
+ <a href="#funutf8">Functions From utf8 Namespace </a>
+ </li>
+ <li>
+ <a href="#typesutf8">Types From utf8 Namespace </a>
+ </li>
+ <li>
+ <a href="#fununchecked">Functions From utf8::unchecked Namespace </a>
+ </li>
+ <li>
+ <a href="#typesunchecked">Types From utf8::unchecked Namespace </a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="#points">Points of Interest</a>
+ </li>
+ <li>
+ <a href="#links">Links</a>
+ </li>
+ </ul>
+ </div>
+ <h2 id="introduction">
+ Introduction
+ </h2>
+ <p>
+ Many C++ developers miss an easy and portable way of handling Unicode encoded
+ strings. The original C++ Standard (known as C++98 or C++03) is Unicode agnostic.
+ C++11 provides some support for Unicode on core language and library level:
+ u8, u, and U character and string literals, char16_t and char32_t character types,
+ u16string and u32string library classes, and codecvt support for conversions
+ between Unicode encoding forms.
+ In the meantime, developers use third party libraries like ICU, OS specific capabilities, or simply
+ roll out their own solutions.
+ </p>
+ <p>
+ In order to easily handle UTF-8 encoded Unicode strings, I came up with a small
+ generic library. For anybody used to work with STL algorithms and iterators, it should be
+ easy and natural to use. The code is freely available for any purpose - check out
+ the license at the beginning of the utf8.h file. If you run into
+ bugs or performance issues, please let me know and I'll do my best to address them.
+ </p>
+ <p>
+ The purpose of this article is not to offer an introduction to Unicode in general,
+ and UTF-8 in particular. If you are not familiar with Unicode, be sure to check out
+ <a href="http://www.unicode.org/">Unicode Home Page</a> or some other source of
+ information for Unicode. Also, it is not my aim to advocate the use of UTF-8
+ encoded strings in C++ programs; if you want to handle UTF-8 encoded strings from
+ C++, I am sure you have good reasons for it.
+ </p>
+ <h2 id="examples">
+ Examples of use
+ </h2>
+ <h3 id="introsample">
+ Introductionary Sample
+ </h3>
+ <p>
+ To illustrate the use of the library, let's start with a small but complete program
+ that opens a file containing UTF-8 encoded text, reads it line by line, checks each line
+ for invalid UTF-8 byte sequences, and converts it to UTF-16 encoding and back to UTF-8:
+ </p>
+<pre>
+<span class="preprocessor">#include &lt;fstream&gt;</span>
+<span class="preprocessor">#include &lt;iostream&gt;</span>
+<span class="preprocessor">#include &lt;string&gt;</span>
+<span class="preprocessor">#include &lt;vector&gt;</span>
+<span class="preprocessor">#include "utf8.h"</span>
+<span class="keyword">using namespace</span> std;
+<span class="keyword">int</span> main(<span class="keyword">int</span> argc, <span class="keyword">char</span>** argv)
+{
+ <span class="keyword">if</span> (argc != <span class="literal">2</span>) {
+ cout &lt;&lt; <span class="literal">"\nUsage: docsample filename\n"</span>;
+ <span class="keyword">return</span> <span class="literal">0</span>;
+ }
+
+ <span class="keyword">const char</span>* test_file_path = argv[1];
+ <span class="comment">// Open the test file (contains UTF-8 encoded text)</span>
+ ifstream fs8(test_file_path);
+ <span class="keyword">if</span> (!fs8.is_open()) {
+ cout &lt;&lt; <span class=
+"literal">"Could not open "</span> &lt;&lt; test_file_path &lt;&lt; endl;
+ <span class="keyword">return</span> <span class="literal">0</span>;
+ }
+
+ <span class="keyword">unsigned</span> line_count = <span class="literal">1</span>;
+ string line;
+ <span class="comment">// Play with all the lines in the file</span>
+ <span class="keyword">while</span> (getline(fs8, line)) {
+ <span class="comment">// check for invalid utf-8 (for a simple yes/no check, there is also utf8::is_valid function)</span>
+ string::iterator end_it = utf8::find_invalid(line.begin(), line.end());
+ <span class="keyword">if</span> (end_it != line.end()) {
+ cout &lt;&lt; <span class=
+"literal">"Invalid UTF-8 encoding detected at line "</span> &lt;&lt; line_count &lt;&lt; <span
+ class="literal">"\n"</span>;
+ cout &lt;&lt; <span class=
+"literal">"This part is fine: "</span> &lt;&lt; string(line.begin(), end_it) &lt;&lt; <span
+ class="literal">"\n"</span>;
+ }
+
+ <span class="comment">// Get the line length (at least for the valid part)</span>
+ <span class="keyword">int</span> length = utf8::distance(line.begin(), end_it);
+ cout &lt;&lt; <span class=
+"literal">"Length of line "</span> &lt;&lt; line_count &lt;&lt; <span class=
+"literal">" is "</span> &lt;&lt; length &lt;&lt; <span class="literal">"\n"</span>;
+
+ <span class="comment">// Convert it to utf-16</span>
+ vector&lt;unsigned short&gt; utf16line;
+ utf8::utf8to16(line.begin(), end_it, back_inserter(utf16line));
+
+ <span class="comment">// And back to utf-8</span>
+ string utf8line;
+ utf8::utf16to8(utf16line.begin(), utf16line.end(), back_inserter(utf8line));
+
+ <span class="comment">// Confirm that the conversion went OK:</span>
+ <span class="keyword">if</span> (utf8line != string(line.begin(), end_it))
+ cout &lt;&lt; <span class=
+"literal">"Error in UTF-16 conversion at line: "</span> &lt;&lt; line_count &lt;&lt; <span
+ class="literal">"\n"</span>;
+
+ line_count++;
+ }
+ <span class="keyword">return</span> <span class="literal">0</span>;
+}
+</pre>
+ <p>
+ In the previous code sample, for each line we performed
+ a detection of invalid UTF-8 sequences with <code>find_invalid</code>; the number
+ of characters (more precisely - the number of Unicode code points, including the end
+ of line and even BOM if there is one) in each line was
+ determined with a use of <code>utf8::distance</code>; finally, we have converted
+ each line to UTF-16 encoding with <code>utf8to16</code> and back to UTF-8 with
+ <code>utf16to8</code>.
+ </p>
+ <h3 id="validfile">Checking if a file contains valid UTF-8 text</h3>
+<p>
+Here is a function that checks whether the content of a file is valid UTF-8 encoded text without
+reading the content into the memory:
+</p>
+<pre>
+<span class="keyword">bool</span> valid_utf8_file(i<span class="keyword">const char</span>* file_name)
+{
+ ifstream ifs(file_name);
+ <span class="keyword">if</span> (!ifs)
+ <span class="keyword">return false</span>; <span class="comment">// even better, throw here</span>
+
+ istreambuf_iterator&lt;<span class="keyword">char</span>&gt; it(ifs.rdbuf());
+ istreambuf_iterator&lt;<span class="keyword">char</span>&gt; eos;
+
+ <span class="keyword">return</span> utf8::is_valid(it, eos);
+}
+</pre>
+<p>
+Because the function <code>utf8::is_valid()</code> works with input iterators, we were able
+to pass an <code>istreambuf_iterator</code> to it and read the content of the file directly
+without loading it to the memory first.</p>
+<p>
+Note that other functions that take input iterator arguments can be used in a similar way. For
+instance, to read the content of a UTF-8 encoded text file and convert the text to UTF-16, just
+do something like:
+</p>
+<pre>
+ utf8::utf8to16(it, eos, back_inserter(u16string));
+</pre>
+ <h3 id="fixinvalid">Ensure that a string contains valid UTF-8 text</h3>
+<p>
+If we have some text that "probably" contains UTF-8 encoded text and we want to
+replace any invalid UTF-8 sequence with a replacement character, something like
+the following function may be used:
+</p>
+<pre>
+<span class="keyword">void</span> fix_utf8_string(std::string&amp; str)
+{
+ std::string temp;
+ utf8::replace_invalid(str.begin(), str.end(), back_inserter(temp));
+ str = temp;
+}
+</pre>
+<p>The function will replace any invalid UTF-8 sequence with a Unicode replacement character.
+There is an overloaded function that enables the caller to supply their own replacement character.
+</p>
+ <h2 id="reference">
+ Reference
+ </h2>
+ <h3 id="funutf8">
+ Functions From utf8 Namespace
+ </h3>
+ <h4>
+ utf8::append
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Encodes a 32 bit code point as a UTF-8 sequence of octets and appends the sequence
+ to a UTF-8 string.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+octet_iterator append(uint32_t cp, octet_iterator result);
+
+</pre>
+ <p>
+ <code>octet_iterator</code>: an output iterator.<br>
+ <code>cp</code>: a 32 bit integer representing a code point to append to the
+ sequence.<br>
+ <code>result</code>: an output iterator to the place in the sequence where to
+ append the code point.<br>
+ <span class="return_value">Return value</span>: an iterator pointing to the place
+ after the newly appended sequence.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">unsigned char</span> u[<span class="literal">5</span>] = {<span
+class="literal">0</span>,<span class="literal">0</span>,<span class=
+"literal">0</span>,<span class="literal">0</span>,<span class="literal">0</span>};
+<span class="keyword">unsigned char</span>* end = append(<span class=
+"literal">0x0448</span>, u);
+assert (u[<span class="literal">0</span>] == <span class=
+"literal">0xd1</span> &amp;&amp; u[<span class="literal">1</span>] == <span class=
+"literal">0x88</span> &amp;&amp; u[<span class="literal">2</span>] == <span class=
+"literal">0</span> &amp;&amp; u[<span class="literal">3</span>] == <span class=
+"literal">0</span> &amp;&amp; u[<span class="literal">4</span>] == <span class=
+"literal">0</span>);
+</pre>
+ <p>
+ Note that <code>append</code> does not allocate any memory - it is the burden of
+ the caller to make sure there is enough memory allocated for the operation. To make
+ things more interesting, <code>append</code> can add anywhere between 1 and 4
+ octets to the sequence. In practice, you would most often want to use
+ <code>std::back_inserter</code> to ensure that the necessary memory is allocated.
+ </p>
+ <p>
+ In case of an invalid code point, a <code>utf8::invalid_code_point</code> exception
+ is thrown.
+ </p>
+ <h4>
+ utf8::next
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Given the iterator to the beginning of the UTF-8 sequence, it returns the code
+ point and moves the iterator to the next position.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+uint32_t next(octet_iterator&amp; it, octet_iterator end);
+
+</pre>
+ <p>
+ <code>octet_iterator</code>: an input iterator.<br>
+ <code>it</code>: a reference to an iterator pointing to the beginning of an UTF-8
+ encoded code point. After the function returns, it is incremented to point to the
+ beginning of the next code point.<br>
+ <code>end</code>: end of the UTF-8 sequence to be processed. If <code>it</code>
+ gets equal to <code>end</code> during the extraction of a code point, an
+ <code>utf8::not_enough_room</code> exception is thrown.<br>
+ <span class="return_value">Return value</span>: the 32 bit representation of the
+ processed UTF-8 code point.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+<span class="keyword">char</span>* w = twochars;
+<span class="keyword">int</span> cp = next(w, twochars + <span class="literal">6</span>);
+assert (cp == <span class="literal">0x65e5</span>);
+assert (w == twochars + <span class="literal">3</span>);
+</pre>
+ <p>
+ This function is typically used to iterate through a UTF-8 encoded string.
+ </p>
+ <p>
+ In case of an invalid UTF-8 seqence, a <code>utf8::invalid_utf8</code> exception is
+ thrown.
+ </p>
+ <h4>
+ utf8::peek_next
+ </h4>
+ <p class="version">
+ Available in version 2.1 and later.
+ </p>
+ <p>
+ Given the iterator to the beginning of the UTF-8 sequence, it returns the code
+ point for the following sequence without changing the value of the iterator.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+uint32_t peek_next(octet_iterator it, octet_iterator end);
+
+</pre>
+ <p>
+ <code>octet_iterator</code>: an input iterator.<br>
+ <code>it</code>: an iterator pointing to the beginning of an UTF-8
+ encoded code point.<br>
+ <code>end</code>: end of the UTF-8 sequence to be processed. If <code>it</code>
+ gets equal to <code>end</code> during the extraction of a code point, an
+ <code>utf8::not_enough_room</code> exception is thrown.<br>
+ <span class="return_value">Return value</span>: the 32 bit representation of the
+ processed UTF-8 code point.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+<span class="keyword">char</span>* w = twochars;
+<span class="keyword">int</span> cp = peek_next(w, twochars + <span class="literal">6</span>);
+assert (cp == <span class="literal">0x65e5</span>);
+assert (w == twochars);
+</pre>
+ <p>
+ In case of an invalid UTF-8 seqence, a <code>utf8::invalid_utf8</code> exception is
+ thrown.
+ </p>
+ <h4>
+ utf8::prior
+ </h4>
+ <p class="version">
+ Available in version 1.02 and later.
+ </p>
+ <p>
+ Given a reference to an iterator pointing to an octet in a UTF-8 sequence, it
+ decreases the iterator until it hits the beginning of the previous UTF-8 encoded
+ code point and returns the 32 bits representation of the code point.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+uint32_t prior(octet_iterator&amp; it, octet_iterator start);
+
+</pre>
+ <p>
+ <code>octet_iterator</code>: a bidirectional iterator.<br>
+ <code>it</code>: a reference pointing to an octet within a UTF-8 encoded string.
+ After the function returns, it is decremented to point to the beginning of the
+ previous code point.<br>
+ <code>start</code>: an iterator to the beginning of the sequence where the search
+ for the beginning of a code point is performed. It is a
+ safety measure to prevent passing the beginning of the string in the search for a
+ UTF-8 lead octet.<br>
+ <span class="return_value">Return value</span>: the 32 bit representation of the
+ previous code point.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+<span class="keyword">unsigned char</span>* w = twochars + <span class=
+"literal">3</span>;
+<span class="keyword">int</span> cp = prior (w, twochars);
+assert (cp == <span class="literal">0x65e5</span>);
+assert (w == twochars);
+</pre>
+ <p>
+ This function has two purposes: one is two iterate backwards through a UTF-8
+ encoded string. Note that it is usually a better idea to iterate forward instead,
+ since <code>utf8::next</code> is faster. The second purpose is to find a beginning
+ of a UTF-8 sequence if we have a random position within a string. Note that in that
+ case <code>utf8::prior</code> may not detect an invalid UTF-8 sequence in some scenarios:
+ for instance if there are superfluous trail octets, it will just skip them.
+ </p>
+ <p>
+ <code>it</code> will typically point to the beginning of
+ a code point, and <code>start</code> will point to the
+ beginning of the string to ensure we don't go backwards too far. <code>it</code> is
+ decreased until it points to a lead UTF-8 octet, and then the UTF-8 sequence
+ beginning with that octet is decoded to a 32 bit representation and returned.
+ </p>
+ <p>
+ In case <code>start</code> is reached before a UTF-8 lead octet is hit, or if an
+ invalid UTF-8 sequence is started by the lead octet, an <code>invalid_utf8</code>
+ exception is thrown.
+ </p>
+ <p>In case <code>start</code> equals <code>it</code>, a <code>not_enough_room</code>
+ exception is thrown.
+ <h4>
+ utf8::previous
+ </h4>
+ <p class="version">
+ Deprecated in version 1.02 and later.
+ </p>
+ <p>
+ Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it
+ decreases the iterator until it hits the beginning of the previous UTF-8 encoded
+ code point and returns the 32 bits representation of the code point.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+uint32_t previous(octet_iterator&amp; it, octet_iterator pass_start);
+
+</pre>
+ <p>
+ <code>octet_iterator</code>: a random access iterator.<br>
+ <code>it</code>: a reference pointing to an octet within a UTF-8 encoded string.
+ After the function returns, it is decremented to point to the beginning of the
+ previous code point.<br>
+ <code>pass_start</code>: an iterator to the point in the sequence where the search
+ for the beginning of a code point is aborted if no result was reached. It is a
+ safety measure to prevent passing the beginning of the string in the search for a
+ UTF-8 lead octet.<br>
+ <span class="return_value">Return value</span>: the 32 bit representation of the
+ previous code point.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+<span class="keyword">unsigned char</span>* w = twochars + <span class=
+"literal">3</span>;
+<span class="keyword">int</span> cp = previous (w, twochars - <span class=
+"literal">1</span>);
+assert (cp == <span class="literal">0x65e5</span>);
+assert (w == twochars);
+</pre>
+ <p>
+ <code>utf8::previous</code> is deprecated, and <code>utf8::prior</code> should
+ be used instead, although the existing code can continue using this function.
+ The problem is the parameter <code>pass_start</code> that points to the position
+ just before the beginning of the sequence. Standard containers don't have the
+ concept of "pass start" and the function can not be used with their iterators.
+ </p>
+ <p>
+ <code>it</code> will typically point to the beginning of
+ a code point, and <code>pass_start</code> will point to the octet just before the
+ beginning of the string to ensure we don't go backwards too far. <code>it</code> is
+ decreased until it points to a lead UTF-8 octet, and then the UTF-8 sequence
+ beginning with that octet is decoded to a 32 bit representation and returned.
+ </p>
+ <p>
+ In case <code>pass_start</code> is reached before a UTF-8 lead octet is hit, or if an
+ invalid UTF-8 sequence is started by the lead octet, an <code>invalid_utf8</code>
+ exception is thrown
+ </p>
+ <h4>
+ utf8::advance
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Advances an iterator by the specified number of code points within an UTF-8
+ sequence.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator, typename distance_type&gt;
+<span class=
+"keyword">void</span> advance (octet_iterator&amp; it, distance_type n, octet_iterator end);
+
+</pre>
+ <p>
+ <code>octet_iterator</code>: an input iterator.<br>
+ <code>distance_type</code>: an integral type convertible to <code>octet_iterator</code>'s difference type.<br>
+ <code>it</code>: a reference to an iterator pointing to the beginning of an UTF-8
+ encoded code point. After the function returns, it is incremented to point to the
+ nth following code point.<br>
+ <code>n</code>: a positive integer that shows how many code points we want to
+ advance.<br>
+ <code>end</code>: end of the UTF-8 sequence to be processed. If <code>it</code>
+ gets equal to <code>end</code> during the extraction of a code point, an
+ <code>utf8::not_enough_room</code> exception is thrown.<br>
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+<span class="keyword">unsigned char</span>* w = twochars;
+advance (w, <span class="literal">2</span>, twochars + <span class="literal">6</span>);
+assert (w == twochars + <span class="literal">5</span>);
+</pre>
+ <p>
+ This function works only "forward". In case of a negative <code>n</code>, there is
+ no effect.
+ </p>
+ <p>
+ In case of an invalid code point, a <code>utf8::invalid_code_point</code> exception
+ is thrown.
+ </p>
+ <h4>
+ utf8::distance
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Given the iterators to two UTF-8 encoded code points in a seqence, returns the
+ number of code points between them.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+<span class=
+"keyword">typename</span> std::iterator_traits&lt;octet_iterator&gt;::difference_type distance (octet_iterator first, octet_iterator last);
+
+</pre>
+ <p>
+ <code>octet_iterator</code>: an input iterator.<br>
+ <code>first</code>: an iterator to a beginning of a UTF-8 encoded code point.<br>
+ <code>last</code>: an iterator to a "post-end" of the last UTF-8 encoded code
+ point in the sequence we are trying to determine the length. It can be the
+ beginning of a new code point, or not.<br>
+ <span class="return_value">Return value</span> the distance between the iterators,
+ in code points.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+size_t dist = utf8::distance(twochars, twochars + <span class="literal">5</span>);
+assert (dist == <span class="literal">2</span>);
+</pre>
+ <p>
+ This function is used to find the length (in code points) of a UTF-8 encoded
+ string. The reason it is called <em>distance</em>, rather than, say,
+ <em>length</em> is mainly because developers are used that <em>length</em> is an
+ O(1) function. Computing the length of an UTF-8 string is a linear operation, and
+ it looked better to model it after <code>std::distance</code> algorithm.
+ </p>
+ <p>
+ In case of an invalid UTF-8 seqence, a <code>utf8::invalid_utf8</code> exception is
+ thrown. If <code>last</code> does not point to the past-of-end of a UTF-8 seqence,
+ a <code>utf8::not_enough_room</code> exception is thrown.
+ </p>
+ <h4>
+ utf8::utf16to8
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Converts a UTF-16 encoded string to UTF-8.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> u16bit_iterator, <span class=
+"keyword">typename</span> octet_iterator&gt;
+octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result);
+
+</pre>
+ <p>
+ <code>u16bit_iterator</code>: an input iterator.<br>
+ <code>octet_iterator</code>: an output iterator.<br>
+ <code>start</code>: an iterator pointing to the beginning of the UTF-16 encoded
+ string to convert.<br>
+ <code>end</code>: an iterator pointing to pass-the-end of the UTF-16 encoded
+ string to convert.<br>
+ <code>result</code>: an output iterator to the place in the UTF-8 string where to
+ append the result of conversion.<br>
+ <span class="return_value">Return value</span>: An iterator pointing to the place
+ after the appended UTF-8 string.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">unsigned short</span> utf16string[] = {<span class=
+"literal">0x41</span>, <span class="literal">0x0448</span>, <span class=
+"literal">0x65e5</span>, <span class="literal">0xd834</span>, <span class=
+"literal">0xdd1e</span>};
+vector&lt;<span class="keyword">unsigned char</span>&gt; utf8result;
+utf16to8(utf16string, utf16string + <span class=
+"literal">5</span>, back_inserter(utf8result));
+assert (utf8result.size() == <span class="literal">10</span>);
+</pre>
+ <p>
+ In case of invalid UTF-16 sequence, a <code>utf8::invalid_utf16</code> exception is
+ thrown.
+ </p>
+ <h4>
+ utf8::utf8to16
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Converts an UTF-8 encoded string to UTF-16
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> u16bit_iterator, typename octet_iterator&gt;
+u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result);
+
+</pre>
+ <p>
+ <code>octet_iterator</code>: an input iterator.<br>
+ <code>u16bit_iterator</code>: an output iterator.<br>
+ <code>start</code>: an iterator pointing to the beginning of the UTF-8 encoded
+ string to convert. &lt; br /&gt; <code>end</code>: an iterator pointing to
+ pass-the-end of the UTF-8 encoded string to convert.<br>
+ <code>result</code>: an output iterator to the place in the UTF-16 string where to
+ append the result of conversion.<br>
+ <span class="return_value">Return value</span>: An iterator pointing to the place
+ after the appended UTF-16 string.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span> utf8_with_surrogates[] = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e"</span>;
+vector &lt;<span class="keyword">unsigned short</span>&gt; utf16result;
+utf8to16(utf8_with_surrogates, utf8_with_surrogates + <span class=
+"literal">9</span>, back_inserter(utf16result));
+assert (utf16result.size() == <span class="literal">4</span>);
+assert (utf16result[<span class="literal">2</span>] == <span class=
+"literal">0xd834</span>);
+assert (utf16result[<span class="literal">3</span>] == <span class=
+"literal">0xdd1e</span>);
+</pre>
+ <p>
+ In case of an invalid UTF-8 seqence, a <code>utf8::invalid_utf8</code> exception is
+ thrown. If <code>end</code> does not point to the past-of-end of a UTF-8 seqence, a
+ <code>utf8::not_enough_room</code> exception is thrown.
+ </p>
+ <h4>
+ utf8::utf32to8
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Converts a UTF-32 encoded string to UTF-8.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator, typename u32bit_iterator&gt;
+octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result);
+
+</pre>
+ <p>
+ <code>octet_iterator</code>: an output iterator.<br>
+ <code>u32bit_iterator</code>: an input iterator.<br>
+ <code>start</code>: an iterator pointing to the beginning of the UTF-32 encoded
+ string to convert.<br>
+ <code>end</code>: an iterator pointing to pass-the-end of the UTF-32 encoded
+ string to convert.<br>
+ <code>result</code>: an output iterator to the place in the UTF-8 string where to
+ append the result of conversion.<br>
+ <span class="return_value">Return value</span>: An iterator pointing to the place
+ after the appended UTF-8 string.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">int</span> utf32string[] = {<span class=
+"literal">0x448</span>, <span class="literal">0x65E5</span>, <span class=
+"literal">0x10346</span>, <span class="literal">0</span>};
+vector&lt;<span class="keyword">unsigned char</span>&gt; utf8result;
+utf32to8(utf32string, utf32string + <span class=
+"literal">3</span>, back_inserter(utf8result));
+assert (utf8result.size() == <span class="literal">9</span>);
+</pre>
+ <p>
+ In case of invalid UTF-32 string, a <code>utf8::invalid_code_point</code> exception
+ is thrown.
+ </p>
+ <h4>
+ utf8::utf8to32
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Converts a UTF-8 encoded string to UTF-32.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator, <span class=
+"keyword">typename</span> u32bit_iterator&gt;
+u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result);
+
+</pre>
+ <p>
+ <code>octet_iterator</code>: an input iterator.<br>
+ <code>u32bit_iterator</code>: an output iterator.<br>
+ <code>start</code>: an iterator pointing to the beginning of the UTF-8 encoded
+ string to convert.<br>
+ <code>end</code>: an iterator pointing to pass-the-end of the UTF-8 encoded string
+ to convert.<br>
+ <code>result</code>: an output iterator to the place in the UTF-32 string where to
+ append the result of conversion.<br>
+ <span class="return_value">Return value</span>: An iterator pointing to the place
+ after the appended UTF-32 string.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+vector&lt;<span class="keyword">int</span>&gt; utf32result;
+utf8to32(twochars, twochars + <span class=
+"literal">5</span>, back_inserter(utf32result));
+assert (utf32result.size() == <span class="literal">2</span>);
+</pre>
+ <p>
+ In case of an invalid UTF-8 seqence, a <code>utf8::invalid_utf8</code> exception is
+ thrown. If <code>end</code> does not point to the past-of-end of a UTF-8 seqence, a
+ <code>utf8::not_enough_room</code> exception is thrown.
+ </p>
+ <h4>
+ utf8::find_invalid
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Detects an invalid sequence within a UTF-8 string.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+octet_iterator find_invalid(octet_iterator start, octet_iterator end);
+</pre>
+ <p>
+ <code>octet_iterator</code>: an input iterator.<br>
+ <code>start</code>: an iterator pointing to the beginning of the UTF-8 string to
+ test for validity.<br>
+ <code>end</code>: an iterator pointing to pass-the-end of the UTF-8 string to test
+ for validity.<br>
+ <span class="return_value">Return value</span>: an iterator pointing to the first
+ invalid octet in the UTF-8 string. In case none were found, equals
+ <code>end</code>.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span> utf_invalid[] = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88\xfa"</span>;
+<span class=
+"keyword">char</span>* invalid = find_invalid(utf_invalid, utf_invalid + <span class=
+"literal">6</span>);
+assert (invalid == utf_invalid + <span class="literal">5</span>);
+</pre>
+ <p>
+ This function is typically used to make sure a UTF-8 string is valid before
+ processing it with other functions. It is especially important to call it if before
+ doing any of the <em>unchecked</em> operations on it.
+ </p>
+ <h4>
+ utf8::is_valid
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Checks whether a sequence of octets is a valid UTF-8 string.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+<span class="keyword">bool</span> is_valid(octet_iterator start, octet_iterator end);
+
+</pre>
+ <p>
+ <code>octet_iterator</code>: an input iterator.<br>
+ <code>start</code>: an iterator pointing to the beginning of the UTF-8 string to
+ test for validity.<br>
+ <code>end</code>: an iterator pointing to pass-the-end of the UTF-8 string to test
+ for validity.<br>
+ <span class="return_value">Return value</span>: <code>true</code> if the sequence
+ is a valid UTF-8 string; <code>false</code> if not.
+ </p>
+ Example of use:
+<pre>
+<span class="keyword">char</span> utf_invalid[] = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88\xfa"</span>;
+<span class="keyword">bool</span> bvalid = is_valid(utf_invalid, utf_invalid + <span
+class="literal">6</span>);
+assert (bvalid == false);
+</pre>
+ <p>
+ <code>is_valid</code> is a shorthand for <code>find_invalid(start, end) ==
+ end;</code>. You may want to use it to make sure that a byte seqence is a valid
+ UTF-8 string without the need to know where it fails if it is not valid.
+ </p>
+ <h4>
+ utf8::replace_invalid
+ </h4>
+ <p class="version">
+ Available in version 2.0 and later.
+ </p>
+ <p>
+ Replaces all invalid UTF-8 sequences within a string with a replacement marker.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator, <span class=
+"keyword">typename</span> output_iterator&gt;
+output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement);
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator, <span class=
+"keyword">typename</span> output_iterator&gt;
+output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out);
+
+</pre>
+ <p>
+ <code>octet_iterator</code>: an input iterator.<br>
+ <code>output_iterator</code>: an output iterator.<br>
+ <code>start</code>: an iterator pointing to the beginning of the UTF-8 string to
+ look for invalid UTF-8 sequences.<br>
+ <code>end</code>: an iterator pointing to pass-the-end of the UTF-8 string to look
+ for invalid UTF-8 sequences.<br>
+ <code>out</code>: An output iterator to the range where the result of replacement
+ is stored.<br>
+ <code>replacement</code>: A Unicode code point for the replacement marker. The
+ version without this parameter assumes the value <code>0xfffd</code><br>
+ <span class="return_value">Return value</span>: An iterator pointing to the place
+ after the UTF-8 string with replaced invalid sequences.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span> invalid_sequence[] = <span class=
+"literal">"a\x80\xe0\xa0\xc0\xaf\xed\xa0\x80z"</span>;
+vector&lt;<span class="keyword">char</span>&gt; replace_invalid_result;
+replace_invalid (invalid_sequence, invalid_sequence + sizeof(invalid_sequence), back_inserter(replace_invalid_result), <span
+ class="literal">'?'</span>);
+bvalid = is_valid(replace_invalid_result.begin(), replace_invalid_result.end());
+assert (bvalid);
+<span class="keyword">char</span>* fixed_invalid_sequence = <span class=
+"literal">"a????z"</span>;
+assert (std::equal(replace_invalid_result.begin(), replace_invalid_result.end(), fixed_invalid_sequence));
+</pre>
+ <p>
+ <code>replace_invalid</code> does not perform in-place replacement of invalid
+ sequences. Rather, it produces a copy of the original string with the invalid
+ sequences replaced with a replacement marker. Therefore, <code>out</code> must not
+ be in the <code>[start, end]</code> range.
+ </p>
+ <p>
+ If <code>end</code> does not point to the past-of-end of a UTF-8 sequence, a
+ <code>utf8::not_enough_room</code> exception is thrown.
+ </p>
+ <h4>
+ utf8::starts_with_bom
+ </h4>
+ <p class="version">
+ Available in version 2.3 and later. Relaces deprecated <code>is_bom()</code> function.
+ </p>
+ <p>
+ Checks whether an octet sequence starts with a UTF-8 byte order mark (BOM)
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+<span class="keyword">bool</span> starts_with_bom (octet_iterator it, octet_iterator end);
+</pre>
+ <p>
+ <code>octet_iterator</code>: an input iterator.<br>
+ <code>it</code>: beginning of the octet sequence to check<br>
+ <code>end</code>: pass-end of the sequence to check<br>
+ <span class="return_value">Return value</span>: <code>true</code> if the sequence
+ starts with a UTF-8 byte order mark; <code>false</code> if not.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">unsigned char</span> byte_order_mark[] = {<span class=
+"literal">0xef</span>, <span class="literal">0xbb</span>, <span class=
+"literal">0xbf</span>};
+<span class="keyword">bool</span> bbom = starts_with_bom(byte_order_mark, byte_order_mark + <span class="keyword">sizeof</span>(byte_order_mark));
+assert (bbom == <span class="literal">true</span>);
+</pre>
+ <p>
+ The typical use of this function is to check the first three bytes of a file. If
+ they form the UTF-8 BOM, we want to skip them before processing the actual UTF-8
+ encoded text.
+ </p>
+ <h4>
+ utf8::is_bom
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later. Deprecated in version 2.3. <code>starts_with_bom()</code> should be used
+ instead.
+ </p>
+ <p>
+ Checks whether a sequence of three octets is a UTF-8 byte order mark (BOM)
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+<span class="keyword">bool</span> is_bom (octet_iterator it); <span class="comment"> // Deprecated</span>
+</pre>
+ <p>
+ <code>octet_iterator</code>: an input iterator.<br>
+ <code>it</code>: beginning of the 3-octet sequence to check<br>
+ <span class="return_value">Return value</span>: <code>true</code> if the sequence
+ is UTF-8 byte order mark; <code>false</code> if not.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">unsigned char</span> byte_order_mark[] = {<span class=
+"literal">0xef</span>, <span class="literal">0xbb</span>, <span class=
+"literal">0xbf</span>};
+<span class="keyword">bool</span> bbom = is_bom(byte_order_mark);
+assert (bbom == <span class="literal">true</span>);
+</pre>
+ <p>
+ The typical use of this function is to check the first three bytes of a file. If
+ they form the UTF-8 BOM, we want to skip them before processing the actual UTF-8
+ encoded text.
+ </p>
+ <p>
+ If a sequence is
+ shorter than three bytes, an invalid iterator will be dereferenced. Therefore, this function is deprecated
+ in favor of <code>starts_with_bom()</code>that takes the end of sequence as an argument.
+ </p>
+ <h3 id="typesutf8">
+ Types From utf8 Namespace
+ </h3>
+ <h4>utf8::exception
+ </h4>
+ <p class="version">
+ Available in version 2.3 and later.
+ </p>
+ <p>
+ Base class for the exceptions thrown by UTF CPP library functions.
+ </p>
+<pre>
+<span class="keyword">class</span> exception : <span class="keyword">public</span> std::exception {};
+</pre>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">try</span> {
+ code_that_uses_utf_cpp_library();
+}
+<span class="keyword">catch</span>(<span class="keyword">const</span> utf8::exception&amp; utfcpp_ex) {
+ cerr &lt;&lt; utfcpp_ex.what();
+}
+</pre>
+
+ <h4>utf8::invalid_code_point
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Thrown by UTF8 CPP functions such as <code>advance</code> and <code>next</code> if an UTF-8 sequence represents and invalid code point.
+ </p>
+
+<pre>
+<span class="keyword">class</span> invalid_code_point : <span class="keyword">public</span> exception {
+<span class="keyword">public</span>:
+ uint32_t code_point() <span class="keyword">const</span>;
+};
+
+</pre>
+ <p>
+ Member function <code>code_point()</code> can be used to determine the invalid code point that
+ caused the exception to be thrown.
+ </p>
+ <h4>utf8::invalid_utf8
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Thrown by UTF8 CPP functions such as <code>next</code> and <code>prior</code> if an invalid UTF-8 sequence
+ is detected during decoding.
+ </p>
+
+<pre>
+<span class="keyword">class</span> invalid_utf8 : <span class="keyword">public</span> exception {
+<span class="keyword">public</span>:
+ uint8_t utf8_octet() <span class="keyword">const</span>;
+};
+</pre>
+
+ <p>
+ Member function <code>utf8_octet()</code> can be used to determine the beginning of the byte
+ sequence that caused the exception to be thrown.
+ </p>
+</pre>
+ <h4>utf8::invalid_utf16
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Thrown by UTF8 CPP function <code>utf16to8</code> if an invalid UTF-16 sequence
+ is detected during decoding.
+ </p>
+
+<pre>
+<span class="keyword">class</span> invalid_utf16 : <span class="keyword">public</span> exception {
+<span class="keyword">public</span>:
+ uint16_t utf16_word() <span class="keyword">const</span>;
+};
+</pre>
+
+ <p>
+ Member function <code>utf16_word()</code> can be used to determine the UTF-16 code unit
+ that caused the exception to be thrown.
+ </p>
+ <h4>utf8::not_enough_room
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Thrown by UTF8 CPP functions such as <code>next</code> if the end of the decoded UTF-8 sequence
+ was reached before the code point was decoded.
+ </p>
+
+<pre>
+<span class="keyword">class</span> not_enough_room : <span class="keyword">public</span> exception {};
+</pre>
+ <h4>
+ utf8::iterator
+ </h4>
+ <p class="version">
+ Available in version 2.0 and later.
+ </p>
+ <p>
+ Adapts the underlying octet iterator to iterate over the sequence of code points,
+ rather than raw octets.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class="keyword">typename</span> octet_iterator&gt;
+<span class="keyword">class</span> iterator;
+</pre>
+
+ <h5>Member functions</h5>
+ <dl>
+ <dt><code>iterator();</code> <dd> the deafult constructor; the underlying <code>octet_iterator</code> is
+ constructed with its default constructor.
+ <dt><code><span class="keyword">explicit</span> iterator (const octet_iterator&amp; octet_it,
+ const octet_iterator&amp; range_start,
+ const octet_iterator&amp; range_end);</code> <dd> a constructor
+ that initializes the underlying <code>octet_iterator</code> with <code>octet_it</code>
+ and sets the range in which the iterator is considered valid.
+ <dt><code>octet_iterator base () <span class="keyword">const</span>;</code> <dd> returns the
+ underlying <code>octet_iterator</code>.
+ <dt><code>uint32_t operator * () <span class="keyword">const</span>;</code> <dd> decodes the utf-8 sequence
+ the underlying <code>octet_iterator</code> is pointing to and returns the code point.
+ <dt><code><span class="keyword">bool operator</span> == (const iterator&amp; rhs)
+ <span class="keyword">const</span>;</code> <dd> returns <span class="keyword">true</span>
+ if the two underlaying iterators are equal.
+ <dt><code><span class="keyword">bool operator</span> != (const iterator&amp; rhs)
+ <span class="keyword">const</span>;</code> <dd> returns <span class="keyword">true</span>
+ if the two underlaying iterators are not equal.
+ <dt><code>iterator&amp; <span class="keyword">operator</span> ++ (); </code> <dd> the prefix increment - moves
+ the iterator to the next UTF-8 encoded code point.
+ <dt><code>iterator <span class="keyword">operator</span> ++ (<span class="keyword">int</span>); </code> <dd>
+ the postfix increment - moves the iterator to the next UTF-8 encoded code point and returns the current one.
+ <dt><code>iterator&amp; <span class="keyword">operator</span> -- (); </code> <dd> the prefix decrement - moves
+ the iterator to the previous UTF-8 encoded code point.
+ <dt><code>iterator <span class="keyword">operator</span> -- (<span class="keyword">int</span>); </code> <dd>
+ the postfix decrement - moves the iterator to the previous UTF-8 encoded code point and returns the current one.
+ </dl>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* threechars = <span class="literal">"\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88"</span>;
+utf8::iterator&lt;<span class="keyword">char</span>*&gt; it(threechars, threechars, threechars + <span class="literal">9</span>);
+utf8::iterator&lt;<span class="keyword">char</span>*&gt; it2 = it;
+assert (it2 == it);
+assert (*it == <span class="literal">0x10346</span>);
+assert (*(++it) == <span class="literal">0x65e5</span>);
+assert ((*it++) == <span class="literal">0x65e5</span>);
+assert (*it == <span class="literal">0x0448</span>);
+assert (it != it2);
+utf8::iterator&lt;<span class="keyword">char</span>*&gt; endit (threechars + <span class="literal">9</span>, threechars, threechars + <span class="literal">9</span>);
+assert (++it == endit);
+assert (*(--it) == <span class="literal">0x0448</span>);
+assert ((*it--) == <span class="literal">0x0448</span>);
+assert (*it == <span class="literal">0x65e5</span>);
+assert (--it == utf8::iterator&lt;<span class="keyword">char</span>*&gt;(threechars, threechars, threechars + <span class="literal">9</span>));
+assert (*it == <span class="literal">0x10346</span>);
+</pre>
+ <p>
+ The purpose of <code>utf8::iterator</code> adapter is to enable easy iteration as well as the use of STL
+ algorithms with UTF-8 encoded strings. Increment and decrement operators are implemented in terms of
+ <code>utf8::next()</code> and <code>utf8::prior()</code> functions.
+ </p>
+ <p>
+ Note that <code>utf8::iterator</code> adapter is a checked iterator. It operates on the range specified in
+ the constructor; any attempt to go out of that range will result in an exception. Even the comparison operators
+ require both iterator object to be constructed against the same range - otherwise an exception is thrown. Typically,
+ the range will be determined by sequence container functions <code>begin</code> and <code>end</code>, i.e.:
+ </p>
+<pre>
+std::string s = <span class="literal">"example"</span>;
+utf8::iterator i (s.begin(), s.begin(), s.end());
+</pre>
+ <h3 id="fununchecked">
+ Functions From utf8::unchecked Namespace
+ </h3>
+ <h4>
+ utf8::unchecked::append
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Encodes a 32 bit code point as a UTF-8 sequence of octets and appends the sequence
+ to a UTF-8 string.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+octet_iterator append(uint32_t cp, octet_iterator result);
+
+</pre>
+ <p>
+ <code>cp</code>: A 32 bit integer representing a code point to append to the
+ sequence.<br>
+ <code>result</code>: An output iterator to the place in the sequence where to
+ append the code point.<br>
+ <span class="return_value">Return value</span>: An iterator pointing to the place
+ after the newly appended sequence.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">unsigned char</span> u[<span class="literal">5</span>] = {<span
+class="literal">0</span>,<span class="literal">0</span>,<span class=
+"literal">0</span>,<span class="literal">0</span>,<span class="literal">0</span>};
+<span class="keyword">unsigned char</span>* end = unchecked::append(<span class=
+"literal">0x0448</span>, u);
+assert (u[<span class="literal">0</span>] == <span class=
+"literal">0xd1</span> &amp;&amp; u[<span class="literal">1</span>] == <span class=
+"literal">0x88</span> &amp;&amp; u[<span class="literal">2</span>] == <span class=
+"literal">0</span> &amp;&amp; u[<span class="literal">3</span>] == <span class=
+"literal">0</span> &amp;&amp; u[<span class="literal">4</span>] == <span class=
+"literal">0</span>);
+</pre>
+ <p>
+ This is a faster but less safe version of <code>utf8::append</code>. It does not
+ check for validity of the supplied code point, and may produce an invalid UTF-8
+ sequence.
+ </p>
+ <h4>
+ utf8::unchecked::next
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Given the iterator to the beginning of a UTF-8 sequence, it returns the code point
+ and moves the iterator to the next position.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+uint32_t next(octet_iterator&amp; it);
+
+</pre>
+ <p>
+ <code>it</code>: a reference to an iterator pointing to the beginning of an UTF-8
+ encoded code point. After the function returns, it is incremented to point to the
+ beginning of the next code point.<br>
+ <span class="return_value">Return value</span>: the 32 bit representation of the
+ processed UTF-8 code point.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+<span class="keyword">char</span>* w = twochars;
+<span class="keyword">int</span> cp = unchecked::next(w);
+assert (cp == <span class="literal">0x65e5</span>);
+assert (w == twochars + <span class="literal">3</span>);
+</pre>
+ <p>
+ This is a faster but less safe version of <code>utf8::next</code>. It does not
+ check for validity of the supplied UTF-8 sequence.
+ </p>
+ <h4>
+ utf8::unchecked::peek_next
+ </h4>
+ <p class="version">
+ Available in version 2.1 and later.
+ </p>
+ <p>
+ Given the iterator to the beginning of a UTF-8 sequence, it returns the code point.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+uint32_t peek_next(octet_iterator it);
+
+</pre>
+ <p>
+ <code>it</code>: an iterator pointing to the beginning of an UTF-8
+ encoded code point.<br>
+ <span class="return_value">Return value</span>: the 32 bit representation of the
+ processed UTF-8 code point.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+<span class="keyword">char</span>* w = twochars;
+<span class="keyword">int</span> cp = unchecked::peek_next(w);
+assert (cp == <span class="literal">0x65e5</span>);
+assert (w == twochars);
+</pre>
+ <p>
+ This is a faster but less safe version of <code>utf8::peek_next</code>. It does not
+ check for validity of the supplied UTF-8 sequence.
+ </p>
+ <h4>
+ utf8::unchecked::prior
+ </h4>
+ <p class="version">
+ Available in version 1.02 and later.
+ </p>
+ <p>
+ Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it
+ decreases the iterator until it hits the beginning of the previous UTF-8 encoded
+ code point and returns the 32 bits representation of the code point.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+uint32_t prior(octet_iterator&amp; it);
+
+</pre>
+ <p>
+ <code>it</code>: a reference pointing to an octet within a UTF-8 encoded string.
+ After the function returns, it is decremented to point to the beginning of the
+ previous code point.<br>
+ <span class="return_value">Return value</span>: the 32 bit representation of the
+ previous code point.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+<span class="keyword">char</span>* w = twochars + <span class="literal">3</span>;
+<span class="keyword">int</span> cp = unchecked::prior (w);
+assert (cp == <span class="literal">0x65e5</span>);
+assert (w == twochars);
+</pre>
+ <p>
+ This is a faster but less safe version of <code>utf8::prior</code>. It does not
+ check for validity of the supplied UTF-8 sequence and offers no boundary checking.
+ </p>
+ <h4>
+ utf8::unchecked::previous (deprecated, see utf8::unchecked::prior)
+ </h4>
+ <p class="version">
+ Deprecated in version 1.02 and later.
+ </p>
+ <p>
+ Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it
+ decreases the iterator until it hits the beginning of the previous UTF-8 encoded
+ code point and returns the 32 bits representation of the code point.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+uint32_t previous(octet_iterator&amp; it);
+
+</pre>
+ <p>
+ <code>it</code>: a reference pointing to an octet within a UTF-8 encoded string.
+ After the function returns, it is decremented to point to the beginning of the
+ previous code point.<br>
+ <span class="return_value">Return value</span>: the 32 bit representation of the
+ previous code point.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+<span class="keyword">char</span>* w = twochars + <span class="literal">3</span>;
+<span class="keyword">int</span> cp = unchecked::previous (w);
+assert (cp == <span class="literal">0x65e5</span>);
+assert (w == twochars);
+</pre>
+ <p>
+ The reason this function is deprecated is just the consistency with the "checked"
+ versions, where <code>prior</code> should be used instead of <code>previous</code>.
+ In fact, <code>unchecked::previous</code> behaves exactly the same as <code>
+ unchecked::prior</code>
+ </p>
+ <p>
+ This is a faster but less safe version of <code>utf8::previous</code>. It does not
+ check for validity of the supplied UTF-8 sequence and offers no boundary checking.
+ </p>
+ <h4>
+ utf8::unchecked::advance
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Advances an iterator by the specified number of code points within an UTF-8
+ sequence.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator, typename distance_type&gt;
+<span class="keyword">void</span> advance (octet_iterator&amp; it, distance_type n);
+
+</pre>
+ <p>
+ <code>it</code>: a reference to an iterator pointing to the beginning of an UTF-8
+ encoded code point. After the function returns, it is incremented to point to the
+ nth following code point.<br>
+ <code>n</code>: a positive integer that shows how many code points we want to
+ advance.<br>
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+<span class="keyword">char</span>* w = twochars;
+unchecked::advance (w, <span class="literal">2</span>);
+assert (w == twochars + <span class="literal">5</span>);
+</pre>
+ <p>
+ This function works only "forward". In case of a negative <code>n</code>, there is
+ no effect.
+ </p>
+ <p>
+ This is a faster but less safe version of <code>utf8::advance</code>. It does not
+ check for validity of the supplied UTF-8 sequence and offers no boundary checking.
+ </p>
+ <h4>
+ utf8::unchecked::distance
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Given the iterators to two UTF-8 encoded code points in a seqence, returns the
+ number of code points between them.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator&gt;
+<span class=
+"keyword">typename</span> std::iterator_traits&lt;octet_iterator&gt;::difference_type distance (octet_iterator first, octet_iterator last);
+</pre>
+ <p>
+ <code>first</code>: an iterator to a beginning of a UTF-8 encoded code point.<br>
+ <code>last</code>: an iterator to a "post-end" of the last UTF-8 encoded code
+ point in the sequence we are trying to determine the length. It can be the
+ beginning of a new code point, or not.<br>
+ <span class="return_value">Return value</span> the distance between the iterators,
+ in code points.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+size_t dist = utf8::unchecked::distance(twochars, twochars + <span class=
+"literal">5</span>);
+assert (dist == <span class="literal">2</span>);
+</pre>
+ <p>
+ This is a faster but less safe version of <code>utf8::distance</code>. It does not
+ check for validity of the supplied UTF-8 sequence.
+ </p>
+ <h4>
+ utf8::unchecked::utf16to8
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Converts a UTF-16 encoded string to UTF-8.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> u16bit_iterator, <span class=
+"keyword">typename</span> octet_iterator&gt;
+octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result);
+
+</pre>
+ <p>
+ <code>start</code>: an iterator pointing to the beginning of the UTF-16 encoded
+ string to convert.<br>
+ <code>end</code>: an iterator pointing to pass-the-end of the UTF-16 encoded
+ string to convert.<br>
+ <code>result</code>: an output iterator to the place in the UTF-8 string where to
+ append the result of conversion.<br>
+ <span class="return_value">Return value</span>: An iterator pointing to the place
+ after the appended UTF-8 string.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">unsigned short</span> utf16string[] = {<span class=
+"literal">0x41</span>, <span class="literal">0x0448</span>, <span class=
+"literal">0x65e5</span>, <span class="literal">0xd834</span>, <span class=
+"literal">0xdd1e</span>};
+vector&lt;<span class="keyword">unsigned char</span>&gt; utf8result;
+unchecked::utf16to8(utf16string, utf16string + <span class=
+"literal">5</span>, back_inserter(utf8result));
+assert (utf8result.size() == <span class="literal">10</span>);
+</pre>
+ <p>
+ This is a faster but less safe version of <code>utf8::utf16to8</code>. It does not
+ check for validity of the supplied UTF-16 sequence.
+ </p>
+ <h4>
+ utf8::unchecked::utf8to16
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Converts an UTF-8 encoded string to UTF-16
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> u16bit_iterator, typename octet_iterator&gt;
+u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result);
+
+</pre>
+ <p>
+ <code>start</code>: an iterator pointing to the beginning of the UTF-8 encoded
+ string to convert. &lt; br /&gt; <code>end</code>: an iterator pointing to
+ pass-the-end of the UTF-8 encoded string to convert.<br>
+ <code>result</code>: an output iterator to the place in the UTF-16 string where to
+ append the result of conversion.<br>
+ <span class="return_value">Return value</span>: An iterator pointing to the place
+ after the appended UTF-16 string.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span> utf8_with_surrogates[] = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e"</span>;
+vector &lt;<span class="keyword">unsigned short</span>&gt; utf16result;
+unchecked::utf8to16(utf8_with_surrogates, utf8_with_surrogates + <span class=
+"literal">9</span>, back_inserter(utf16result));
+assert (utf16result.size() == <span class="literal">4</span>);
+assert (utf16result[<span class="literal">2</span>] == <span class=
+"literal">0xd834</span>);
+assert (utf16result[<span class="literal">3</span>] == <span class=
+"literal">0xdd1e</span>);
+</pre>
+ <p>
+ This is a faster but less safe version of <code>utf8::utf8to16</code>. It does not
+ check for validity of the supplied UTF-8 sequence.
+ </p>
+ <h4>
+ utf8::unchecked::utf32to8
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Converts a UTF-32 encoded string to UTF-8.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator, <span class=
+"keyword">typename</span> u32bit_iterator&gt;
+octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result);
+
+</pre>
+ <p>
+ <code>start</code>: an iterator pointing to the beginning of the UTF-32 encoded
+ string to convert.<br>
+ <code>end</code>: an iterator pointing to pass-the-end of the UTF-32 encoded
+ string to convert.<br>
+ <code>result</code>: an output iterator to the place in the UTF-8 string where to
+ append the result of conversion.<br>
+ <span class="return_value">Return value</span>: An iterator pointing to the place
+ after the appended UTF-8 string.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">int</span> utf32string[] = {<span class=
+"literal">0x448</span>, <span class="literal">0x65e5</span>, <span class=
+"literal">0x10346</span>, <span class="literal">0</span>};
+vector&lt;<span class="keyword">unsigned char</span>&gt; utf8result;
+utf32to8(utf32string, utf32string + <span class=
+"literal">3</span>, back_inserter(utf8result));
+assert (utf8result.size() == <span class="literal">9</span>);
+</pre>
+ <p>
+ This is a faster but less safe version of <code>utf8::utf32to8</code>. It does not
+ check for validity of the supplied UTF-32 sequence.
+ </p>
+ <h4>
+ utf8::unchecked::utf8to32
+ </h4>
+ <p class="version">
+ Available in version 1.0 and later.
+ </p>
+ <p>
+ Converts a UTF-8 encoded string to UTF-32.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class=
+"keyword">typename</span> octet_iterator, typename u32bit_iterator&gt;
+u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result);
+
+</pre>
+ <p>
+ <code>start</code>: an iterator pointing to the beginning of the UTF-8 encoded
+ string to convert.<br>
+ <code>end</code>: an iterator pointing to pass-the-end of the UTF-8 encoded string
+ to convert.<br>
+ <code>result</code>: an output iterator to the place in the UTF-32 string where to
+ append the result of conversion.<br>
+ <span class="return_value">Return value</span>: An iterator pointing to the place
+ after the appended UTF-32 string.
+ </p>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* twochars = <span class=
+"literal">"\xe6\x97\xa5\xd1\x88"</span>;
+vector&lt;<span class="keyword">int</span>&gt; utf32result;
+unchecked::utf8to32(twochars, twochars + <span class=
+"literal">5</span>, back_inserter(utf32result));
+assert (utf32result.size() == <span class="literal">2</span>);
+</pre>
+ <p>
+ This is a faster but less safe version of <code>utf8::utf8to32</code>. It does not
+ check for validity of the supplied UTF-8 sequence.
+ </p>
+ <h3 id="typesunchecked">
+ Types From utf8::unchecked Namespace
+ </h3>
+ <h4>
+ utf8::iterator
+ </h4>
+ <p class="version">
+ Available in version 2.0 and later.
+ </p>
+ <p>
+ Adapts the underlying octet iterator to iterate over the sequence of code points,
+ rather than raw octets.
+ </p>
+<pre>
+<span class="keyword">template</span> &lt;<span class="keyword">typename</span> octet_iterator&gt;
+<span class="keyword">class</span> iterator;
+</pre>
+
+ <h5>Member functions</h5>
+ <dl>
+ <dt><code>iterator();</code> <dd> the deafult constructor; the underlying <code>octet_iterator</code> is
+ constructed with its default constructor.
+ <dt><code><span class="keyword">explicit</span> iterator (const octet_iterator&amp; octet_it);
+ </code> <dd> a constructor
+ that initializes the underlying <code>octet_iterator</code> with <code>octet_it</code>
+ <dt><code>octet_iterator base () <span class="keyword">const</span>;</code> <dd> returns the
+ underlying <code>octet_iterator</code>.
+ <dt><code>uint32_t operator * () <span class="keyword">const</span>;</code> <dd> decodes the utf-8 sequence
+ the underlying <code>octet_iterator</code> is pointing to and returns the code point.
+ <dt><code><span class="keyword">bool operator</span> == (const iterator&amp; rhs)
+ <span class="keyword">const</span>;</code> <dd> returns <span class="keyword">true</span>
+ if the two underlaying iterators are equal.
+ <dt><code><span class="keyword">bool operator</span> != (const iterator&amp; rhs)
+ <span class="keyword">const</span>;</code> <dd> returns <span class="keyword">true</span>
+ if the two underlaying iterators are not equal.
+ <dt><code>iterator&amp; <span class="keyword">operator</span> ++ (); </code> <dd> the prefix increment - moves
+ the iterator to the next UTF-8 encoded code point.
+ <dt><code>iterator <span class="keyword">operator</span> ++ (<span class="keyword">int</span>); </code> <dd>
+ the postfix increment - moves the iterator to the next UTF-8 encoded code point and returns the current one.
+ <dt><code>iterator&amp; <span class="keyword">operator</span> -- (); </code> <dd> the prefix decrement - moves
+ the iterator to the previous UTF-8 encoded code point.
+ <dt><code>iterator <span class="keyword">operator</span> -- (<span class="keyword">int</span>); </code> <dd>
+ the postfix decrement - moves the iterator to the previous UTF-8 encoded code point and returns the current one.
+ </dl>
+ <p>
+ Example of use:
+ </p>
+<pre>
+<span class="keyword">char</span>* threechars = <span class="literal">"\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88"</span>;
+utf8::unchecked::iterator&lt;<span class="keyword">char</span>*&gt; un_it(threechars);
+utf8::unchecked::iterator&lt;<span class="keyword">char</span>*&gt; un_it2 = un_it;
+assert (un_it2 == un_it);
+assert (*un_it == <span class="literal">0x10346</span>);
+assert (*(++un_it) == <span class="literal">0x65e5</span>);
+assert ((*un_it++) == <span class="literal">0x65e5</span>);
+assert (*un_it == <span class="literal">0x0448</span>);
+assert (un_it != un_it2);
+utf8::::unchecked::iterator&lt;<span class="keyword">char</span>*&gt; un_endit (threechars + <span class="literal">9</span>);
+assert (++un_it == un_endit);
+assert (*(--un_it) == <span class="literal">0x0448</span>);
+assert ((*un_it--) == <span class="literal">0x0448</span>);
+assert (*un_it == <span class="literal">0x65e5</span>);
+assert (--un_it == utf8::unchecked::iterator&lt;<span class="keyword">char</span>*&gt;(threechars));
+assert (*un_it == <span class="literal">0x10346</span>);
+</pre>
+ <p>
+ This is an unchecked version of <code>utf8::iterator</code>. It is faster in many cases, but offers
+ no validity or range checks.
+ </p>
+ <h2 id="points">
+ Points of interest
+ </h2>
+ <h4>
+ Design goals and decisions
+ </h4>
+ <p>
+ The library was designed to be:
+ </p>
+ <ol>
+ <li>
+ Generic: for better or worse, there are many C++ string classes out there, and
+ the library should work with as many of them as possible.
+ </li>
+ <li>
+ Portable: the library should be portable both accross different platforms and
+ compilers. The only non-portable code is a small section that declares unsigned
+ integers of different sizes: three typedefs. They can be changed by the users of
+ the library if they don't match their platform. The default setting should work
+ for Windows (both 32 and 64 bit), and most 32 bit and 64 bit Unix derivatives.
+ </li>
+ <li>
+ Lightweight: follow the "pay only for what you use" guideline.
+ </li>
+ <li>
+ Unintrusive: avoid forcing any particular design or even programming style on the
+ user. This is a library, not a framework.
+ </li>
+ </ol>
+ <h4>
+ Alternatives
+ </h4>
+ <p>
+ In case you want to look into other means of working with UTF-8 strings from C++,
+ here is the list of solutions I am aware of:
+ </p>
+ <ol>
+ <li>
+ <a href="http://icu.sourceforge.net/">ICU Library</a>. It is very powerful,
+ complete, feature-rich, mature, and widely used. Also big, intrusive,
+ non-generic, and doesn't play well with the Standard Library. I definitelly
+ recommend looking at ICU even if you don't plan to use it.
+ </li>
+ <li>
+ C++11 language and library features. Still far from complete, and not widely
+ supported by compiler vendors.
+ </li>
+ <li>
+ <a href=
+ "http://www.gtkmm.org/gtkmm2/docs/tutorial/html/ch03s04.html">Glib::ustring</a>.
+ A class specifically made to work with UTF-8 strings, and also feel like
+ <code>std::string</code>. If you prefer to have yet another string class in your
+ code, it may be worth a look. Be aware of the licensing issues, though.
+ </li>
+ <li>
+ Platform dependent solutions: Windows and POSIX have functions to convert strings
+ from one encoding to another. That is only a subset of what my library offers,
+ but if that is all you need it may be good enough.
+ </li>
+ </ol>
+ <h2 id="links">
+ Links
+ </h2>
+ <ol>
+ <li>
+ <a href="http://www.unicode.org/">The Unicode Consortium</a>.
+ </li>
+ <li>
+ <a href="http://icu.sourceforge.net/">ICU Library</a>.
+ </li>
+ <li>
+ <a href="http://en.wikipedia.org/wiki/UTF-8">UTF-8 at Wikipedia</a>
+ </li>
+ <li>
+ <a href="http://www.cl.cam.ac.uk/~mgk25/unicode.html">UTF-8 and Unicode FAQ for
+ Unix/Linux</a>
+ </li>
+ </ol>
+ </body>
+</html>
diff --git a/thirdparty/assimp/include/assimp/.editorconfig b/thirdparty/assimp/include/assimp/.editorconfig
deleted file mode 100644
index 9ea66423ad..0000000000
--- a/thirdparty/assimp/include/assimp/.editorconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-# See <http://EditorConfig.org> for details
-
-[*.{h,hpp,inl}]
-end_of_line = lf
-insert_final_newline = true
-trim_trailing_whitespace = true
-indent_size = 4
-indent_style = space
diff --git a/thirdparty/assimp/include/assimp/BaseImporter.h b/thirdparty/assimp/include/assimp/BaseImporter.h
index 48dfc8ed8b..55f7fe3754 100644
--- a/thirdparty/assimp/include/assimp/BaseImporter.h
+++ b/thirdparty/assimp/include/assimp/BaseImporter.h
@@ -48,8 +48,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <vector>
#include <set>
+#include <map>
#include <assimp/types.h>
#include <assimp/ProgressHandler.hpp>
+#include <assimp/ai_assert.h>
struct aiScene;
struct aiImporterDesc;
@@ -80,6 +82,10 @@ class IOStream;
class ASSIMP_API BaseImporter {
friend class Importer;
+private:
+ /* Pushes state into importer for the importer scale */
+ virtual void UpdateImporterScale( Importer* pImp );
+
public:
/** Constructor to be privately used by #Importer */
@@ -132,7 +138,7 @@ public:
* a suitable response to the caller.
*/
aiScene* ReadFile(
- const Importer* pImp,
+ Importer* pImp,
const std::string& pFile,
IOSystem* pIOHandler
);
@@ -161,14 +167,65 @@ public:
* some loader features. Importers must provide this information. */
virtual const aiImporterDesc* GetInfo() const = 0;
+ /**
+ * Will be called only by scale process when scaling is requested.
+ */
+ virtual void SetFileScale(double scale)
+ {
+ fileScale = scale;
+ }
+
+ virtual double GetFileScale() const
+ {
+ return fileScale;
+ }
+
+ enum ImporterUnits {
+ M,
+ MM,
+ CM,
+ INCHES,
+ FEET
+ };
+
+ /**
+ * Assimp Importer
+ * unit conversions available
+ * if you need another measurment unit add it below.
+ * it's currently defined in assimp that we prefer meters.
+ * */
+ std::map<ImporterUnits, double> importerUnits = {
+ {ImporterUnits::M, 1},
+ {ImporterUnits::CM, 0.01},
+ {ImporterUnits::MM, 0.001},
+ {ImporterUnits::INCHES, 0.0254},
+ {ImporterUnits::FEET, 0.3048}
+ };
+
+ virtual void SetApplicationUnits( const ImporterUnits& unit )
+ {
+ importerScale = importerUnits[unit];
+ applicationUnits = unit;
+ }
+
+ virtual const ImporterUnits& GetApplicationUnits()
+ {
+ return applicationUnits;
+ }
+
// -------------------------------------------------------------------
/** Called by #Importer::GetExtensionList for each loaded importer.
* Take the extension list contained in the structure returned by
* #GetInfo and insert all file extensions into the given set.
* @param extension set to collect file extensions in*/
void GetExtensionList(std::set<std::string>& extensions);
+
+protected:
+ ImporterUnits applicationUnits = ImporterUnits::M;
+ double importerScale = 1.0;
+ double fileScale = 1.0;
+
-protected:
// -------------------------------------------------------------------
/** Imports the given file into the given scene structure. The
diff --git a/thirdparty/assimp/include/assimp/config.h.in b/thirdparty/assimp/include/assimp/config.h.in
index d08b929a10..3a6379bf40 100644
--- a/thirdparty/assimp/include/assimp/config.h.in
+++ b/thirdparty/assimp/include/assimp/config.h.in
@@ -142,7 +142,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/** @brief Specifies the maximum angle that may be between two vertex tangents
* that their tangents and bi-tangents are smoothed.
*
- * This applies to the CalcTangentSpace-Step. TFvhe angle is specified
+ * This applies to the CalcTangentSpace-Step. The angle is specified
* in degrees. The maximum value is 175.
* Property type: float. Default value: 45 degrees
*/
@@ -999,6 +999,13 @@ enum aiComponent
# define AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT 1.0f
#endif // !! AI_DEBONE_THRESHOLD
+#define AI_CONFIG_APP_SCALE_KEY "APP_SCALE_FACTOR"
+
+#if (!defined AI_CONFIG_APP_SCALE_KEY)
+# define AI_CONFIG_APP_SCALE_KEY 1.0
+#endif // AI_CONFIG_APP_SCALE_KEY
+
+
// ---------- All the Build/Compile-time defines ------------
/** @brief Specifies if double precision is supported inside assimp
diff --git a/thirdparty/assimp/include/assimp/irrXMLWrapper.h b/thirdparty/assimp/include/assimp/irrXMLWrapper.h
deleted file mode 100644
index ec8ee7c76e..0000000000
--- a/thirdparty/assimp/include/assimp/irrXMLWrapper.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
-Open Asset Import Library (assimp)
-----------------------------------------------------------------------
-
-Copyright (c) 2006-2019, assimp team
-
-
-All rights reserved.
-
-Redistribution and use of this software in source and binary forms,
-with or without modification, are permitted provided that the
-following conditions are met:
-
-* Redistributions of source code must retain the above
-copyright notice, this list of conditions and the
-following disclaimer.
-
-* Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the
-following disclaimer in the documentation and/or other
-materials provided with the distribution.
-
-* Neither the name of the assimp team, nor the names of its
-contributors may be used to endorse or promote products
-derived from this software without specific prior
-written permission of the assimp team.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-----------------------------------------------------------------------
-*/
-
-#ifndef INCLUDED_AI_IRRXML_WRAPPER
-#define INCLUDED_AI_IRRXML_WRAPPER
-
-// some long includes ....
-#include <irrXML.h>
-#include "IOStream.hpp"
-#include "BaseImporter.h"
-#include <vector>
-
-namespace Assimp {
-
-// ---------------------------------------------------------------------------------
-/** @brief Utility class to make IrrXML work together with our custom IO system
- * See the IrrXML docs for more details.
- *
- * Construct IrrXML-Reader in BaseImporter::InternReadFile():
- * @code
- * // open the file
- * std::unique_ptr<IOStream> file( pIOHandler->Open( pFile));
- * if( file.get() == NULL) {
- * throw DeadlyImportError( "Failed to open file " + pFile + ".");
- * }
- *
- * // generate a XML reader for it
- * std::unique_ptr<CIrrXML_IOStreamReader> mIOWrapper( new CIrrXML_IOStreamReader( file.get()));
- * mReader = irr::io::createIrrXMLReader( mIOWrapper.get());
- * if( !mReader) {
- * ThrowException( "xxxx: Unable to open file.");
- * }
- * @endcode
- **/
-class CIrrXML_IOStreamReader : public irr::io::IFileReadCallBack {
-public:
-
- // ----------------------------------------------------------------------------------
- //! Construction from an existing IOStream
- explicit CIrrXML_IOStreamReader(IOStream* _stream)
- : stream (_stream)
- , t (0)
- {
-
- // Map the buffer into memory and convert it to UTF8. IrrXML provides its
- // own conversion, which is merely a cast from uintNN_t to uint8_t. Thus,
- // it is not suitable for our purposes and we have to do it BEFORE IrrXML
- // gets the buffer. Sadly, this forces us to map the whole file into
- // memory.
-
- data.resize(stream->FileSize());
- stream->Read(&data[0],data.size(),1);
-
- // Remove null characters from the input sequence otherwise the parsing will utterly fail
- unsigned int size = 0;
- unsigned int size_max = static_cast<unsigned int>(data.size());
- for(unsigned int i = 0; i < size_max; i++) {
- if(data[i] != '\0') {
- data[size++] = data[i];
- }
- }
- data.resize(size);
-
- BaseImporter::ConvertToUTF8(data);
- }
-
- // ----------------------------------------------------------------------------------
- //! Virtual destructor
- virtual ~CIrrXML_IOStreamReader() {}
-
- // ----------------------------------------------------------------------------------
- //! Reads an amount of bytes from the file.
- /** @param buffer: Pointer to output buffer.
- * @param sizeToRead: Amount of bytes to read
- * @return Returns how much bytes were read. */
- virtual int read(void* buffer, int sizeToRead) {
- if(sizeToRead<0) {
- return 0;
- }
- if(t+sizeToRead>data.size()) {
- sizeToRead = static_cast<int>(data.size()-t);
- }
-
- memcpy(buffer,&data.front()+t,sizeToRead);
-
- t += sizeToRead;
- return sizeToRead;
- }
-
- // ----------------------------------------------------------------------------------
- //! Returns size of file in bytes
- virtual int getSize() {
- return (int)data.size();
- }
-
-private:
- IOStream* stream;
- std::vector<char> data;
- size_t t;
-
-}; // ! class CIrrXML_IOStreamReader
-
-} // ! Assimp
-
-#endif // !! INCLUDED_AI_IRRXML_WRAPPER
diff --git a/thirdparty/assimp/include/assimp/scene.h b/thirdparty/assimp/include/assimp/scene.h
index df5d6f3b5e..2667db85b3 100644
--- a/thirdparty/assimp/include/assimp/scene.h
+++ b/thirdparty/assimp/include/assimp/scene.h
@@ -56,9 +56,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "material.h"
#include "anim.h"
#include "metadata.h"
-#include <cstdlib>
#ifdef __cplusplus
+# include <cstdlib>
extern "C" {
#endif
diff --git a/thirdparty/xatlas/avoid-failing-on-bad-geometry.patch b/thirdparty/xatlas/avoid-failing-on-bad-geometry.patch
deleted file mode 100644
index a28cd9f82b..0000000000
--- a/thirdparty/xatlas/avoid-failing-on-bad-geometry.patch
+++ /dev/null
@@ -1,157 +0,0 @@
-diff --git a/thirdparty/xatlas/xatlas.cpp b/thirdparty/xatlas/xatlas.cpp
-index df5ef94db..eb0824a51 100644
---- a/thirdparty/xatlas/xatlas.cpp
-+++ b/thirdparty/xatlas/xatlas.cpp
-@@ -1276,6 +1276,9 @@ class Vertex
- {
- public:
- uint32_t id;
-+ // -- GODOT start --
-+ uint32_t original_id;
-+ // -- GODOT end --
- Edge *edge;
- Vertex *next;
- Vertex *prev;
-@@ -1283,7 +1286,10 @@ public:
- Vector3 nor;
- Vector2 tex;
-
-- Vertex(uint32_t id) : id(id), edge(NULL), pos(0.0f), nor(0.0f), tex(0.0f)
-+ // -- GODOT start --
-+ //Vertex(uint32_t id) : id(id), edge(NULL), pos(0.0f), nor(0.0f), tex(0.0f)
-+ Vertex(uint32_t id) : id(id), original_id(id), edge(NULL), pos(0.0f), nor(0.0f), tex(0.0f)
-+ // -- GODOT end --
- {
- next = this;
- prev = this;
-@@ -1934,6 +1940,64 @@ public:
- return f;
- }
-
-+ // -- GODOT start --
-+ Face *addUniqueFace(uint32_t v0, uint32_t v1, uint32_t v2) {
-+
-+ int base_vertex = m_vertexArray.size();
-+
-+ uint32_t ids[3] = { v0, v1, v2 };
-+
-+ Vector3 base[3] = {
-+ m_vertexArray[v0]->pos,
-+ m_vertexArray[v1]->pos,
-+ m_vertexArray[v2]->pos,
-+ };
-+
-+ //make sure its not a degenerate
-+ bool degenerate = distanceSquared(base[0], base[1]) < NV_EPSILON || distanceSquared(base[0], base[2]) < NV_EPSILON || distanceSquared(base[1], base[2]) < NV_EPSILON;
-+ xaDebugAssert(!degenerate);
-+
-+ float min_x = 0;
-+
-+ for (int i = 0; i < 3; i++) {
-+ if (i == 0 || m_vertexArray[v0]->pos.x < min_x) {
-+ min_x = m_vertexArray[v0]->pos.x;
-+ }
-+ }
-+
-+ float max_x = 0;
-+
-+ for (int j = 0; j < m_vertexArray.size(); j++) {
-+ if (j == 0 || m_vertexArray[j]->pos.x > max_x) { //vertex already exists
-+ max_x = m_vertexArray[j]->pos.x;
-+ }
-+ }
-+
-+ //separate from everything else, in x axis
-+ for (int i = 0; i < 3; i++) {
-+
-+ base[i].x -= min_x;
-+ base[i].x += max_x + 10.0;
-+ }
-+
-+ for (int i = 0; i < 3; i++) {
-+ Vertex *v = new Vertex(m_vertexArray.size());
-+ v->pos = base[i];
-+ v->nor = m_vertexArray[ids[i]]->nor,
-+ v->tex = m_vertexArray[ids[i]]->tex,
-+
-+ v->original_id = ids[i];
-+ m_vertexArray.push_back(v);
-+ }
-+
-+ uint32_t indexArray[3];
-+ indexArray[0] = base_vertex + 0;
-+ indexArray[1] = base_vertex + 1;
-+ indexArray[2] = base_vertex + 2;
-+ return addFace(indexArray, 3, 0, 3);
-+ }
-+ // -- GODOT end --
-+
- // These functions disconnect the given element from the mesh and delete it.
-
- // @@ We must always disconnect edge pairs simultaneously.
-@@ -2915,6 +2979,14 @@ Mesh *triangulate(const Mesh *inputMesh)
- Vector2 p0 = polygonPoints[i0];
- Vector2 p1 = polygonPoints[i1];
- Vector2 p2 = polygonPoints[i2];
-+
-+ // -- GODOT start --
-+ bool degenerate = distance(p0, p1) < NV_EPSILON || distance(p0, p2) < NV_EPSILON || distance(p1, p2) < NV_EPSILON;
-+ if (degenerate) {
-+ continue;
-+ }
-+ // -- GODOT end --
-+
- float d = clamp(dot(p0 - p1, p2 - p1) / (length(p0 - p1) * length(p2 - p1)), -1.0f, 1.0f);
- float angle = acosf(d);
- float area = triangleArea(p0, p1, p2);
-@@ -2938,6 +3010,11 @@ Mesh *triangulate(const Mesh *inputMesh)
- }
- }
- }
-+ // -- GODOT start --
-+ if (!bestIsValid)
-+ break;
-+ // -- GODOT end --
-+
- xaDebugAssert(minAngle <= 2 * PI);
- // Clip best ear:
- uint32_t i0 = (bestEar + size - 1) % size;
-@@ -5606,7 +5683,10 @@ public:
- }
- if (chartMeshIndices[vertex->id] == ~0) {
- chartMeshIndices[vertex->id] = m_chartMesh->vertexCount();
-- m_chartToOriginalMap.push_back(vertex->id);
-+ // -- GODOT start --
-+ //m_chartToOriginalMap.push_back(vertex->id);
-+ m_chartToOriginalMap.push_back(vertex->original_id);
-+ // -- GODOT end --
- m_chartToUnifiedMap.push_back(unifiedMeshIndices[unifiedVertex->id]);
- halfedge::Vertex *v = m_chartMesh->addVertex(vertex->pos);
- v->nor = vertex->nor;
-@@ -5699,7 +5779,10 @@ public:
- const halfedge::Vertex *vertex = it.current()->vertex;
- if (chartMeshIndices[vertex->id] == ~0) {
- chartMeshIndices[vertex->id] = m_chartMesh->vertexCount();
-- m_chartToOriginalMap.push_back(vertex->id);
-+ // -- GODOT start --
-+ //m_chartToOriginalMap.push_back(vertex->id);
-+ m_chartToOriginalMap.push_back(vertex->original_id);
-+ // -- GODOT end --
- halfedge::Vertex *v = m_chartMesh->addVertex(vertex->pos);
- v->nor = vertex->nor;
- v->tex = vertex->tex; // @@ Not necessary.
-@@ -7573,6 +7656,14 @@ AddMeshError AddMesh(Atlas *atlas, const InputMesh &mesh, bool useColocalVertice
- }
- }
- internal::halfedge::Face *face = heMesh->addFace(tri[0], tri[1], tri[2]);
-+
-+ // -- GODOT start --
-+ if (!face && heMesh->errorCode == internal::halfedge::Mesh::ErrorCode::AlreadyAddedEdge) {
-+ //there is still hope for this, no reason to not add, at least add as separate
-+ face = heMesh->addUniqueFace(tri[0], tri[1], tri[2]);
-+ }
-+ // -- GODOT end --
-+
- if (!face) {
- if (heMesh->errorCode == internal::halfedge::Mesh::ErrorCode::AlreadyAddedEdge)
- error.code = AddMeshErrorCode::AlreadyAddedEdge;
diff --git a/thirdparty/xatlas/build-fix-limits.patch b/thirdparty/xatlas/build-fix-limits.patch
deleted file mode 100644
index 00d07371c0..0000000000
--- a/thirdparty/xatlas/build-fix-limits.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff --git a/thirdparty/xatlas/xatlas.h b/thirdparty/xatlas/xatlas.h
-index 7e556c6c3..dbf8ca08c 100644
---- a/thirdparty/xatlas/xatlas.h
-+++ b/thirdparty/xatlas/xatlas.h
-@@ -3,6 +3,9 @@
- #ifndef XATLAS_H
- #define XATLAS_H
- #include <float.h> // FLT_MAX
-+// -- GODOT start --
-+#include <limits.h> // INT_MAX, UINT_MAX
-+// -- GODOT end --
-
- namespace xatlas {
-
diff --git a/thirdparty/xatlas/xatlas.cpp b/thirdparty/xatlas/xatlas.cpp
index 1b30305cd4..56794211a6 100644
--- a/thirdparty/xatlas/xatlas.cpp
+++ b/thirdparty/xatlas/xatlas.cpp
@@ -93,8 +93,24 @@ Copyright (c) 2012 Brandon Pelfrey
#define XA_ALLOC(tag, type) (type *)internal::Realloc(nullptr, sizeof(type), tag, __FILE__, __LINE__)
#define XA_ALLOC_ARRAY(tag, type, num) (type *)internal::Realloc(nullptr, sizeof(type) * num, tag, __FILE__, __LINE__)
#define XA_REALLOC(tag, ptr, type, num) (type *)internal::Realloc(ptr, sizeof(type) * num, tag, __FILE__, __LINE__)
+#define XA_REALLOC_SIZE(tag, ptr, size) (uint8_t *)internal::Realloc(ptr, size, tag, __FILE__, __LINE__)
#define XA_FREE(ptr) internal::Realloc(ptr, 0, internal::MemTag::Default, __FILE__, __LINE__)
-#define XA_NEW(tag, type, ...) new (XA_ALLOC(tag, type)) type(__VA_ARGS__)
+#define XA_NEW(tag, type) new (XA_ALLOC(tag, type)) type()
+#define XA_NEW_ARGS(tag, type, ...) new (XA_ALLOC(tag, type)) type(__VA_ARGS__)
+
+#ifdef _MSC_VER
+#define XA_INLINE __forceinline
+#else
+#define XA_INLINE inline
+#endif
+
+#if defined(__clang__) || defined(__GNUC__)
+#define XA_NODISCARD [[nodiscard]]
+#elif defined(_MSC_VER)
+#define XA_NODISCARD _Check_return_
+#else
+#define XA_NODISCARD
+#endif
#define XA_UNUSED(a) ((void)(a))
@@ -102,6 +118,7 @@ Copyright (c) 2012 Brandon Pelfrey
#define XA_MERGE_CHARTS 1
#define XA_MERGE_CHARTS_MIN_NORMAL_DEVIATION 0.5f
#define XA_RECOMPUTE_CHARTS 1
+#define XA_SKIP_PARAMETERIZATION 0 // Use the orthogonal parameterization from segment::Atlas
#define XA_CLOSE_HOLES_CHECK_EDGE_INTERSECTION 0
#define XA_DEBUG_HEAP 0
@@ -140,6 +157,7 @@ namespace xatlas {
namespace internal {
static ReallocFunc s_realloc = realloc;
+static FreeFunc s_free = free;
static PrintFunc s_print = printf;
static bool s_printVerbose = false;
@@ -167,6 +185,7 @@ struct AllocHeader
const char *file;
int line;
int tag;
+ uint32_t id;
AllocHeader *prev, *next;
bool free;
};
@@ -174,6 +193,7 @@ struct AllocHeader
static std::mutex s_allocMutex;
static AllocHeader *s_allocRoot = nullptr;
static size_t s_allocTotalSize = 0, s_allocPeakSize = 0, s_allocTotalTagSize[MemTag::Count] = { 0 }, s_allocPeakTagSize[MemTag::Count] = { 0 };
+static uint32_t s_allocId =0 ;
static constexpr uint32_t kAllocRedzone = 0x12345678;
static void *Realloc(void *ptr, size_t size, int tag, const char *file, int line)
@@ -214,6 +234,7 @@ static void *Realloc(void *ptr, size_t size, int tag, const char *file, int line
header->file = file;
header->line = line;
header->tag = tag;
+ header->id = s_allocId++;
header->free = false;
if (!s_allocRoot) {
s_allocRoot = header;
@@ -242,7 +263,7 @@ static void ReportLeaks()
AllocHeader *header = s_allocRoot;
while (header) {
if (!header->free) {
- printf(" Leak: %zu bytes %s %d\n", header->size, header->file, header->line);
+ printf(" Leak: ID %u, %zu bytes, %s %d\n", header->id, header->size, header->file, header->line);
anyLeaks = true;
}
auto redzone = (const uint32_t *)((const uint8_t *)header + header->size - sizeof(kAllocRedzone));
@@ -287,6 +308,10 @@ static void PrintMemoryUsage()
#else
static void *Realloc(void *ptr, size_t size, int /*tag*/, const char * /*file*/, int /*line*/)
{
+ if (ptr && size == 0 && s_free) {
+ s_free(ptr);
+ return nullptr;
+ }
void *mem = s_realloc(ptr, size);
if (size > 0) {
XA_DEBUG_ASSERT(mem);
@@ -304,6 +329,7 @@ static void *Realloc(void *ptr, size_t size, int /*tag*/, const char * /*file*/,
struct ProfileData
{
clock_t addMeshReal;
+ clock_t addMeshCopyData;
std::atomic<clock_t> addMeshThread;
std::atomic<clock_t> addMeshCreateColocals;
std::atomic<clock_t> addMeshCreateFaceGroups;
@@ -312,11 +338,14 @@ struct ProfileData
std::atomic<clock_t> addMeshCreateChartGroupsThread;
clock_t computeChartsReal;
std::atomic<clock_t> computeChartsThread;
- std::atomic<clock_t> atlasBuilder;
- std::atomic<clock_t> atlasBuilderInit;
- std::atomic<clock_t> atlasBuilderCreateInitialCharts;
- std::atomic<clock_t> atlasBuilderGrowCharts;
- std::atomic<clock_t> atlasBuilderMergeCharts;
+ std::atomic<clock_t> buildAtlas;
+ std::atomic<clock_t> buildAtlasInit;
+ std::atomic<clock_t> buildAtlasPlaceSeeds;
+ std::atomic<clock_t> buildAtlasRelocateSeeds;
+ std::atomic<clock_t> buildAtlasResetCharts;
+ std::atomic<clock_t> buildAtlasGrowCharts;
+ std::atomic<clock_t> buildAtlasMergeCharts;
+ std::atomic<clock_t> buildAtlasFillHoles;
std::atomic<clock_t> createChartMeshesReal;
std::atomic<clock_t> createChartMeshesThread;
std::atomic<clock_t> fixChartMeshTJunctions;
@@ -327,11 +356,15 @@ struct ProfileData
std::atomic<clock_t> parameterizeChartsLSCM;
std::atomic<clock_t> parameterizeChartsEvaluateQuality;
clock_t packCharts;
+ clock_t packChartsAddCharts;
+ std::atomic<clock_t> packChartsAddChartsThread;
+ std::atomic<clock_t> packChartsAddChartsRestoreTexcoords;
clock_t packChartsRasterize;
clock_t packChartsDilate;
clock_t packChartsFindLocation;
std::atomic<clock_t> packChartsFindLocationThread;
clock_t packChartsBlit;
+ clock_t buildOutputMeshes;
};
static ProfileData s_profile;
@@ -540,10 +573,10 @@ static bool operator!=(const Vector2 &a, const Vector2 &b)
return a.x != b.x || a.y != b.y;
}
-static Vector2 operator+(const Vector2 &a, const Vector2 &b)
+/*static Vector2 operator+(const Vector2 &a, const Vector2 &b)
{
return Vector2(a.x + b.x, a.y + b.y);
-}
+}*/
static Vector2 operator-(const Vector2 &a, const Vector2 &b)
{
@@ -738,11 +771,6 @@ static Vector3 operator*(const Vector3 &v, float s)
return Vector3(v.x * s, v.y * s, v.z * s);
}
-static Vector3 operator*(float s, const Vector3 &v)
-{
- return Vector3(v.x * s, v.y * s, v.z * s);
-}
-
static Vector3 operator/(const Vector3 &v, float s)
{
return v * (1.0f / s);
@@ -949,282 +977,202 @@ struct AABB
Vector3 min, max;
};
-template <typename T>
-static void construct_range(T * ptr, uint32_t new_size, uint32_t old_size) {
- for (uint32_t i = old_size; i < new_size; i++) {
- new(ptr+i) T; // placement new
- }
-}
-
-template <typename T>
-static void construct_range(T * ptr, uint32_t new_size, uint32_t old_size, const T & elem) {
- for (uint32_t i = old_size; i < new_size; i++) {
- new(ptr+i) T(elem); // placement new
- }
-}
-
-template <typename T>
-static void construct_range(T * ptr, uint32_t new_size, uint32_t old_size, const T * src) {
- for (uint32_t i = old_size; i < new_size; i++) {
- new(ptr+i) T(src[i]); // placement new
- }
-}
-
-template <typename T>
-static void destroy_range(T * ptr, uint32_t new_size, uint32_t old_size) {
- for (uint32_t i = new_size; i < old_size; i++) {
- (ptr+i)->~T(); // Explicit call to the destructor
- }
-}
-
-/**
-* Replacement for std::vector that is easier to debug and provides
-* some nice foreach enumerators.
-*/
-template<typename T>
-class Array {
-public:
- typedef uint32_t size_type;
-
- Array(int memTag = MemTag::Default) : m_memTag(memTag), m_buffer(nullptr), m_capacity(0), m_size(0) {}
+struct ArrayBase
+{
+ ArrayBase(uint32_t elementSize, int memTag = MemTag::Default) : buffer(nullptr), elementSize(elementSize), size(0), capacity(0), memTag(memTag) {}
- Array(const Array &a) : m_memTag(a.m_memTag), m_buffer(nullptr), m_capacity(0), m_size(0)
+ ~ArrayBase()
{
- copy(a.m_buffer, a.m_size);
+ XA_FREE(buffer);
}
- ~Array()
+ XA_INLINE void clear()
{
- destroy();
+ size = 0;
}
- const Array<T> &operator=(const Array<T> &other)
+ void copyTo(ArrayBase &other) const
{
- m_memTag = other.m_memTag;
- m_buffer = other.m_buffer;
- m_capacity = other.m_capacity;
- m_size = other.m_size;
- return *this;
+ XA_DEBUG_ASSERT(elementSize == other.elementSize);
+ other.resize(size, true);
+ memcpy(other.buffer, buffer, size * elementSize);
}
- const T & operator[]( uint32_t index ) const
- {
- XA_DEBUG_ASSERT(index < m_size);
- return m_buffer[index];
- }
-
- T & operator[] ( uint32_t index )
+ void destroy()
{
- XA_DEBUG_ASSERT(index < m_size);
- return m_buffer[index];
+ size = 0;
+ XA_FREE(buffer);
+ buffer = nullptr;
+ capacity = 0;
+ size = 0;
}
- uint32_t size() const { return m_size; }
- const T * data() const { return m_buffer; }
- T * data() { return m_buffer; }
- T * begin() { return m_buffer; }
- T * end() { return m_buffer + m_size; }
- const T * begin() const { return m_buffer; }
- const T * end() const { return m_buffer + m_size; }
- bool isEmpty() const { return m_size == 0; }
-
- void push_back( const T & val )
+ // Insert the given element at the given index shifting all the elements up.
+ void insertAt(uint32_t index, const uint8_t *value)
{
- XA_DEBUG_ASSERT(&val < m_buffer || &val >= m_buffer+m_size);
- uint32_t old_size = m_size;
- uint32_t new_size = m_size + 1;
- setArraySize(new_size);
- construct_range(m_buffer, new_size, old_size, val);
+ XA_DEBUG_ASSERT(index >= 0 && index <= size);
+ resize(size + 1, false);
+ if (index < size - 1)
+ memmove(buffer + elementSize * (index + 1), buffer + elementSize * index, elementSize * (size - 1 - index));
+ memcpy(&buffer[index * elementSize], value, elementSize);
}
- void pop_back()
+ void moveTo(ArrayBase &other)
{
- XA_DEBUG_ASSERT( m_size > 0 );
- resize( m_size - 1 );
+ XA_DEBUG_ASSERT(elementSize == other.elementSize);
+ other.destroy();
+ other.buffer = buffer;
+ other.elementSize = elementSize;
+ other.size = size;
+ other.capacity = capacity;
+ other.memTag = memTag;
+ buffer = nullptr;
+ elementSize = size = capacity = 0;
}
- const T & back() const
+ void pop_back()
{
- XA_DEBUG_ASSERT( m_size > 0 );
- return m_buffer[m_size-1];
+ XA_DEBUG_ASSERT(size > 0);
+ resize(size - 1, false);
}
- T & back()
+ void push_back(const uint8_t *value)
{
- XA_DEBUG_ASSERT( m_size > 0 );
- return m_buffer[m_size-1];
+ XA_DEBUG_ASSERT(value < buffer || value >= buffer + size);
+ resize(size + 1, false);
+ memcpy(&buffer[(size - 1) * elementSize], value, elementSize);
}
- const T & front() const
+ // Remove the element at the given index. This is an expensive operation!
+ void removeAt(uint32_t index)
{
- XA_DEBUG_ASSERT( m_size > 0 );
- return m_buffer[0];
+ XA_DEBUG_ASSERT(index >= 0 && index < size);
+ if (size != 1)
+ memmove(buffer + elementSize * index, buffer + elementSize * (index + 1), elementSize * (size - 1 - index));
+ size--;
}
- T & front()
+ void reserve(uint32_t desiredSize)
{
- XA_DEBUG_ASSERT( m_size > 0 );
- return m_buffer[0];
+ if (desiredSize > capacity)
+ setArrayCapacity(desiredSize);
}
- // Remove the element at the given index. This is an expensive operation!
- void removeAt(uint32_t index)
+ void resize(uint32_t newSize, bool exact)
{
- XA_DEBUG_ASSERT(index >= 0 && index < m_size);
- if (m_size == 1) {
- clear();
- }
- else {
- m_buffer[index].~T();
- memmove(m_buffer+index, m_buffer+index+1, sizeof(T) * (m_size - 1 - index));
- m_size--;
+ size = newSize;
+ if (size > capacity) {
+ // First allocation is always exact. Otherwise, following allocations grow array to 150% of desired size.
+ uint32_t newBufferSize;
+ if (capacity == 0 || exact)
+ newBufferSize = size;
+ else
+ newBufferSize = size + (size >> 2);
+ setArrayCapacity(newBufferSize);
}
}
- // Insert the given element at the given index shifting all the elements up.
- void insertAt(uint32_t index, const T & val = T())
+ void setArrayCapacity(uint32_t newCapacity)
{
- XA_DEBUG_ASSERT( index >= 0 && index <= m_size );
- setArraySize(m_size + 1);
- if (index < m_size - 1) {
- memmove(m_buffer+index+1, m_buffer+index, sizeof(T) * (m_size - 1 - index));
+ XA_DEBUG_ASSERT(newCapacity >= size);
+ if (newCapacity == 0) {
+ // free the buffer.
+ if (buffer != nullptr) {
+ XA_FREE(buffer);
+ buffer = nullptr;
+ }
+ } else {
+ // realloc the buffer
+ buffer = XA_REALLOC_SIZE(memTag, buffer, newCapacity * elementSize);
}
- // Copy-construct into the newly opened slot.
- new(m_buffer+index) T(val);
- }
-
- void append(const Array<T> & other)
- {
- append(other.m_buffer, other.m_size);
+ capacity = newCapacity;
}
- void resize(uint32_t new_size)
- {
- uint32_t old_size = m_size;
- // Destruct old elements (if we're shrinking).
- destroy_range(m_buffer, new_size, old_size);
- setArraySize(new_size);
- // Call default constructors
- construct_range(m_buffer, new_size, old_size);
- }
+ uint8_t *buffer;
+ uint32_t elementSize;
+ uint32_t size;
+ uint32_t capacity;
+ int memTag;
+};
- void resize(uint32_t new_size, const T & elem)
- {
- XA_DEBUG_ASSERT(&elem < m_buffer || &elem > m_buffer+m_size);
- uint32_t old_size = m_size;
- // Destruct old elements (if we're shrinking).
- destroy_range(m_buffer, new_size, old_size);
- setArraySize(new_size);
- // Call copy constructors
- construct_range(m_buffer, new_size, old_size, elem);
- }
+template<typename T>
+class Array
+{
+public:
+ Array(int memTag = MemTag::Default) : m_base(sizeof(T), memTag) {}
+ Array(const Array&) = delete;
+ const Array &operator=(const Array &) = delete;
- void clear()
+ XA_INLINE const T &operator[](uint32_t index) const
{
- // Destruct old elements
- destroy_range(m_buffer, 0, m_size);
- m_size = 0;
+ XA_DEBUG_ASSERT(index < m_base.size);
+ return ((const T *)m_base.buffer)[index];
}
- void destroy()
+ XA_INLINE T &operator[](uint32_t index)
{
- clear();
- XA_FREE(m_buffer);
- m_buffer = nullptr;
- m_capacity = 0;
- m_size = 0;
+ XA_DEBUG_ASSERT(index < m_base.size);
+ return ((T *)m_base.buffer)[index];
}
- void reserve(uint32_t desired_size)
+ XA_INLINE const T &back() const
{
- if (desired_size > m_capacity) {
- setArrayCapacity(desired_size);
- }
+ XA_DEBUG_ASSERT(!isEmpty());
+ return ((const T *)m_base.buffer)[m_base.size - 1];
}
- void copy(const T * data, uint32_t count)
- {
- destroy_range(m_buffer, 0, m_size);
- setArraySize(count);
- construct_range(m_buffer, count, 0, data);
- }
+ XA_INLINE T *begin() { return (T *)m_base.buffer; }
+ XA_INLINE void clear() { m_base.clear(); }
+ void copyTo(Array &other) const { m_base.copyTo(other.m_base); }
+ XA_INLINE const T *data() const { return (const T *)m_base.buffer; }
+ XA_INLINE T *data() { return (T *)m_base.buffer; }
+ XA_INLINE T *end() { return (T *)m_base.buffer + m_base.size; }
+ XA_INLINE bool isEmpty() const { return m_base.size == 0; }
+ void insertAt(uint32_t index, const T &value) { m_base.insertAt(index, (const uint8_t *)&value); }
+ void moveTo(Array &other) { m_base.moveTo(other.m_base); }
+ void push_back(const T &value) { m_base.push_back((const uint8_t *)&value); }
+ void pop_back() { m_base.pop_back(); }
+ void removeAt(uint32_t index) { m_base.removeAt(index); }
+ void reserve(uint32_t desiredSize) { m_base.reserve(desiredSize); }
+ void resize(uint32_t newSize) { m_base.resize(newSize, true); }
- void moveTo(Array<T> &other)
+ void setAll(const T &value)
{
- other.destroy();
- swap(m_buffer, other.m_buffer);
- swap(m_capacity, other.m_capacity);
- swap(m_size, other.m_size);
+ auto buffer = (T *)m_base.buffer;
+ for (uint32_t i = 0; i < m_base.size; i++)
+ buffer[i] = value;
}
-protected:
- void setArraySize(uint32_t new_size)
- {
- m_size = new_size;
- if (new_size > m_capacity) {
- uint32_t new_buffer_size;
- if (m_capacity == 0) {
- // first allocation is exact
- new_buffer_size = new_size;
- }
- else {
- // following allocations grow array by 25%
- new_buffer_size = new_size + (new_size >> 2);
- }
- setArrayCapacity( new_buffer_size );
- }
- }
- void setArrayCapacity(uint32_t new_capacity)
- {
- XA_DEBUG_ASSERT(new_capacity >= m_size);
- if (new_capacity == 0) {
- // free the buffer.
- if (m_buffer != nullptr) {
- XA_FREE(m_buffer);
- m_buffer = nullptr;
- }
- }
- else {
- // realloc the buffer
- m_buffer = XA_REALLOC(m_memTag, m_buffer, T, new_capacity);
- }
- m_capacity = new_capacity;
- }
+ XA_INLINE uint32_t size() const { return m_base.size; }
+ XA_INLINE void zeroOutMemory() { memset(m_base.buffer, 0, m_base.elementSize * m_base.size); }
- int m_memTag;
- T * m_buffer;
- uint32_t m_capacity;
- uint32_t m_size;
+private:
+ ArrayBase m_base;
};
-/// Basis class to compute tangent space basis, ortogonalizations and to
-/// transform vectors from one space to another.
+/// Basis class to compute tangent space basis, ortogonalizations and to transform vectors from one space to another.
struct Basis
{
- void buildFrameForDirection(const Vector3 &d, float angle = 0)
+ XA_NODISCARD static Vector3 computeTangent(const Vector3 &normal)
{
- XA_ASSERT(isNormalized(d));
- normal = d;
+ XA_ASSERT(isNormalized(normal));
// Choose minimum axis.
- if (fabsf(normal.x) < fabsf(normal.y) && fabsf(normal.x) < fabsf(normal.z)) {
+ Vector3 tangent;
+ if (fabsf(normal.x) < fabsf(normal.y) && fabsf(normal.x) < fabsf(normal.z))
tangent = Vector3(1, 0, 0);
- } else if (fabsf(normal.y) < fabsf(normal.z)) {
+ else if (fabsf(normal.y) < fabsf(normal.z))
tangent = Vector3(0, 1, 0);
- } else {
+ else
tangent = Vector3(0, 0, 1);
- }
// Ortogonalize
tangent -= normal * dot(normal, tangent);
tangent = normalize(tangent, kEpsilon);
- bitangent = cross(normal, tangent);
- // Rotate frame around normal according to angle.
- if (angle != 0.0f) {
- float c = cosf(angle);
- float s = sinf(angle);
- Vector3 tmp = c * tangent - s * bitangent;
- bitangent = s * tangent + c * bitangent;
- tangent = tmp;
- }
+ return tangent;
+ }
+
+ XA_NODISCARD static Vector3 computeBitangent(const Vector3 &normal, const Vector3 &tangent)
+ {
+ return cross(normal, tangent);
}
Vector3 tangent = Vector3(0.0f);
@@ -1246,7 +1194,7 @@ public:
void resize(uint32_t new_size)
{
m_size = new_size;
- m_wordArray.resize( (m_size + 31) >> 5 );
+ m_wordArray.resize((m_size + 31) >> 5);
}
/// Get bit.
@@ -1286,35 +1234,28 @@ public:
{
m_rowStride = (m_width + 63) >> 6;
m_data.resize(m_rowStride * m_height);
+ m_data.zeroOutMemory();
}
- BitImage(const BitImage &other)
- {
- m_width = other.m_width;
- m_height = other.m_height;
- m_rowStride = other.m_rowStride;
- m_data.resize(m_rowStride * m_height);
- memcpy(m_data.data(), other.m_data.data(), m_rowStride * m_height * sizeof(uint64_t));
- }
+ BitImage(const BitImage &other) = delete;
+ const BitImage &operator=(const BitImage &other) = delete;
+ uint32_t width() const { return m_width; }
+ uint32_t height() const { return m_height; }
- const BitImage &operator=(const BitImage &other)
+ void copyTo(BitImage &other)
{
- m_width = other.m_width;
- m_height = other.m_height;
- m_rowStride = other.m_rowStride;
- m_data = other.m_data;
- return *this;
+ other.m_width = m_width;
+ other.m_height = m_height;
+ other.m_rowStride = m_rowStride;
+ m_data.copyTo(other.m_data);
}
- uint32_t width() const { return m_width; }
- uint32_t height() const { return m_height; }
-
void resize(uint32_t w, uint32_t h, bool discard)
{
const uint32_t rowStride = (w + 63) >> 6;
if (discard) {
m_data.resize(rowStride * h);
- memset(m_data.data(), 0, m_data.size() * sizeof(uint64_t));
+ m_data.zeroOutMemory();
} else {
Array<uint64_t> tmp;
tmp.resize(rowStride * h);
@@ -1351,7 +1292,7 @@ public:
void clearAll()
{
- memset(m_data.data(), 0, m_data.size() * sizeof(uint64_t));
+ m_data.zeroOutMemory();
}
bool canBlit(const BitImage &image, uint32_t offsetX, uint32_t offsetY) const
@@ -1405,7 +1346,7 @@ public:
tmp.setBitAt(x, y);
}
}
- swap(m_data, tmp.m_data);
+ tmp.m_data.copyTo(m_data);
}
}
@@ -1754,36 +1695,28 @@ class FullVector
{
public:
FullVector(uint32_t dim) { m_array.resize(dim); }
- FullVector(const FullVector &v) : m_array(v.m_array) {}
-
- const FullVector &operator=(const FullVector &v)
- {
- XA_ASSERT(dimension() == v.dimension());
- m_array = v.m_array;
- return *this;
- }
-
- uint32_t dimension() const { return m_array.size(); }
- const float &operator[]( uint32_t index ) const { return m_array[index]; }
- float &operator[] ( uint32_t index ) { return m_array[index]; }
+ FullVector(const FullVector &v) { v.m_array.copyTo(m_array); }
+ const FullVector &operator=(const FullVector &v) = delete;
+ XA_INLINE uint32_t dimension() const { return m_array.size(); }
+ XA_INLINE const float &operator[](uint32_t index) const { return m_array[index]; }
+ XA_INLINE float &operator[](uint32_t index) { return m_array[index]; }
void fill(float f)
{
const uint32_t dim = dimension();
- for (uint32_t i = 0; i < dim; i++) {
+ for (uint32_t i = 0; i < dim; i++)
m_array[i] = f;
- }
}
private:
Array<float> m_array;
};
-template<typename Key, typename Value, typename H = Hash<Key>, typename E = Equal<Key> >
+template<typename Key, typename H = Hash<Key>, typename E = Equal<Key> >
class HashMap
{
public:
- HashMap(int memTag, uint32_t size) : m_memTag(memTag), m_size(size), m_numSlots(0), m_slots(nullptr), m_keys(memTag), m_values(memTag), m_next(memTag)
+ HashMap(int memTag, uint32_t size) : m_memTag(memTag), m_size(size), m_numSlots(0), m_slots(nullptr), m_keys(memTag), m_next(memTag)
{
}
@@ -1793,15 +1726,12 @@ public:
XA_FREE(m_slots);
}
- const Value &value(uint32_t index) const { return m_values[index]; }
-
- void add(const Key &key, const Value &value)
+ void add(const Key &key)
{
if (!m_slots)
alloc();
const uint32_t hash = computeHash(key);
m_keys.push_back(key);
- m_values.push_back(value);
m_next.push_back(m_slots[hash]);
m_slots[hash] = m_next.size() - 1;
}
@@ -1842,7 +1772,6 @@ private:
for (uint32_t i = 0; i < m_numSlots; i++)
m_slots[i] = UINT32_MAX;
m_keys.reserve(m_size);
- m_values.reserve(m_size);
m_next.reserve(m_size);
}
@@ -1857,7 +1786,6 @@ private:
uint32_t m_numSlots;
uint32_t *m_slots;
Array<Key> m_keys;
- Array<Value> m_values;
Array<uint32_t> m_next;
};
@@ -2190,7 +2118,7 @@ private:
}
}
// Remove duplicate element.
- XA_DEBUG_ASSERT(output.front() == output.back());
+ XA_DEBUG_ASSERT(output.size() > 0);
output.pop_back();
}
@@ -2284,7 +2212,7 @@ public:
const EdgeKey key(vertex0, vertex1);
if (m_edgeMap.get(key) != UINT32_MAX)
result = AddFaceResult::DuplicateEdge;
- m_edgeMap.add(key, firstIndex + i);
+ m_edgeMap.add(key);
}
}
return result;
@@ -2301,7 +2229,9 @@ public:
Array<uint32_t> colocals;
Array<uint32_t> potential;
m_colocalVertexCount = 0;
- m_nextColocalVertex.resize(vertexCount, UINT32_MAX);
+ m_nextColocalVertex.resize(vertexCount);
+ for (uint32_t i = 0; i < vertexCount; i++)
+ m_nextColocalVertex[i] = UINT32_MAX;
for (uint32_t i = 0; i < vertexCount; i++) {
if (m_nextColocalVertex[i] != UINT32_MAX)
continue; // Already linked.
@@ -2467,12 +2397,10 @@ public:
void linkBoundaries()
{
const uint32_t edgeCount = m_indices.size();
- HashMap<uint32_t, uint32_t> vertexToEdgeMap(MemTag::Mesh, edgeCount);
+ HashMap<uint32_t> vertexToEdgeMap(MemTag::Mesh, edgeCount); // Edge is index / 2
for (uint32_t i = 0; i < edgeCount; i++) {
- const uint32_t vertex0 = m_indices[meshEdgeIndex0(i)];
- const uint32_t vertex1 = m_indices[meshEdgeIndex1(i)];
- vertexToEdgeMap.add(vertex0, i);
- vertexToEdgeMap.add(vertex1, i);
+ vertexToEdgeMap.add(m_indices[meshEdgeIndex0(i)]);
+ vertexToEdgeMap.add(m_indices[meshEdgeIndex1(i)]);
}
m_nextBoundaryEdges.resize(edgeCount);
for (uint32_t i = 0; i < edgeCount; i++)
@@ -2497,9 +2425,9 @@ public:
const uint32_t startVertex = m_indices[meshEdgeIndex1(currentEdge)];
uint32_t bestNextEdge = UINT32_MAX;
for (ColocalVertexIterator it(this, startVertex); !it.isDone(); it.advance()) {
- uint32_t mapOtherEdgeIndex = vertexToEdgeMap.get(it.vertex());
- while (mapOtherEdgeIndex != UINT32_MAX) {
- const uint32_t otherEdge = vertexToEdgeMap.value(mapOtherEdgeIndex);
+ uint32_t mapIndex = vertexToEdgeMap.get(it.vertex());
+ while (mapIndex != UINT32_MAX) {
+ const uint32_t otherEdge = mapIndex / 2; // Two vertices added per edge.
if (m_oppositeEdges[otherEdge] != UINT32_MAX)
goto next; // Not a boundary edge.
if (linkedEdges.bitAt(otherEdge))
@@ -2515,7 +2443,7 @@ public:
if (bestNextEdge != firstEdge && (bestNextEdge == UINT32_MAX || it.vertex() == startVertex))
bestNextEdge = otherEdge;
next:
- mapOtherEdgeIndex = vertexToEdgeMap.getNext(mapOtherEdgeIndex);
+ mapIndex = vertexToEdgeMap.getNext(mapIndex);
}
}
if (bestNextEdge == UINT32_MAX) {
@@ -2567,9 +2495,8 @@ public:
uint32_t result = UINT32_MAX;
if (m_nextColocalVertex.isEmpty()) {
EdgeKey key(vertex0, vertex1);
- uint32_t mapEdgeIndex = m_edgeMap.get(key);
- while (mapEdgeIndex != UINT32_MAX) {
- const uint32_t edge = m_edgeMap.value(mapEdgeIndex);
+ uint32_t edge = m_edgeMap.get(key);
+ while (edge != UINT32_MAX) {
// Don't find edges of ignored faces.
if ((faceGroup == UINT32_MAX || m_faceGroups[meshEdgeFace(edge)] == faceGroup) && !isFaceIgnored(meshEdgeFace(edge))) {
//XA_DEBUG_ASSERT(m_id != UINT32_MAX || (m_id == UINT32_MAX && result == UINT32_MAX)); // duplicate edge - ignore on initial meshes
@@ -2578,15 +2505,14 @@ public:
return result;
#endif
}
- mapEdgeIndex = m_edgeMap.getNext(mapEdgeIndex);
+ edge = m_edgeMap.getNext(edge);
}
} else {
for (ColocalVertexIterator it0(this, vertex0); !it0.isDone(); it0.advance()) {
for (ColocalVertexIterator it1(this, vertex1); !it1.isDone(); it1.advance()) {
EdgeKey key(it0.vertex(), it1.vertex());
- uint32_t mapEdgeIndex = m_edgeMap.get(key);
- while (mapEdgeIndex != UINT32_MAX) {
- const uint32_t edge = m_edgeMap.value(mapEdgeIndex);
+ uint32_t edge = m_edgeMap.get(key);
+ while (edge != UINT32_MAX) {
// Don't find edges of ignored faces.
if ((faceGroup == UINT32_MAX || m_faceGroups[meshEdgeFace(edge)] == faceGroup) && !isFaceIgnored(meshEdgeFace(edge))) {
XA_DEBUG_ASSERT(m_id != UINT32_MAX || (m_id == UINT32_MAX && result == UINT32_MAX)); // duplicate edge - ignore on initial meshes
@@ -2595,7 +2521,7 @@ public:
return result;
#endif
}
- mapEdgeIndex = m_edgeMap.getNext(mapEdgeIndex);
+ edge = m_edgeMap.getNext(edge);
}
}
}
@@ -2802,24 +2728,24 @@ public:
return false;
}
- float epsilon() const { return m_epsilon; }
- uint32_t edgeCount() const { return m_indices.size(); }
- uint32_t oppositeEdge(uint32_t edge) const { return m_oppositeEdges[edge]; }
- bool isBoundaryEdge(uint32_t edge) const { return m_oppositeEdges[edge] == UINT32_MAX; }
- bool isBoundaryVertex(uint32_t vertex) const { return m_boundaryVertices[vertex]; }
- uint32_t colocalVertexCount() const { return m_colocalVertexCount; }
- uint32_t vertexCount() const { return m_positions.size(); }
- uint32_t vertexAt(uint32_t i) const { return m_indices[i]; }
- const Vector3 &position(uint32_t vertex) const { return m_positions[vertex]; }
- const Vector3 &normal(uint32_t vertex) const { XA_DEBUG_ASSERT(m_flags & MeshFlags::HasNormals); return m_normals[vertex]; }
- const Vector2 &texcoord(uint32_t vertex) const { return m_texcoords[vertex]; }
- Vector2 &texcoord(uint32_t vertex) { return m_texcoords[vertex]; }
- Vector2 *texcoords() { return m_texcoords.data(); }
- uint32_t faceCount() const { return m_indices.size() / 3; }
- uint32_t faceGroupCount() const { XA_DEBUG_ASSERT(m_flags & MeshFlags::HasFaceGroups); return m_faceGroups.size(); }
- uint32_t faceGroupAt(uint32_t face) const { XA_DEBUG_ASSERT(m_flags & MeshFlags::HasFaceGroups); return m_faceGroups[face]; }
- const uint32_t *indices() const { return m_indices.data(); }
- uint32_t indexCount() const { return m_indices.size(); }
+ XA_INLINE float epsilon() const { return m_epsilon; }
+ XA_INLINE uint32_t edgeCount() const { return m_indices.size(); }
+ XA_INLINE uint32_t oppositeEdge(uint32_t edge) const { return m_oppositeEdges[edge]; }
+ XA_INLINE bool isBoundaryEdge(uint32_t edge) const { return m_oppositeEdges[edge] == UINT32_MAX; }
+ XA_INLINE bool isBoundaryVertex(uint32_t vertex) const { return m_boundaryVertices[vertex]; }
+ XA_INLINE uint32_t colocalVertexCount() const { return m_colocalVertexCount; }
+ XA_INLINE uint32_t vertexCount() const { return m_positions.size(); }
+ XA_INLINE uint32_t vertexAt(uint32_t i) const { return m_indices[i]; }
+ XA_INLINE const Vector3 &position(uint32_t vertex) const { return m_positions[vertex]; }
+ XA_INLINE const Vector3 &normal(uint32_t vertex) const { XA_DEBUG_ASSERT(m_flags & MeshFlags::HasNormals); return m_normals[vertex]; }
+ XA_INLINE const Vector2 &texcoord(uint32_t vertex) const { return m_texcoords[vertex]; }
+ XA_INLINE Vector2 &texcoord(uint32_t vertex) { return m_texcoords[vertex]; }
+ XA_INLINE Vector2 *texcoords() { return m_texcoords.data(); }
+ XA_INLINE uint32_t faceCount() const { return m_indices.size() / 3; }
+ XA_INLINE uint32_t faceGroupCount() const { XA_DEBUG_ASSERT(m_flags & MeshFlags::HasFaceGroups); return m_faceGroups.size(); }
+ XA_INLINE uint32_t faceGroupAt(uint32_t face) const { XA_DEBUG_ASSERT(m_flags & MeshFlags::HasFaceGroups); return m_faceGroups[face]; }
+ XA_INLINE const uint32_t *indices() const { return m_indices.data(); }
+ XA_INLINE uint32_t indexCount() const { return m_indices.size(); }
private:
bool isFaceIgnored(uint32_t face) const { return (m_flags & MeshFlags::HasIgnoredFaces) && m_faceIgnore[face]; }
@@ -2865,7 +2791,7 @@ private:
uint32_t v1;
};
- HashMap<EdgeKey, uint32_t> m_edgeMap;
+ HashMap<EdgeKey> m_edgeMap;
public:
class BoundaryEdgeIterator
@@ -2950,37 +2876,37 @@ public:
bool isDone() const
{
- return m_vertex0It.isDone() && m_vertex1It.isDone() && m_mapEdgeIndex == UINT32_MAX;
+ return m_vertex0It.isDone() && m_vertex1It.isDone() && m_edge == UINT32_MAX;
}
uint32_t edge() const
{
- return m_mesh->m_edgeMap.value(m_mapEdgeIndex);
+ return m_edge;
}
private:
void resetElement()
{
- m_mapEdgeIndex = m_mesh->m_edgeMap.get(Mesh::EdgeKey(m_vertex0It.vertex(), m_vertex1It.vertex()));
- while (m_mapEdgeIndex != UINT32_MAX) {
+ m_edge = m_mesh->m_edgeMap.get(Mesh::EdgeKey(m_vertex0It.vertex(), m_vertex1It.vertex()));
+ while (m_edge != UINT32_MAX) {
if (!isIgnoredFace())
break;
- m_mapEdgeIndex = m_mesh->m_edgeMap.getNext(m_mapEdgeIndex);
+ m_edge = m_mesh->m_edgeMap.getNext(m_edge);
}
- if (m_mapEdgeIndex == UINT32_MAX)
+ if (m_edge == UINT32_MAX)
advanceVertex1();
}
void advanceElement()
{
for (;;) {
- m_mapEdgeIndex = m_mesh->m_edgeMap.getNext(m_mapEdgeIndex);
- if (m_mapEdgeIndex == UINT32_MAX)
+ m_edge = m_mesh->m_edgeMap.getNext(m_edge);
+ if (m_edge == UINT32_MAX)
break;
if (!isIgnoredFace())
break;
}
- if (m_mapEdgeIndex == UINT32_MAX)
+ if (m_edge == UINT32_MAX)
advanceVertex1();
}
@@ -3004,14 +2930,13 @@ public:
bool isIgnoredFace() const
{
- const uint32_t edge = m_mesh->m_edgeMap.value(m_mapEdgeIndex);
- return m_mesh->m_faceIgnore[meshEdgeFace(edge)];
+ return m_mesh->m_faceIgnore[meshEdgeFace(m_edge)];
}
const Mesh *m_mesh;
ColocalVertexIterator m_vertex0It, m_vertex1It;
const uint32_t m_vertex1;
- uint32_t m_mapEdgeIndex;
+ uint32_t m_edge;
};
class FaceEdgeIterator
@@ -3334,7 +3259,7 @@ static Mesh *meshFixTJunctions(const Mesh &inputMesh, bool *duplicatedEdge, bool
if (splitEdges.isEmpty())
return nullptr;
const uint32_t faceCount = inputMesh.faceCount();
- Mesh *mesh = XA_NEW(MemTag::Mesh, Mesh, inputMesh.epsilon(), vertexCount + splitEdges.size(), faceCount);
+ Mesh *mesh = XA_NEW_ARGS(MemTag::Mesh, Mesh, inputMesh.epsilon(), vertexCount + splitEdges.size(), faceCount);
for (uint32_t v = 0; v < vertexCount; v++)
mesh->addVertex(inputMesh.position(v));
Array<uint32_t> indexArray;
@@ -3567,8 +3492,9 @@ public:
}
m_workers.resize(std::thread::hardware_concurrency() <= 1 ? 1 : std::thread::hardware_concurrency() - 1);
for (uint32_t i = 0; i < m_workers.size(); i++) {
+ new (&m_workers[i]) Worker();
m_workers[i].wakeup = false;
- m_workers[i].thread = XA_NEW(MemTag::Default, std::thread, workerThread, this, &m_workers[i]);
+ m_workers[i].thread = XA_NEW_ARGS(MemTag::Default, std::thread, workerThread, this, &m_workers[i]);
}
}
@@ -3584,6 +3510,7 @@ public:
worker.thread->join();
worker.thread->~thread();
XA_FREE(worker.thread);
+ worker.~Worker();
}
for (uint32_t i = 0; i < m_maxGroups; i++)
m_groups[i].~TaskGroup();
@@ -3770,6 +3697,7 @@ private:
struct UvMeshChart
{
+ Array<uint32_t> faces;
Array<uint32_t> indices;
uint32_t material;
};
@@ -3828,7 +3756,7 @@ public:
m_numVertices = p;
}
- void clipVerticalPlane(float offset, float clipdirection )
+ void clipVerticalPlane(float offset, float clipdirection)
{
Vector2 *v = m_vertexBuffers[m_activeVertexBuffer];
m_activeVertexBuffer ^= 1;
@@ -3877,7 +3805,7 @@ public:
computeArea();
}
- float area()
+ float area() const
{
return m_area;
}
@@ -3959,9 +3887,8 @@ struct Triangle
if ( (aC >= BK_INSIDE) && (bC >= BK_INSIDE) && (cC >= BK_INSIDE) ) {
for (float y = y0; y < y0 + BK_SIZE; y++) {
for (float x = x0; x < x0 + BK_SIZE; x++) {
- if (!cb(param, (int)x, (int)y)) {
+ if (!cb(param, (int)x, (int)y))
return false;
- }
}
}
} else { // Partially covered block
@@ -3974,17 +3901,15 @@ struct Triangle
float CX3 = CY3;
for (float x = x0; x < x0 + BK_SIZE; x++) { // @@ This is not clipping to scissor rectangle correctly.
if (CX1 >= PX_INSIDE && CX2 >= PX_INSIDE && CX3 >= PX_INSIDE) {
- if (!cb(param, (int)x, (int)y)) {
+ if (!cb(param, (int)x, (int)y))
return false;
- }
} else if ((CX1 >= PX_OUTSIDE) && (CX2 >= PX_OUTSIDE) && (CX3 >= PX_OUTSIDE)) {
// triangle partially covers pixel. do clipping.
ClippedTriangle ct(v1 - Vector2(x, y), v2 - Vector2(x, y), v3 - Vector2(x, y));
ct.clipAABox(-0.5, -0.5, 0.5, 0.5);
if (ct.area() > 0.0f) {
- if (!cb(param, (int)x, (int)y)) {
+ if (!cb(param, (int)x, (int)y))
return false;
- }
}
}
CX1 += n1.x;
@@ -4065,18 +3990,28 @@ public:
float v; // value
};
- Matrix(uint32_t d) : m_width(d) { m_array.resize(d); }
- Matrix(uint32_t w, uint32_t h) : m_width(w) { m_array.resize(h); }
- Matrix(const Matrix &m) : m_width(m.m_width) { m_array = m.m_array; }
-
- const Matrix &operator=(const Matrix &m)
+ Matrix(uint32_t d) : m_width(d)
{
- XA_ASSERT(width() == m.width());
- XA_ASSERT(height() == m.height());
- m_array = m.m_array;
- return *this;
+ m_array.resize(d);
+ for (uint32_t i = 0; i < m_array.size(); i++)
+ new (&m_array[i]) Array<Coefficient>();
+ }
+
+ Matrix(uint32_t w, uint32_t h) : m_width(w)
+ {
+ m_array.resize(h);
+ for (uint32_t i = 0; i < m_array.size(); i++)
+ new (&m_array[i]) Array<Coefficient>();
+ }
+
+ ~Matrix()
+ {
+ for (uint32_t i = 0; i < m_array.size(); i++)
+ m_array[i].~Array();
}
+ Matrix(const Matrix &m) = delete;
+ const Matrix &operator=(const Matrix &m) = delete;
uint32_t width() const { return m_width; }
uint32_t height() const { return m_array.size(); }
bool isSquare() const { return width() == height(); }
@@ -4274,428 +4209,7 @@ static void mult(const Matrix &A, const Matrix &B, Matrix &C)
} // namespace sparse
-class JacobiPreconditioner
-{
-public:
- JacobiPreconditioner(const sparse::Matrix &M, bool symmetric) : m_inverseDiagonal(M.width())
- {
- XA_ASSERT(M.isSquare());
- for (uint32_t x = 0; x < M.width(); x++) {
- float elem = M.getCoefficient(x, x);
- //XA_DEBUG_ASSERT( elem != 0.0f ); // This can be zero in the presence of zero area triangles.
- if (symmetric) {
- m_inverseDiagonal[x] = (elem != 0) ? 1.0f / sqrtf(fabsf(elem)) : 1.0f;
- } else {
- m_inverseDiagonal[x] = (elem != 0) ? 1.0f / elem : 1.0f;
- }
- }
- }
-
- void apply(const FullVector &x, FullVector &y) const
- {
- XA_DEBUG_ASSERT(x.dimension() == m_inverseDiagonal.dimension());
- XA_DEBUG_ASSERT(y.dimension() == m_inverseDiagonal.dimension());
- // @@ Wrap vector component-wise product into a separate function.
- const uint32_t D = x.dimension();
- for (uint32_t i = 0; i < D; i++) {
- y[i] = m_inverseDiagonal[i] * x[i];
- }
- }
-
-private:
- FullVector m_inverseDiagonal;
-};
-
-// Linear solvers.
-class Solver
-{
-public:
- // Solve the symmetric system: At·A·x = At·b
- static bool LeastSquaresSolver(const sparse::Matrix &A, const FullVector &b, FullVector &x, float epsilon = 1e-5f)
- {
- XA_DEBUG_ASSERT(A.width() == x.dimension());
- XA_DEBUG_ASSERT(A.height() == b.dimension());
- XA_DEBUG_ASSERT(A.height() >= A.width()); // @@ If height == width we could solve it directly...
- const uint32_t D = A.width();
- sparse::Matrix At(A.height(), A.width());
- sparse::transpose(A, At);
- FullVector Atb(D);
- sparse::mult(At, b, Atb);
- sparse::Matrix AtA(D);
- sparse::mult(At, A, AtA);
- return SymmetricSolver(AtA, Atb, x, epsilon);
- }
-
- // See section 10.4.3 in: Mesh Parameterization: Theory and Practice, Siggraph Course Notes, August 2007
- static bool LeastSquaresSolver(const sparse::Matrix &A, const FullVector &b, FullVector &x, const uint32_t *lockedParameters, uint32_t lockedCount, float epsilon = 1e-5f)
- {
- XA_DEBUG_ASSERT(A.width() == x.dimension());
- XA_DEBUG_ASSERT(A.height() == b.dimension());
- XA_DEBUG_ASSERT(A.height() >= A.width() - lockedCount);
- // @@ This is not the most efficient way of building a system with reduced degrees of freedom. It would be faster to do it on the fly.
- const uint32_t D = A.width() - lockedCount;
- XA_DEBUG_ASSERT(D > 0);
- // Compute: b - Al * xl
- FullVector b_Alxl(b);
- for (uint32_t y = 0; y < A.height(); y++) {
- const uint32_t count = A.getRow(y).size();
- for (uint32_t e = 0; e < count; e++) {
- uint32_t column = A.getRow(y)[e].x;
- bool isFree = true;
- for (uint32_t i = 0; i < lockedCount; i++) {
- isFree &= (lockedParameters[i] != column);
- }
- if (!isFree) {
- b_Alxl[y] -= x[column] * A.getRow(y)[e].v;
- }
- }
- }
- // Remove locked columns from A.
- sparse::Matrix Af(D, A.height());
- for (uint32_t y = 0; y < A.height(); y++) {
- const uint32_t count = A.getRow(y).size();
- for (uint32_t e = 0; e < count; e++) {
- uint32_t column = A.getRow(y)[e].x;
- uint32_t ix = column;
- bool isFree = true;
- for (uint32_t i = 0; i < lockedCount; i++) {
- isFree &= (lockedParameters[i] != column);
- if (column > lockedParameters[i]) ix--; // shift columns
- }
- if (isFree) {
- Af.setCoefficient(ix, y, A.getRow(y)[e].v);
- }
- }
- }
- // Remove elements from x
- FullVector xf(D);
- for (uint32_t i = 0, j = 0; i < A.width(); i++) {
- bool isFree = true;
- for (uint32_t l = 0; l < lockedCount; l++) {
- isFree &= (lockedParameters[l] != i);
- }
- if (isFree) {
- xf[j++] = x[i];
- }
- }
- // Solve reduced system.
- bool result = LeastSquaresSolver(Af, b_Alxl, xf, epsilon);
- // Copy results back to x.
- for (uint32_t i = 0, j = 0; i < A.width(); i++) {
- bool isFree = true;
- for (uint32_t l = 0; l < lockedCount; l++) {
- isFree &= (lockedParameters[l] != i);
- }
- if (isFree) {
- x[i] = xf[j++];
- }
- }
- return result;
- }
-
-private:
- /**
- * Compute the solution of the sparse linear system Ab=x using the Conjugate
- * Gradient method.
- *
- * Solving sparse linear systems:
- * (1) A·x = b
- *
- * The conjugate gradient algorithm solves (1) only in the case that A is
- * symmetric and positive definite. It is based on the idea of minimizing the
- * function
- *
- * (2) f(x) = 1/2·x·A·x - b·x
- *
- * This function is minimized when its gradient
- *
- * (3) df = A·x - b
- *
- * is zero, which is equivalent to (1). The minimization is carried out by
- * generating a succession of search directions p.k and improved minimizers x.k.
- * At each stage a quantity alfa.k is found that minimizes f(x.k + alfa.k·p.k),
- * and x.k+1 is set equal to the new point x.k + alfa.k·p.k. The p.k and x.k are
- * built up in such a way that x.k+1 is also the minimizer of f over the whole
- * vector space of directions already taken, {p.1, p.2, . . . , p.k}. After N
- * iterations you arrive at the minimizer over the entire vector space, i.e., the
- * solution to (1).
- *
- * For a really good explanation of the method see:
- *
- * "An Introduction to the Conjugate Gradient Method Without the Agonizing Pain",
- * Jonhathan Richard Shewchuk.
- *
- **/
- // Conjugate gradient with preconditioner.
- static bool ConjugateGradientSolver(const JacobiPreconditioner &preconditioner, const sparse::Matrix &A, const FullVector &b, FullVector &x, float epsilon)
- {
- XA_DEBUG_ASSERT( A.isSquare() );
- XA_DEBUG_ASSERT( A.width() == b.dimension() );
- XA_DEBUG_ASSERT( A.width() == x.dimension() );
- int i = 0;
- const int D = A.width();
- const int i_max = 4 * D; // Convergence should be linear, but in some cases, it's not.
- FullVector r(D); // residual
- FullVector p(D); // search direction
- FullVector q(D); //
- FullVector s(D); // preconditioned
- float delta_0;
- float delta_old;
- float delta_new;
- float alpha;
- float beta;
- // r = b - A·x
- sparse::copy(b, r);
- sparse::sgemv(-1, A, x, 1, r);
- // p = M^-1 · r
- preconditioner.apply(r, p);
- delta_new = sparse::dot(r, p);
- delta_0 = delta_new;
- while (i < i_max && delta_new > epsilon * epsilon * delta_0) {
- i++;
- // q = A·p
- sparse::mult(A, p, q);
- // alpha = delta_new / p·q
- alpha = delta_new / sparse::dot(p, q);
- // x = alfa·p + x
- sparse::saxpy(alpha, p, x);
- if ((i & 31) == 0) { // recompute r after 32 steps
- // r = b - A·x
- sparse::copy(b, r);
- sparse::sgemv(-1, A, x, 1, r);
- } else {
- // r = r - alfa·q
- sparse::saxpy(-alpha, q, r);
- }
- // s = M^-1 · r
- preconditioner.apply(r, s);
- delta_old = delta_new;
- delta_new = sparse::dot( r, s );
- beta = delta_new / delta_old;
- // p = s + beta·p
- sparse::scal(beta, p);
- sparse::saxpy(1, s, p);
- }
- return delta_new <= epsilon * epsilon * delta_0;
- }
-
- static bool SymmetricSolver(const sparse::Matrix &A, const FullVector &b, FullVector &x, float epsilon = 1e-5f)
- {
- XA_DEBUG_ASSERT(A.height() == A.width());
- XA_DEBUG_ASSERT(A.height() == b.dimension());
- XA_DEBUG_ASSERT(b.dimension() == x.dimension());
- JacobiPreconditioner jacobi(A, true);
- return ConjugateGradientSolver(jacobi, A, b, x, epsilon);
- }
-};
-
-namespace param {
-
-// Fast sweep in 3 directions
-static bool findApproximateDiameterVertices(Mesh *mesh, uint32_t *a, uint32_t *b)
-{
- XA_DEBUG_ASSERT(a != nullptr);
- XA_DEBUG_ASSERT(b != nullptr);
- const uint32_t vertexCount = mesh->vertexCount();
- uint32_t minVertex[3];
- uint32_t maxVertex[3];
- minVertex[0] = minVertex[1] = minVertex[2] = UINT32_MAX;
- maxVertex[0] = maxVertex[1] = maxVertex[2] = UINT32_MAX;
- for (uint32_t v = 1; v < vertexCount; v++) {
- if (mesh->isBoundaryVertex(v)) {
- minVertex[0] = minVertex[1] = minVertex[2] = v;
- maxVertex[0] = maxVertex[1] = maxVertex[2] = v;
- break;
- }
- }
- if (minVertex[0] == UINT32_MAX) {
- // Input mesh has not boundaries.
- return false;
- }
- for (uint32_t v = 1; v < vertexCount; v++) {
- if (!mesh->isBoundaryVertex(v)) {
- // Skip interior vertices.
- continue;
- }
- const Vector3 &pos = mesh->position(v);
- if (pos.x < mesh->position(minVertex[0]).x)
- minVertex[0] = v;
- else if (pos.x > mesh->position(maxVertex[0]).x)
- maxVertex[0] = v;
- if (pos.y < mesh->position(minVertex[1]).y)
- minVertex[1] = v;
- else if (pos.y > mesh->position(maxVertex[1]).y)
- maxVertex[1] = v;
- if (pos.z < mesh->position(minVertex[2]).z)
- minVertex[2] = v;
- else if (pos.z > mesh->position(maxVertex[2]).z)
- maxVertex[2] = v;
- }
- float lengths[3];
- for (int i = 0; i < 3; i++) {
- lengths[i] = length(mesh->position(minVertex[i]) - mesh->position(maxVertex[i]));
- }
- if (lengths[0] > lengths[1] && lengths[0] > lengths[2]) {
- *a = minVertex[0];
- *b = maxVertex[0];
- } else if (lengths[1] > lengths[2]) {
- *a = minVertex[1];
- *b = maxVertex[1];
- } else {
- *a = minVertex[2];
- *b = maxVertex[2];
- }
- return true;
-}
-
-// Conformal relations from Brecht Van Lommel (based on ABF):
-
-static float vec_angle_cos(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3)
-{
- Vector3 d1 = v1 - v2;
- Vector3 d2 = v3 - v2;
- return clamp(dot(d1, d2) / (length(d1) * length(d2)), -1.0f, 1.0f);
-}
-
-static float vec_angle(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3)
-{
- float dot = vec_angle_cos(v1, v2, v3);
- return acosf(dot);
-}
-
-static void triangle_angles(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3, float *a1, float *a2, float *a3)
-{
- *a1 = vec_angle(v3, v1, v2);
- *a2 = vec_angle(v1, v2, v3);
- *a3 = kPi - *a2 - *a1;
-}
-
-static void setup_abf_relations(sparse::Matrix &A, int row, int id0, int id1, int id2, const Vector3 &p0, const Vector3 &p1, const Vector3 &p2)
-{
- // @@ IC: Wouldn't it be more accurate to return cos and compute 1-cos^2?
- // It does indeed seem to be a little bit more robust.
- // @@ Need to revisit this more carefully!
- float a0, a1, a2;
- triangle_angles(p0, p1, p2, &a0, &a1, &a2);
- float s0 = sinf(a0);
- float s1 = sinf(a1);
- float s2 = sinf(a2);
- if (s1 > s0 && s1 > s2) {
- swap(s1, s2);
- swap(s0, s1);
- swap(a1, a2);
- swap(a0, a1);
- swap(id1, id2);
- swap(id0, id1);
- } else if (s0 > s1 && s0 > s2) {
- swap(s0, s2);
- swap(s0, s1);
- swap(a0, a2);
- swap(a0, a1);
- swap(id0, id2);
- swap(id0, id1);
- }
- float c0 = cosf(a0);
- float ratio = (s2 == 0.0f) ? 1.0f : s1 / s2;
- float cosine = c0 * ratio;
- float sine = s0 * ratio;
- // Note : 2*id + 0 --> u
- // 2*id + 1 --> v
- int u0_id = 2 * id0 + 0;
- int v0_id = 2 * id0 + 1;
- int u1_id = 2 * id1 + 0;
- int v1_id = 2 * id1 + 1;
- int u2_id = 2 * id2 + 0;
- int v2_id = 2 * id2 + 1;
- // Real part
- A.setCoefficient(u0_id, 2 * row + 0, cosine - 1.0f);
- A.setCoefficient(v0_id, 2 * row + 0, -sine);
- A.setCoefficient(u1_id, 2 * row + 0, -cosine);
- A.setCoefficient(v1_id, 2 * row + 0, sine);
- A.setCoefficient(u2_id, 2 * row + 0, 1);
- // Imaginary part
- A.setCoefficient(u0_id, 2 * row + 1, sine);
- A.setCoefficient(v0_id, 2 * row + 1, cosine - 1.0f);
- A.setCoefficient(u1_id, 2 * row + 1, -sine);
- A.setCoefficient(v1_id, 2 * row + 1, -cosine);
- A.setCoefficient(v2_id, 2 * row + 1, 1);
-}
-
-static bool computeLeastSquaresConformalMap(Mesh *mesh)
-{
- // For this to work properly, mesh should not have colocals that have the same
- // attributes, unless you want the vertices to actually have different texcoords.
- const uint32_t vertexCount = mesh->vertexCount();
- const uint32_t D = 2 * vertexCount;
- const uint32_t N = 2 * mesh->faceCount();
- // N is the number of equations (one per triangle)
- // D is the number of variables (one per vertex; there are 2 pinned vertices).
- if (N < D - 4) {
- return false;
- }
- sparse::Matrix A(D, N);
- FullVector b(N);
- FullVector x(D);
- // Fill b:
- b.fill(0.0f);
- // Fill x:
- uint32_t v0, v1;
- if (!findApproximateDiameterVertices(mesh, &v0, &v1)) {
- // Mesh has no boundaries.
- return false;
- }
- if (mesh->texcoord(v0) == mesh->texcoord(v1)) {
- // LSCM expects an existing parameterization.
- return false;
- }
- for (uint32_t v = 0; v < vertexCount; v++) {
- // Initial solution.
- x[2 * v + 0] = mesh->texcoord(v).x;
- x[2 * v + 1] = mesh->texcoord(v).y;
- }
- // Fill A:
- const uint32_t faceCount = mesh->faceCount();
- for (uint32_t f = 0, t = 0; f < faceCount; f++) {
- const uint32_t vertex0 = mesh->vertexAt(f * 3 + 0);
- const uint32_t vertex1 = mesh->vertexAt(f * 3 + 1);
- const uint32_t vertex2 = mesh->vertexAt(f * 3 + 2);
- setup_abf_relations(A, t, vertex0, vertex1, vertex2, mesh->position(vertex0), mesh->position(vertex1), mesh->position(vertex2));
- t++;
- }
- const uint32_t lockedParameters[] = {
- 2 * v0 + 0,
- 2 * v0 + 1,
- 2 * v1 + 0,
- 2 * v1 + 1
- };
- // Solve
- Solver::LeastSquaresSolver(A, b, x, lockedParameters, 4, 0.000001f);
- // Map x back to texcoords:
- for (uint32_t v = 0; v < vertexCount; v++)
- mesh->texcoord(v) = Vector2(x[2 * v + 0], x[2 * v + 1]);
- return true;
-}
-
-static bool computeOrthogonalProjectionMap(Mesh *mesh)
-{
- uint32_t vertexCount = mesh->vertexCount();
- // Avoid redundant computations.
- float matrix[6];
- Fit::computeCovariance(vertexCount, &mesh->position(0), matrix);
- if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0)
- return false;
- float eigenValues[3];
- Vector3 eigenVectors[3];
- if (!Fit::eigenSolveSymmetric3(matrix, eigenValues, eigenVectors))
- return false;
- Vector3 axis[2];
- axis[0] = normalize(eigenVectors[0], kEpsilon);
- axis[1] = normalize(eigenVectors[1], kEpsilon);
- // Project vertices to plane.
- for (uint32_t i = 0; i < vertexCount; i++)
- mesh->texcoord(i) = Vector2(dot(axis[0], mesh->position(i)), dot(axis[1], mesh->position(i)));
- return true;
-}
+namespace segment {
// Dummy implementation of a priority queue using sort at insertion.
// - Insertion is o(n)
@@ -4729,6 +4243,7 @@ struct PriorityQueue
uint32_t pop()
{
+ XA_DEBUG_ASSERT(!pairs.isEmpty());
uint32_t f = pairs.back().face;
pairs.pop_back();
return f;
@@ -4740,12 +4255,12 @@ struct PriorityQueue
std::sort(pairs.begin(), pairs.end());
}
- void clear()
+ XA_INLINE void clear()
{
pairs.clear();
}
- uint32_t count() const
+ XA_INLINE uint32_t count() const
{
return pairs.size();
}
@@ -4771,7 +4286,7 @@ struct PriorityQueue
Array<Pair> pairs;
};
-struct ChartBuildData
+struct Chart
{
int id = -1;
Vector3 averageNormal = Vector3(0.0f);
@@ -4786,31 +4301,39 @@ struct ChartBuildData
Basis basis; // Of first face.
};
-struct AtlasBuilder
+struct Atlas
{
// @@ Hardcoded to 10?
- AtlasBuilder(const Mesh *mesh, Array<uint32_t> *meshFaces, const ChartOptions &options) : m_mesh(mesh), m_meshFaces(meshFaces), m_facesLeft(mesh->faceCount()), m_bestTriangles(10), m_options(options)
+ Atlas(const Mesh *mesh, Array<uint32_t> *meshFaces, const ChartOptions &options) : m_mesh(mesh), m_meshFaces(meshFaces), m_facesLeft(mesh->faceCount()), m_bestTriangles(10), m_options(options)
{
- XA_PROFILE_START(atlasBuilderInit)
+ XA_PROFILE_START(buildAtlasInit)
const uint32_t faceCount = m_mesh->faceCount();
if (meshFaces) {
- m_ignoreFaces.resize(faceCount, true);
+ m_ignoreFaces.resize(faceCount);
+ m_ignoreFaces.setAll(true);
for (uint32_t f = 0; f < meshFaces->size(); f++)
m_ignoreFaces[(*meshFaces)[f]] = false;
m_facesLeft = meshFaces->size();
} else {
- m_ignoreFaces.resize(faceCount, false);
+ m_ignoreFaces.resize(faceCount);
+ m_ignoreFaces.setAll(false);
}
- m_faceChartArray.resize(faceCount, -1);
- m_faceCandidateArray.resize(faceCount, (uint32_t)-1);
+ m_faceChartArray.resize(faceCount);
+ m_faceChartArray.setAll(-1);
+ m_faceCandidateCharts.resize(faceCount);
+ m_faceCandidateCosts.resize(faceCount);
m_texcoords.resize(faceCount * 3);
// @@ Floyd for the whole mesh is too slow. We could compute floyd progressively per patch as the patch grows. We need a better solution to compute most central faces.
//computeShortestPaths();
// Precompute edge lengths and face areas.
const uint32_t edgeCount = m_mesh->edgeCount();
- m_edgeLengths.resize(edgeCount, 0.0f);
- m_faceAreas.resize(m_mesh->faceCount(), 0.0f);
- m_faceNormals.resize(m_mesh->faceCount());
+ m_edgeLengths.resize(edgeCount);
+ m_edgeLengths.zeroOutMemory();
+ m_faceAreas.resize(faceCount);
+ m_faceAreas.zeroOutMemory();
+ m_faceNormals.resize(faceCount);
+ m_faceTangents.resize(faceCount);
+ m_faceBitangents.resize(faceCount);
for (uint32_t f = 0; f < faceCount; f++) {
if (m_ignoreFaces[f])
continue;
@@ -4821,15 +4344,52 @@ struct AtlasBuilder
m_faceAreas[f] = mesh->faceArea(f);
XA_DEBUG_ASSERT(m_faceAreas[f] > 0.0f);
m_faceNormals[f] = m_mesh->triangleNormal(f);
+ m_faceTangents[f] = Basis::computeTangent(m_faceNormals[f]);
+ m_faceBitangents[f] = Basis::computeBitangent(m_faceNormals[f], m_faceTangents[f]);
}
- XA_PROFILE_END(atlasBuilderInit)
+#if XA_GROW_CHARTS_COPLANAR
+ // Precompute regions of coplanar incident faces.
+ m_nextPlanarRegionFace.resize(faceCount);
+ for (uint32_t f = 0; f < faceCount; f++)
+ m_nextPlanarRegionFace[f] = f;
+ Array<uint32_t> faceStack;
+ faceStack.reserve(min(faceCount, 16u));
+ for (uint32_t f = 0; f < faceCount; f++) {
+ if (m_nextPlanarRegionFace[f] != f)
+ continue; // Already assigned.
+ if (m_ignoreFaces[f])
+ continue;
+ faceStack.clear();
+ faceStack.push_back(f);
+ for (;;) {
+ if (faceStack.isEmpty())
+ break;
+ const uint32_t face = faceStack.back();
+ faceStack.pop_back();
+ for (Mesh::FaceEdgeIterator it(m_mesh, face); !it.isDone(); it.advance()) {
+ const uint32_t oface = it.oppositeFace();
+ if (it.isBoundary() || m_ignoreFaces[oface])
+ continue;
+ if (m_nextPlanarRegionFace[oface] != oface)
+ continue; // Already assigned.
+ if (!equal(dot(m_faceNormals[face], m_faceNormals[oface]), 1.0f, kEpsilon))
+ continue; // Not coplanar.
+ const uint32_t next = m_nextPlanarRegionFace[face];
+ m_nextPlanarRegionFace[face] = oface;
+ m_nextPlanarRegionFace[oface] = next;
+ faceStack.push_back(oface);
+ }
+ }
+ }
+#endif
+ XA_PROFILE_END(buildAtlasInit)
}
- ~AtlasBuilder()
+ ~Atlas()
{
const uint32_t chartCount = m_chartArray.size();
for (uint32_t i = 0; i < chartCount; i++) {
- m_chartArray[i]->~ChartBuildData();
+ m_chartArray[i]->~Chart();
XA_FREE(m_chartArray[i]);
}
}
@@ -4838,9 +4398,11 @@ struct AtlasBuilder
uint32_t chartCount() const { return m_chartArray.size(); }
const Array<uint32_t> &chartFaces(uint32_t i) const { return m_chartArray[i]->faces; }
const Basis &chartBasis(uint32_t chartIndex) const { return m_chartArray[chartIndex]->basis; }
+ const Vector2 *faceTexcoords(uint32_t face) const { return &m_texcoords[face * 3]; }
void placeSeeds(float threshold)
{
+ XA_PROFILE_START(buildAtlasPlaceSeeds)
// Instead of using a predefiened number of seeds:
// - Add seeds one by one, growing chart until a certain treshold.
// - Undo charts and restart growing process.
@@ -4849,43 +4411,44 @@ struct AtlasBuilder
// - how do we weight the probabilities?
while (m_facesLeft > 0)
createRandomChart(threshold);
+ XA_PROFILE_END(buildAtlasPlaceSeeds)
}
// Returns true if any of the charts can grow more.
- bool growCharts(float threshold, uint32_t faceCount)
- {
- XA_PROFILE_START(atlasBuilderGrowCharts)
- // Using one global list.
- faceCount = min(faceCount, m_facesLeft);
+ bool growCharts(float threshold)
+ {
+ XA_PROFILE_START(buildAtlasGrowCharts)
+ // Build global candidate list.
+ m_faceCandidateCharts.zeroOutMemory();
+ for (uint32_t i = 0; i < m_chartArray.size(); i++)
+ addChartCandidateToGlobalCandidates(m_chartArray[i]);
+ // Add one candidate face per chart (threshold permitting).
+ const uint32_t faceCount = m_mesh->faceCount();
bool canAddAny = false;
- for (uint32_t i = 0; i < faceCount; i++) {
- const Candidate &candidate = getBestCandidate();
- if (candidate.metric > threshold) {
- XA_PROFILE_END(atlasBuilderGrowCharts)
- return false; // Can't grow more.
- }
- createFaceTexcoords(candidate.chart, candidate.face);
- if (!canAddFaceToChart(candidate.chart, candidate.face))
+ for (uint32_t f = 0; f < faceCount; f++) {
+ Chart *chart = m_faceCandidateCharts[f];
+ if (!chart || m_faceCandidateCosts[f] > threshold)
+ continue;
+ createFaceTexcoords(chart, f);
+ if (!canAddFaceToChart(chart, f))
continue;
- addFaceToChart(candidate.chart, candidate.face);
+ addFaceToChart(chart, f);
canAddAny = true;
}
- XA_PROFILE_END(atlasBuilderGrowCharts)
+ XA_PROFILE_END(buildAtlasGrowCharts)
return canAddAny && m_facesLeft != 0; // Can continue growing.
}
void resetCharts()
{
+ XA_PROFILE_START(buildAtlasResetCharts)
const uint32_t faceCount = m_mesh->faceCount();
- for (uint32_t i = 0; i < faceCount; i++) {
+ for (uint32_t i = 0; i < faceCount; i++)
m_faceChartArray[i] = -1;
- m_faceCandidateArray[i] = (uint32_t)-1;
- }
m_facesLeft = m_meshFaces ? m_meshFaces->size() : faceCount;
- m_candidateArray.clear();
const uint32_t chartCount = m_chartArray.size();
for (uint32_t i = 0; i < chartCount; i++) {
- ChartBuildData *chart = m_chartArray[i];
+ Chart *chart = m_chartArray[i];
const uint32_t seed = chart->seeds.back();
chart->area = 0.0f;
chart->boundaryLength = 0.0f;
@@ -4898,30 +4461,32 @@ struct AtlasBuilder
}
#if XA_GROW_CHARTS_COPLANAR
for (uint32_t i = 0; i < chartCount; i++) {
- ChartBuildData *chart = m_chartArray[i];
+ Chart *chart = m_chartArray[i];
growChartCoplanar(chart);
}
#endif
+ XA_PROFILE_END(buildAtlasResetCharts)
}
- void updateCandidates(ChartBuildData *chart, uint32_t f)
+ void updateChartCandidates(Chart *chart, uint32_t f)
{
// Traverse neighboring faces, add the ones that do not belong to any chart yet.
for (Mesh::FaceEdgeIterator it(m_mesh, f); !it.isDone(); it.advance()) {
if (!it.isBoundary() && !m_ignoreFaces[it.oppositeFace()] && m_faceChartArray[it.oppositeFace()] == -1)
chart->candidates.push(it.oppositeFace());
}
- }
-
- void updateProxies()
- {
- const uint32_t chartCount = m_chartArray.size();
- for (uint32_t i = 0; i < chartCount; i++)
- updateProxy(m_chartArray[i]);
+ // Re-evaluate all candidate priorities.
+ uint32_t candidateCount = chart->candidates.count();
+ for (uint32_t i = 0; i < candidateCount; i++) {
+ PriorityQueue::Pair &pair = chart->candidates.pairs[i];
+ pair.priority = evaluateCost(chart, pair.face);
+ }
+ chart->candidates.sort();
}
bool relocateSeeds()
{
+ XA_PROFILE_START(buildAtlasRelocateSeeds)
bool anySeedChanged = false;
const uint32_t chartCount = m_chartArray.size();
for (uint32_t i = 0; i < chartCount; i++) {
@@ -4929,19 +4494,22 @@ struct AtlasBuilder
anySeedChanged = true;
}
}
+ XA_PROFILE_END(buildAtlasRelocateSeeds)
return anySeedChanged;
}
void fillHoles(float threshold)
{
+ XA_PROFILE_START(buildAtlasFillHoles)
while (m_facesLeft > 0)
createRandomChart(threshold);
+ XA_PROFILE_END(buildAtlasFillHoles)
}
#if XA_MERGE_CHARTS
void mergeCharts()
{
- XA_PROFILE_START(atlasBuilderMergeCharts)
+ XA_PROFILE_START(buildAtlasMergeCharts)
Array<float> sharedBoundaryLengths;
Array<float> sharedBoundaryLengthsNoSeams;
Array<uint32_t> sharedBoundaryEdgeCountNoSeams;
@@ -4951,16 +4519,19 @@ struct AtlasBuilder
for (;;) {
bool merged = false;
for (int c = chartCount - 1; c >= 0; c--) {
- ChartBuildData *chart = m_chartArray[c];
+ Chart *chart = m_chartArray[c];
if (chart == nullptr)
continue;
float externalBoundaryLength = 0.0f;
sharedBoundaryLengths.clear();
- sharedBoundaryLengths.resize(chartCount, 0.0f);
+ sharedBoundaryLengths.resize(chartCount);
+ sharedBoundaryLengths.zeroOutMemory();
sharedBoundaryLengthsNoSeams.clear();
- sharedBoundaryLengthsNoSeams.resize(chartCount, 0.0f);
+ sharedBoundaryLengthsNoSeams.resize(chartCount);
+ sharedBoundaryLengthsNoSeams.zeroOutMemory();
sharedBoundaryEdgeCountNoSeams.clear();
- sharedBoundaryEdgeCountNoSeams.resize(chartCount, 0u);
+ sharedBoundaryEdgeCountNoSeams.resize(chartCount);
+ sharedBoundaryEdgeCountNoSeams.zeroOutMemory();
const uint32_t faceCount = chart->faces.size();
for (uint32_t i = 0; i < faceCount; i++) {
const uint32_t f = chart->faces[i];
@@ -4985,7 +4556,7 @@ struct AtlasBuilder
for (int cc = chartCount - 1; cc >= 0; cc--) {
if (cc == c)
continue;
- ChartBuildData *chart2 = m_chartArray[cc];
+ Chart *chart2 = m_chartArray[cc];
if (chart2 == nullptr)
continue;
// Compare proxies.
@@ -5013,16 +4584,19 @@ struct AtlasBuilder
continue;
merge:
// Create texcoords for chart 2 using chart 1 basis. Backup chart 2 texcoords for restoration if charts cannot be merged.
- tempTexcoords.resize(chart2->faces.size());
+ tempTexcoords.resize(chart2->faces.size() * 3);
for (uint32_t i = 0; i < chart2->faces.size(); i++) {
const uint32_t face = chart2->faces[i];
- tempTexcoords[i] = m_texcoords[face];
+ for (uint32_t j = 0; j < 3; j++)
+ tempTexcoords[i * 3 + j] = m_texcoords[face * 3 + j];
createFaceTexcoords(chart, face);
}
if (!canMergeCharts(chart, chart2)) {
// Restore chart 2 texcoords.
- for (uint32_t i = 0; i < chart2->faces.size(); i++)
- m_texcoords[chart2->faces[i]] = tempTexcoords[i];
+ for (uint32_t i = 0; i < chart2->faces.size(); i++) {
+ for (uint32_t j = 0; j < 3; j++)
+ m_texcoords[chart2->faces[i] * 3 + j] = tempTexcoords[i * 3 + j];
+ }
continue;
}
mergeChart(chart, chart2, sharedBoundaryLengthsNoSeams[cc]);
@@ -5053,14 +4627,14 @@ struct AtlasBuilder
c++;
}
}
- XA_PROFILE_END(atlasBuilderMergeCharts)
+ XA_PROFILE_END(buildAtlasMergeCharts)
}
#endif
private:
void createRandomChart(float threshold)
{
- ChartBuildData *chart = XA_NEW(MemTag::Default, ChartBuildData);
+ Chart *chart = XA_NEW(MemTag::Default, Chart);
chart->id = (int)m_chartArray.size();
m_chartArray.push_back(chart);
// Pick random face that is not used by any chart yet.
@@ -5070,15 +4644,52 @@ private:
face = 0;
}
chart->seeds.push_back(face);
- addFaceToChart(chart, face, true);
+ addFaceToChart(chart, face);
#if XA_GROW_CHARTS_COPLANAR
growChartCoplanar(chart);
#endif
// Grow the chart as much as possible within the given threshold.
- growChart(chart, threshold, m_facesLeft);
+ for (uint32_t i = 0; i < m_facesLeft; ) {
+ if (chart->candidates.count() == 0 || chart->candidates.firstPriority() > threshold)
+ break;
+ const uint32_t f = chart->candidates.pop();
+ if (m_faceChartArray[f] != -1)
+ continue;
+ createFaceTexcoords(chart, f);
+ if (!canAddFaceToChart(chart, f))
+ continue;
+ addFaceToChart(chart, f);
+ i++;
+ }
+ }
+
+ void addChartCandidateToGlobalCandidates(Chart *chart)
+ {
+ if (chart->candidates.count() == 0)
+ return;
+ const float cost = chart->candidates.firstPriority();
+ const uint32_t face = chart->candidates.pop();
+ if (m_faceChartArray[face] != -1) {
+ addChartCandidateToGlobalCandidates(chart);
+ } else if (!m_faceCandidateCharts[face]) {
+ // No candidate assigned to this face yet.
+ m_faceCandidateCharts[face] = chart;
+ m_faceCandidateCosts[face] = cost;
+ } else {
+ if (cost < m_faceCandidateCosts[face]) {
+ // This is a better candidate for this face (lower cost). The other chart can choose another candidate.
+ Chart *otherChart = m_faceCandidateCharts[face];
+ m_faceCandidateCharts[face] = chart;
+ m_faceCandidateCosts[face] = cost;
+ addChartCandidateToGlobalCandidates(otherChart);
+ } else {
+ // Existing candidate is better. This chart can choose another candidate.
+ addChartCandidateToGlobalCandidates(chart);
+ }
+ }
}
- void createFaceTexcoords(ChartBuildData *chart, uint32_t face)
+ void createFaceTexcoords(Chart *chart, uint32_t face)
{
for (uint32_t i = 0; i < 3; i++) {
const Vector3 &pos = m_mesh->position(m_mesh->vertexAt(face * 3 + i));
@@ -5086,30 +4697,71 @@ private:
}
}
- bool isChartBoundaryEdge(ChartBuildData *chart, uint32_t edge) const
+ bool isChartBoundaryEdge(const Chart *chart, uint32_t edge) const
{
const uint32_t oppositeEdge = m_mesh->oppositeEdge(edge);
const uint32_t oppositeFace = meshEdgeFace(oppositeEdge);
return oppositeEdge == UINT32_MAX || m_ignoreFaces[oppositeFace] || m_faceChartArray[oppositeFace] != chart->id;
}
- bool canAddFaceToChart(ChartBuildData *chart, uint32_t face)
+ bool edgeArraysIntersect(const uint32_t *edges1, uint32_t edges1Count, const uint32_t *edges2, uint32_t edges2Count)
+ {
+ for (uint32_t i = 0; i < edges1Count; i++) {
+ const uint32_t edge1 = edges1[i];
+ for (uint32_t j = 0; j < edges2Count; j++) {
+ const uint32_t edge2 = edges2[j];
+ const Vector2 &a1 = m_texcoords[meshEdgeIndex0(edge1)];
+ const Vector2 &a2 = m_texcoords[meshEdgeIndex1(edge1)];
+ const Vector2 &b1 = m_texcoords[meshEdgeIndex0(edge2)];
+ const Vector2 &b2 = m_texcoords[meshEdgeIndex1(edge2)];
+ if (linesIntersect(a1, a2, b1, b2, m_mesh->epsilon()))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool isFaceFlipped(uint32_t face) const
+ {
+ const float t1 = m_texcoords[face * 3 + 0].x;
+ const float s1 = m_texcoords[face * 3 + 0].y;
+ const float t2 = m_texcoords[face * 3 + 1].x;
+ const float s2 = m_texcoords[face * 3 + 1].y;
+ const float t3 = m_texcoords[face * 3 + 2].x;
+ const float s3 = m_texcoords[face * 3 + 2].y;
+ const float parametricArea = ((s2 - s1) * (t3 - t1) - (s3 - s1) * (t2 - t1)) / 2;
+ return parametricArea < 0.0f;
+ }
+
+ void computeChartBoundaryEdges(const Chart *chart, Array<uint32_t> *dest) const
{
- // Find face edges that are on a mesh boundary or form a boundary with another chart.
- uint32_t edgesToCompare[3];
+ dest->clear();
+ for (uint32_t f = 0; f < chart->faces.size(); f++) {
+ const uint32_t face = chart->faces[f];
+ for (uint32_t i = 0; i < 3; i++) {
+ const uint32_t edge = face * 3 + i;
+ if (isChartBoundaryEdge(chart, edge))
+ dest->push_back(edge);
+ }
+ }
+ }
+
+ bool canAddFaceToChart(Chart *chart, uint32_t face)
+ {
+ // Check for flipped triangles.
+ if (isFaceFlipped(face))
+ return false;
+ // Find face edges that don't border this chart.
+ m_tempEdges1.clear();
for (uint32_t i = 0; i < 3; i++) {
const uint32_t edge = face * 3 + i;
- const uint32_t oppositeEdge = m_mesh->oppositeEdge(edge);
- const uint32_t oppositeFace = meshEdgeFace(oppositeEdge);
- if (oppositeEdge == UINT32_MAX || m_ignoreFaces[oppositeFace] || m_faceChartArray[oppositeFace] != chart->id)
- edgesToCompare[i] = edge;
- else
- edgesToCompare[i] = UINT32_MAX;
+ if (isChartBoundaryEdge(chart, edge))
+ m_tempEdges1.push_back(edge);
}
- // All edges on boundary? This can happen if the face is surrounded by the chart.
- if (edgesToCompare[0] == UINT32_MAX && edgesToCompare[1] == UINT32_MAX && edgesToCompare[2] == UINT32_MAX)
- return true;
- // Check if any valid face edge intersects the chart boundary.
+ if (m_tempEdges1.isEmpty())
+ return true; // This can happen if the face is surrounded by the chart.
+ // Get chart boundary edges, except those that border the face.
+ m_tempEdges2.clear();
for (uint32_t i = 0; i < chart->faces.size(); i++) {
const uint32_t chartFace = chart->faces[i];
for (uint32_t j = 0; j < 3; j++) {
@@ -5120,47 +4772,65 @@ private:
const uint32_t oppositeChartEdge = m_mesh->oppositeEdge(chartEdge);
if (meshEdgeFace(oppositeChartEdge) == face)
continue;
- for (uint32_t k = 0; k < 3; k++) {
- if (edgesToCompare[k] == UINT32_MAX)
- continue;
- const uint32_t e1 = chartEdge;
- const uint32_t e2 = edgesToCompare[k];
- if (linesIntersect(m_texcoords[meshEdgeIndex0(e1)], m_texcoords[meshEdgeIndex1(e1)], m_texcoords[meshEdgeIndex0(e2)], m_texcoords[meshEdgeIndex1(e2)], m_mesh->epsilon()))
- return false;
- }
+ m_tempEdges2.push_back(chartEdge);
}
}
- return true;
- }
-
- bool canMergeCharts(ChartBuildData *chart1, ChartBuildData *chart2)
- {
- for (uint32_t f1 = 0; f1 < chart1->faces.size(); f1++) {
- const uint32_t face1 = chart1->faces[f1];
- for (uint32_t i = 0; i < 3; i++) {
- const uint32_t edge1 = face1 * 3 + i;
- if (!isChartBoundaryEdge(chart1, edge1))
- continue;
- for (uint32_t f2 = 0; f2 < chart2->faces.size(); f2++) {
- const uint32_t face2 = chart2->faces[f2];
+ const bool intersect = edgeArraysIntersect(m_tempEdges1.data(), m_tempEdges1.size(), m_tempEdges2.data(), m_tempEdges2.size());
+#if 0
+ if (intersect) {
+ static std::atomic<uint32_t> count = 0;
+ char filename[256];
+ XA_SPRINTF(filename, sizeof(filename), "intersect%04u.obj", count.fetch_add(1));
+ FILE *file;
+ XA_FOPEN(file, filename, "w");
+ if (file) {
+ for (uint32_t i = 0; i < m_texcoords.size(); i++)
+ fprintf(file, "v %g %g 0.0\n", m_texcoords[i].x, m_texcoords[i].y);
+ fprintf(file, "s off\n");
+ fprintf(file, "o face\n");
+ {
+ fprintf(file, "f ");
for (uint32_t j = 0; j < 3; j++) {
- const uint32_t edge2 = face2 * 3 + j;
- if (!isChartBoundaryEdge(chart2, edge2))
- continue;
- if (linesIntersect(m_texcoords[meshEdgeIndex0(edge1)], m_texcoords[meshEdgeIndex1(edge1)], m_texcoords[meshEdgeIndex0(edge2)], m_texcoords[meshEdgeIndex1(edge2)], m_mesh->epsilon()))
- return false;
+ const uint32_t index = face * 3 + j + 1; // 1-indexed
+ fprintf(file, "%d/%d/%d%c", index, index, index, j == 2 ? '\n' : ' ');
+ }
+ }
+ fprintf(file, "s off\n");
+ fprintf(file, "o chart\n");
+ for (uint32_t i = 0; i < chart->faces.size(); i++) {
+ const uint32_t chartFace = chart->faces[i];
+ fprintf(file, "f ");
+ for (uint32_t j = 0; j < 3; j++) {
+ const uint32_t index = chartFace * 3 + j + 1; // 1-indexed
+ fprintf(file, "%d/%d/%d%c", index, index, index, j == 2 ? '\n' : ' ');
}
}
+ fclose(file);
}
}
- return true;
+#endif
+ return !intersect;
+ }
+
+ bool canMergeCharts(Chart *chart1, Chart *chart2)
+ {
+ for (uint32_t i = 0; i < chart2->faces.size(); i++) {
+ if (isFaceFlipped(chart2->faces[i]))
+ return false;
+ }
+ computeChartBoundaryEdges(chart1, &m_tempEdges1);
+ computeChartBoundaryEdges(chart2, &m_tempEdges2);
+ return !edgeArraysIntersect(m_tempEdges1.data(), m_tempEdges1.size(), m_tempEdges2.data(), m_tempEdges2.size());
}
- void addFaceToChart(ChartBuildData *chart, uint32_t f, bool recomputeProxy = false)
+ void addFaceToChart(Chart *chart, uint32_t f)
{
+ const bool firstFace = chart->faces.isEmpty();
// Use the first face normal as the chart basis.
- if (chart->faces.isEmpty()) {
- chart->basis.buildFrameForDirection(m_faceNormals[f]);
+ if (firstFace) {
+ chart->basis.normal = m_faceNormals[f];
+ chart->basis.tangent = m_faceTangents[f];
+ chart->basis.bitangent = m_faceBitangents[f];
createFaceTexcoords(chart, f);
}
// Add face to chart.
@@ -5169,74 +4839,36 @@ private:
m_faceChartArray[f] = chart->id;
m_facesLeft--;
// Update area and boundary length.
- chart->area = evaluateChartArea(chart, f);
- chart->boundaryLength = evaluateBoundaryLength(chart, f);
- chart->normalSum = evaluateChartNormalSum(chart, f);
+ chart->area = chart->area + m_faceAreas[f];
+ chart->boundaryLength = computeBoundaryLength(chart, f);
+ chart->normalSum += m_mesh->triangleNormalAreaScaled(f);
+ chart->averageNormal = normalizeSafe(chart->normalSum, Vector3(0), 0.0f);
chart->centroidSum += m_mesh->triangleCenter(f);
- if (recomputeProxy) {
- // Update proxy and candidate's priorities.
- updateProxy(chart);
- }
+ chart->centroid = chart->centroidSum / float(chart->faces.size());
// Update candidates.
- removeCandidate(f);
- updateCandidates(chart, f);
- updatePriorities(chart);
- }
-
- bool growChart(ChartBuildData *chart, float threshold, uint32_t faceCount)
- {
- // Try to add faceCount faces within threshold to chart.
- for (uint32_t i = 0; i < faceCount; ) {
- if (chart->candidates.count() == 0 || chart->candidates.firstPriority() > threshold)
- return false;
- const uint32_t f = chart->candidates.pop();
- if (m_faceChartArray[f] != -1)
- continue;
- createFaceTexcoords(chart, f);
- if (!canAddFaceToChart(chart, f))
- continue;
- addFaceToChart(chart, f);
- i++;
- }
- if (chart->candidates.count() == 0 || chart->candidates.firstPriority() > threshold)
- return false;
- return true;
+ updateChartCandidates(chart, f);
}
#if XA_GROW_CHARTS_COPLANAR
- void growChartCoplanar(ChartBuildData *chart)
+ void growChartCoplanar(Chart *chart)
{
XA_DEBUG_ASSERT(!chart->faces.isEmpty());
- const Vector3 chartNormal = m_faceNormals[chart->faces[0]];
- m_growFaces.clear();
- for (uint32_t f = 0; f < chart->faces.size(); f++)
- m_growFaces.push_back(chart->faces[f]);
- for (;;) {
- if (m_growFaces.isEmpty())
- break;
- const uint32_t face = m_growFaces.back();
- m_growFaces.pop_back();
- for (Mesh::FaceEdgeIterator it(m_mesh, face); !it.isDone(); it.advance()) {
- if (it.isBoundary() || m_ignoreFaces[it.oppositeFace()] || m_faceChartArray[it.oppositeFace()] != -1)
- continue;
- if (equal(dot(chartNormal, m_faceNormals[it.oppositeFace()]), 1.0f, kEpsilon)) {
- createFaceTexcoords(chart, it.oppositeFace());
- addFaceToChart(chart, it.oppositeFace());
- m_growFaces.push_back(it.oppositeFace());
+ for (uint32_t i = 0; i < chart->faces.size(); i++) {
+ const uint32_t chartFace = chart->faces[i];
+ uint32_t face = m_nextPlanarRegionFace[chartFace];
+ while (face != chartFace) {
+ // Not assigned to a chart?
+ if (m_faceChartArray[face] == -1) {
+ createFaceTexcoords(chart, face);
+ addFaceToChart(chart, face);
}
+ face = m_nextPlanarRegionFace[face];
}
}
}
#endif
- void updateProxy(ChartBuildData *chart) const
- {
- //#pragma message(NV_FILE_LINE "TODO: Use best fit plane instead of average normal.")
- chart->averageNormal = normalizeSafe(chart->normalSum, Vector3(0), 0.0f);
- chart->centroid = chart->centroidSum / float(chart->faces.size());
- }
-
- bool relocateSeed(ChartBuildData *chart)
+ bool relocateSeed(Chart *chart)
{
// Find the first N triangles that fit the proxy best.
const uint32_t faceCount = chart->faces.size();
@@ -5272,26 +4904,12 @@ private:
return true;
}
- void updatePriorities(ChartBuildData *chart)
- {
- // Re-evaluate candidate priorities.
- uint32_t candidateCount = chart->candidates.count();
- for (uint32_t i = 0; i < candidateCount; i++) {
- PriorityQueue::Pair &pair = chart->candidates.pairs[i];
- pair.priority = evaluatePriority(chart, pair.face);
- if (m_faceChartArray[pair.face] == -1)
- updateCandidate(chart, pair.face, pair.priority);
- }
- // Sort candidates.
- chart->candidates.sort();
- }
-
// Evaluate combined metric.
- float evaluatePriority(ChartBuildData *chart, uint32_t face) const
+ float evaluateCost(Chart *chart, uint32_t face) const
{
// Estimate boundary length and area:
- const float newChartArea = evaluateChartArea(chart, face);
- const float newBoundaryLength = evaluateBoundaryLength(chart, face);
+ const float newChartArea = chart->area + m_faceAreas[face];
+ const float newBoundaryLength = computeBoundaryLength(chart, face);
// Enforce limits strictly:
if (m_options.maxChartArea > 0.0f && newChartArea > m_options.maxChartArea)
return FLT_MAX;
@@ -5323,14 +4941,14 @@ private:
}
// Returns a value in [0-1].
- float evaluateProxyFitMetric(ChartBuildData *chart, uint32_t f) const
+ float evaluateProxyFitMetric(Chart *chart, uint32_t f) const
{
const Vector3 faceNormal = m_faceNormals[f];
// Use plane fitting metric for now:
return 1 - dot(faceNormal, chart->averageNormal); // @@ normal deviations should be weighted by face area
}
- float evaluateRoundnessMetric(ChartBuildData *chart, uint32_t /*face*/, float newBoundaryLength, float newChartArea) const
+ float evaluateRoundnessMetric(Chart *chart, uint32_t /*face*/, float newBoundaryLength, float newChartArea) const
{
float roundness = square(chart->boundaryLength) / chart->area;
float newRoundness = square(newBoundaryLength) / newChartArea;
@@ -5342,7 +4960,7 @@ private:
}
}
- float evaluateStraightnessMetric(ChartBuildData *chart, uint32_t f) const
+ float evaluateStraightnessMetric(Chart *chart, uint32_t f) const
{
float l_out = 0.0f;
float l_in = 0.0f;
@@ -5378,7 +4996,7 @@ private:
return m_faceNormals[meshEdgeFace(edge)] != m_faceNormals[meshEdgeFace(oppositeEdge)];
}
- float evaluateNormalSeamMetric(ChartBuildData *chart, uint32_t f) const
+ float evaluateNormalSeamMetric(Chart *chart, uint32_t f) const
{
float seamFactor = 0.0f;
float totalLength = 0.0f;
@@ -5414,7 +5032,7 @@ private:
return seamFactor / totalLength;
}
- float evaluateTextureSeamMetric(ChartBuildData *chart, uint32_t f) const
+ float evaluateTextureSeamMetric(Chart *chart, uint32_t f) const
{
float seamLength = 0.0f;
float totalLength = 0.0f;
@@ -5436,12 +5054,7 @@ private:
return seamLength / totalLength;
}
- float evaluateChartArea(ChartBuildData *chart, uint32_t f) const
- {
- return chart->area + m_faceAreas[f];
- }
-
- float evaluateBoundaryLength(ChartBuildData *chart, uint32_t f) const
+ float computeBoundaryLength(Chart *chart, uint32_t f) const
{
float boundaryLength = chart->boundaryLength;
// Add new edges, subtract edges shared with the chart.
@@ -5459,73 +5072,7 @@ private:
return max(0.0f, boundaryLength); // @@ Hack!
}
- Vector3 evaluateChartNormalSum(ChartBuildData *chart, uint32_t f) const
- {
- return chart->normalSum + m_mesh->triangleNormalAreaScaled(f);
- }
-
- // @@ Cleanup.
- struct Candidate {
- ChartBuildData *chart;
- uint32_t face;
- float metric;
- };
-
- // @@ Get N best candidates in one pass.
- const Candidate &getBestCandidate() const
- {
- uint32_t best = 0;
- float bestCandidateMetric = FLT_MAX;
- const uint32_t candidateCount = m_candidateArray.size();
- XA_ASSERT(candidateCount > 0);
- for (uint32_t i = 0; i < candidateCount; i++) {
- const Candidate &candidate = m_candidateArray[i];
- if (candidate.metric < bestCandidateMetric) {
- bestCandidateMetric = candidate.metric;
- best = i;
- }
- }
- return m_candidateArray[best];
- }
-
- void removeCandidate(uint32_t f)
- {
- int c = m_faceCandidateArray[f];
- if (c != -1) {
- m_faceCandidateArray[f] = (uint32_t)-1;
- if (c == int(m_candidateArray.size() - 1)) {
- m_candidateArray.pop_back();
- } else {
- // Replace with last.
- m_candidateArray[c] = m_candidateArray[m_candidateArray.size() - 1];
- m_candidateArray.pop_back();
- m_faceCandidateArray[m_candidateArray[c].face] = c;
- }
- }
- }
-
- void updateCandidate(ChartBuildData *chart, uint32_t f, float metric)
- {
- if (m_faceCandidateArray[f] == (uint32_t)-1) {
- const uint32_t index = m_candidateArray.size();
- m_faceCandidateArray[f] = index;
- m_candidateArray.resize(index + 1);
- m_candidateArray[index].face = f;
- m_candidateArray[index].chart = chart;
- m_candidateArray[index].metric = metric;
- } else {
- const uint32_t c = m_faceCandidateArray[f];
- XA_DEBUG_ASSERT(c != (uint32_t)-1);
- Candidate &candidate = m_candidateArray[c];
- XA_DEBUG_ASSERT(candidate.face == f);
- if (metric < candidate.metric || chart == candidate.chart) {
- candidate.metric = metric;
- candidate.chart = chart;
- }
- }
- }
-
- void mergeChart(ChartBuildData *owner, ChartBuildData *chart, float sharedBoundaryLength)
+ void mergeChart(Chart *owner, Chart *chart, float sharedBoundaryLength)
{
const uint32_t faceCount = chart->faces.size();
for (uint32_t i = 0; i < faceCount; i++) {
@@ -5538,10 +5085,10 @@ private:
owner->area += chart->area;
owner->boundaryLength += chart->boundaryLength - sharedBoundaryLength;
owner->normalSum += chart->normalSum;
- updateProxy(owner);
+ owner->averageNormal = normalizeSafe(owner->normalSum, Vector3(0), 0.0f);
// Delete chart.
m_chartArray[chart->id] = nullptr;
- chart->~ChartBuildData();
+ chart->~Chart();
XA_FREE(chart);
}
@@ -5551,18 +5098,448 @@ private:
Array<float> m_edgeLengths;
Array<float> m_faceAreas;
Array<Vector3> m_faceNormals;
+ Array<Vector3> m_faceTangents;
+ Array<Vector3> m_faceBitangents;
Array<Vector2> m_texcoords;
- Array<uint32_t> m_growFaces;
uint32_t m_facesLeft;
Array<int> m_faceChartArray;
- Array<ChartBuildData *> m_chartArray;
- Array<Candidate> m_candidateArray;
- Array<uint32_t> m_faceCandidateArray; // Map face index to candidate index.
+ Array<Chart *> m_chartArray;
PriorityQueue m_bestTriangles;
KISSRng m_rand;
ChartOptions m_options;
+ Array<Chart *> m_faceCandidateCharts;
+ Array<float> m_faceCandidateCosts;
+#if XA_GROW_CHARTS_COPLANAR
+ Array<uint32_t> m_nextPlanarRegionFace;
+#endif
+ Array<uint32_t> m_tempEdges1, m_tempEdges2;
+};
+
+} // namespace segment
+
+namespace param {
+
+class JacobiPreconditioner
+{
+public:
+ JacobiPreconditioner(const sparse::Matrix &M, bool symmetric) : m_inverseDiagonal(M.width())
+ {
+ XA_ASSERT(M.isSquare());
+ for (uint32_t x = 0; x < M.width(); x++) {
+ float elem = M.getCoefficient(x, x);
+ //XA_DEBUG_ASSERT( elem != 0.0f ); // This can be zero in the presence of zero area triangles.
+ if (symmetric) {
+ m_inverseDiagonal[x] = (elem != 0) ? 1.0f / sqrtf(fabsf(elem)) : 1.0f;
+ } else {
+ m_inverseDiagonal[x] = (elem != 0) ? 1.0f / elem : 1.0f;
+ }
+ }
+ }
+
+ void apply(const FullVector &x, FullVector &y) const
+ {
+ XA_DEBUG_ASSERT(x.dimension() == m_inverseDiagonal.dimension());
+ XA_DEBUG_ASSERT(y.dimension() == m_inverseDiagonal.dimension());
+ // @@ Wrap vector component-wise product into a separate function.
+ const uint32_t D = x.dimension();
+ for (uint32_t i = 0; i < D; i++) {
+ y[i] = m_inverseDiagonal[i] * x[i];
+ }
+ }
+
+private:
+ FullVector m_inverseDiagonal;
};
+// Linear solvers.
+class Solver
+{
+public:
+ // Solve the symmetric system: At·A·x = At·b
+ static bool LeastSquaresSolver(const sparse::Matrix &A, const FullVector &b, FullVector &x, float epsilon = 1e-5f)
+ {
+ XA_DEBUG_ASSERT(A.width() == x.dimension());
+ XA_DEBUG_ASSERT(A.height() == b.dimension());
+ XA_DEBUG_ASSERT(A.height() >= A.width()); // @@ If height == width we could solve it directly...
+ const uint32_t D = A.width();
+ sparse::Matrix At(A.height(), A.width());
+ sparse::transpose(A, At);
+ FullVector Atb(D);
+ sparse::mult(At, b, Atb);
+ sparse::Matrix AtA(D);
+ sparse::mult(At, A, AtA);
+ return SymmetricSolver(AtA, Atb, x, epsilon);
+ }
+
+ // See section 10.4.3 in: Mesh Parameterization: Theory and Practice, Siggraph Course Notes, August 2007
+ static bool LeastSquaresSolver(const sparse::Matrix &A, const FullVector &b, FullVector &x, const uint32_t *lockedParameters, uint32_t lockedCount, float epsilon = 1e-5f)
+ {
+ XA_DEBUG_ASSERT(A.width() == x.dimension());
+ XA_DEBUG_ASSERT(A.height() == b.dimension());
+ XA_DEBUG_ASSERT(A.height() >= A.width() - lockedCount);
+ // @@ This is not the most efficient way of building a system with reduced degrees of freedom. It would be faster to do it on the fly.
+ const uint32_t D = A.width() - lockedCount;
+ XA_DEBUG_ASSERT(D > 0);
+ // Compute: b - Al * xl
+ FullVector b_Alxl(b);
+ for (uint32_t y = 0; y < A.height(); y++) {
+ const uint32_t count = A.getRow(y).size();
+ for (uint32_t e = 0; e < count; e++) {
+ uint32_t column = A.getRow(y)[e].x;
+ bool isFree = true;
+ for (uint32_t i = 0; i < lockedCount; i++) {
+ isFree &= (lockedParameters[i] != column);
+ }
+ if (!isFree) {
+ b_Alxl[y] -= x[column] * A.getRow(y)[e].v;
+ }
+ }
+ }
+ // Remove locked columns from A.
+ sparse::Matrix Af(D, A.height());
+ for (uint32_t y = 0; y < A.height(); y++) {
+ const uint32_t count = A.getRow(y).size();
+ for (uint32_t e = 0; e < count; e++) {
+ uint32_t column = A.getRow(y)[e].x;
+ uint32_t ix = column;
+ bool isFree = true;
+ for (uint32_t i = 0; i < lockedCount; i++) {
+ isFree &= (lockedParameters[i] != column);
+ if (column > lockedParameters[i]) ix--; // shift columns
+ }
+ if (isFree) {
+ Af.setCoefficient(ix, y, A.getRow(y)[e].v);
+ }
+ }
+ }
+ // Remove elements from x
+ FullVector xf(D);
+ for (uint32_t i = 0, j = 0; i < A.width(); i++) {
+ bool isFree = true;
+ for (uint32_t l = 0; l < lockedCount; l++) {
+ isFree &= (lockedParameters[l] != i);
+ }
+ if (isFree) {
+ xf[j++] = x[i];
+ }
+ }
+ // Solve reduced system.
+ bool result = LeastSquaresSolver(Af, b_Alxl, xf, epsilon);
+ // Copy results back to x.
+ for (uint32_t i = 0, j = 0; i < A.width(); i++) {
+ bool isFree = true;
+ for (uint32_t l = 0; l < lockedCount; l++) {
+ isFree &= (lockedParameters[l] != i);
+ }
+ if (isFree) {
+ x[i] = xf[j++];
+ }
+ }
+ return result;
+ }
+
+private:
+ /**
+ * Compute the solution of the sparse linear system Ab=x using the Conjugate
+ * Gradient method.
+ *
+ * Solving sparse linear systems:
+ * (1) A·x = b
+ *
+ * The conjugate gradient algorithm solves (1) only in the case that A is
+ * symmetric and positive definite. It is based on the idea of minimizing the
+ * function
+ *
+ * (2) f(x) = 1/2·x·A·x - b·x
+ *
+ * This function is minimized when its gradient
+ *
+ * (3) df = A·x - b
+ *
+ * is zero, which is equivalent to (1). The minimization is carried out by
+ * generating a succession of search directions p.k and improved minimizers x.k.
+ * At each stage a quantity alfa.k is found that minimizes f(x.k + alfa.k·p.k),
+ * and x.k+1 is set equal to the new point x.k + alfa.k·p.k. The p.k and x.k are
+ * built up in such a way that x.k+1 is also the minimizer of f over the whole
+ * vector space of directions already taken, {p.1, p.2, . . . , p.k}. After N
+ * iterations you arrive at the minimizer over the entire vector space, i.e., the
+ * solution to (1).
+ *
+ * For a really good explanation of the method see:
+ *
+ * "An Introduction to the Conjugate Gradient Method Without the Agonizing Pain",
+ * Jonhathan Richard Shewchuk.
+ *
+ **/
+ // Conjugate gradient with preconditioner.
+ static bool ConjugateGradientSolver(const JacobiPreconditioner &preconditioner, const sparse::Matrix &A, const FullVector &b, FullVector &x, float epsilon)
+ {
+ XA_DEBUG_ASSERT( A.isSquare() );
+ XA_DEBUG_ASSERT( A.width() == b.dimension() );
+ XA_DEBUG_ASSERT( A.width() == x.dimension() );
+ int i = 0;
+ const int D = A.width();
+ const int i_max = 4 * D; // Convergence should be linear, but in some cases, it's not.
+ FullVector r(D); // residual
+ FullVector p(D); // search direction
+ FullVector q(D); //
+ FullVector s(D); // preconditioned
+ float delta_0;
+ float delta_old;
+ float delta_new;
+ float alpha;
+ float beta;
+ // r = b - A·x
+ sparse::copy(b, r);
+ sparse::sgemv(-1, A, x, 1, r);
+ // p = M^-1 · r
+ preconditioner.apply(r, p);
+ delta_new = sparse::dot(r, p);
+ delta_0 = delta_new;
+ while (i < i_max && delta_new > epsilon * epsilon * delta_0) {
+ i++;
+ // q = A·p
+ sparse::mult(A, p, q);
+ // alpha = delta_new / p·q
+ alpha = delta_new / sparse::dot(p, q);
+ // x = alfa·p + x
+ sparse::saxpy(alpha, p, x);
+ if ((i & 31) == 0) { // recompute r after 32 steps
+ // r = b - A·x
+ sparse::copy(b, r);
+ sparse::sgemv(-1, A, x, 1, r);
+ } else {
+ // r = r - alfa·q
+ sparse::saxpy(-alpha, q, r);
+ }
+ // s = M^-1 · r
+ preconditioner.apply(r, s);
+ delta_old = delta_new;
+ delta_new = sparse::dot( r, s );
+ beta = delta_new / delta_old;
+ // p = s + beta·p
+ sparse::scal(beta, p);
+ sparse::saxpy(1, s, p);
+ }
+ return delta_new <= epsilon * epsilon * delta_0;
+ }
+
+ static bool SymmetricSolver(const sparse::Matrix &A, const FullVector &b, FullVector &x, float epsilon = 1e-5f)
+ {
+ XA_DEBUG_ASSERT(A.height() == A.width());
+ XA_DEBUG_ASSERT(A.height() == b.dimension());
+ XA_DEBUG_ASSERT(b.dimension() == x.dimension());
+ JacobiPreconditioner jacobi(A, true);
+ return ConjugateGradientSolver(jacobi, A, b, x, epsilon);
+ }
+};
+
+// Fast sweep in 3 directions
+static bool findApproximateDiameterVertices(Mesh *mesh, uint32_t *a, uint32_t *b)
+{
+ XA_DEBUG_ASSERT(a != nullptr);
+ XA_DEBUG_ASSERT(b != nullptr);
+ const uint32_t vertexCount = mesh->vertexCount();
+ uint32_t minVertex[3];
+ uint32_t maxVertex[3];
+ minVertex[0] = minVertex[1] = minVertex[2] = UINT32_MAX;
+ maxVertex[0] = maxVertex[1] = maxVertex[2] = UINT32_MAX;
+ for (uint32_t v = 1; v < vertexCount; v++) {
+ if (mesh->isBoundaryVertex(v)) {
+ minVertex[0] = minVertex[1] = minVertex[2] = v;
+ maxVertex[0] = maxVertex[1] = maxVertex[2] = v;
+ break;
+ }
+ }
+ if (minVertex[0] == UINT32_MAX) {
+ // Input mesh has not boundaries.
+ return false;
+ }
+ for (uint32_t v = 1; v < vertexCount; v++) {
+ if (!mesh->isBoundaryVertex(v)) {
+ // Skip interior vertices.
+ continue;
+ }
+ const Vector3 &pos = mesh->position(v);
+ if (pos.x < mesh->position(minVertex[0]).x)
+ minVertex[0] = v;
+ else if (pos.x > mesh->position(maxVertex[0]).x)
+ maxVertex[0] = v;
+ if (pos.y < mesh->position(minVertex[1]).y)
+ minVertex[1] = v;
+ else if (pos.y > mesh->position(maxVertex[1]).y)
+ maxVertex[1] = v;
+ if (pos.z < mesh->position(minVertex[2]).z)
+ minVertex[2] = v;
+ else if (pos.z > mesh->position(maxVertex[2]).z)
+ maxVertex[2] = v;
+ }
+ float lengths[3];
+ for (int i = 0; i < 3; i++) {
+ lengths[i] = length(mesh->position(minVertex[i]) - mesh->position(maxVertex[i]));
+ }
+ if (lengths[0] > lengths[1] && lengths[0] > lengths[2]) {
+ *a = minVertex[0];
+ *b = maxVertex[0];
+ } else if (lengths[1] > lengths[2]) {
+ *a = minVertex[1];
+ *b = maxVertex[1];
+ } else {
+ *a = minVertex[2];
+ *b = maxVertex[2];
+ }
+ return true;
+}
+
+// Conformal relations from Brecht Van Lommel (based on ABF):
+
+static float vec_angle_cos(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3)
+{
+ Vector3 d1 = v1 - v2;
+ Vector3 d2 = v3 - v2;
+ return clamp(dot(d1, d2) / (length(d1) * length(d2)), -1.0f, 1.0f);
+}
+
+static float vec_angle(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3)
+{
+ float dot = vec_angle_cos(v1, v2, v3);
+ return acosf(dot);
+}
+
+static void triangle_angles(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3, float *a1, float *a2, float *a3)
+{
+ *a1 = vec_angle(v3, v1, v2);
+ *a2 = vec_angle(v1, v2, v3);
+ *a3 = kPi - *a2 - *a1;
+}
+
+static void setup_abf_relations(sparse::Matrix &A, int row, int id0, int id1, int id2, const Vector3 &p0, const Vector3 &p1, const Vector3 &p2)
+{
+ // @@ IC: Wouldn't it be more accurate to return cos and compute 1-cos^2?
+ // It does indeed seem to be a little bit more robust.
+ // @@ Need to revisit this more carefully!
+ float a0, a1, a2;
+ triangle_angles(p0, p1, p2, &a0, &a1, &a2);
+ float s0 = sinf(a0);
+ float s1 = sinf(a1);
+ float s2 = sinf(a2);
+ if (s1 > s0 && s1 > s2) {
+ swap(s1, s2);
+ swap(s0, s1);
+ swap(a1, a2);
+ swap(a0, a1);
+ swap(id1, id2);
+ swap(id0, id1);
+ } else if (s0 > s1 && s0 > s2) {
+ swap(s0, s2);
+ swap(s0, s1);
+ swap(a0, a2);
+ swap(a0, a1);
+ swap(id0, id2);
+ swap(id0, id1);
+ }
+ float c0 = cosf(a0);
+ float ratio = (s2 == 0.0f) ? 1.0f : s1 / s2;
+ float cosine = c0 * ratio;
+ float sine = s0 * ratio;
+ // Note : 2*id + 0 --> u
+ // 2*id + 1 --> v
+ int u0_id = 2 * id0 + 0;
+ int v0_id = 2 * id0 + 1;
+ int u1_id = 2 * id1 + 0;
+ int v1_id = 2 * id1 + 1;
+ int u2_id = 2 * id2 + 0;
+ int v2_id = 2 * id2 + 1;
+ // Real part
+ A.setCoefficient(u0_id, 2 * row + 0, cosine - 1.0f);
+ A.setCoefficient(v0_id, 2 * row + 0, -sine);
+ A.setCoefficient(u1_id, 2 * row + 0, -cosine);
+ A.setCoefficient(v1_id, 2 * row + 0, sine);
+ A.setCoefficient(u2_id, 2 * row + 0, 1);
+ // Imaginary part
+ A.setCoefficient(u0_id, 2 * row + 1, sine);
+ A.setCoefficient(v0_id, 2 * row + 1, cosine - 1.0f);
+ A.setCoefficient(u1_id, 2 * row + 1, -sine);
+ A.setCoefficient(v1_id, 2 * row + 1, -cosine);
+ A.setCoefficient(v2_id, 2 * row + 1, 1);
+}
+
+static bool computeLeastSquaresConformalMap(Mesh *mesh)
+{
+ // For this to work properly, mesh should not have colocals that have the same
+ // attributes, unless you want the vertices to actually have different texcoords.
+ const uint32_t vertexCount = mesh->vertexCount();
+ const uint32_t D = 2 * vertexCount;
+ const uint32_t N = 2 * mesh->faceCount();
+ // N is the number of equations (one per triangle)
+ // D is the number of variables (one per vertex; there are 2 pinned vertices).
+ if (N < D - 4) {
+ return false;
+ }
+ sparse::Matrix A(D, N);
+ FullVector b(N);
+ FullVector x(D);
+ // Fill b:
+ b.fill(0.0f);
+ // Fill x:
+ uint32_t v0, v1;
+ if (!findApproximateDiameterVertices(mesh, &v0, &v1)) {
+ // Mesh has no boundaries.
+ return false;
+ }
+ if (mesh->texcoord(v0) == mesh->texcoord(v1)) {
+ // LSCM expects an existing parameterization.
+ return false;
+ }
+ for (uint32_t v = 0; v < vertexCount; v++) {
+ // Initial solution.
+ x[2 * v + 0] = mesh->texcoord(v).x;
+ x[2 * v + 1] = mesh->texcoord(v).y;
+ }
+ // Fill A:
+ const uint32_t faceCount = mesh->faceCount();
+ for (uint32_t f = 0, t = 0; f < faceCount; f++) {
+ const uint32_t vertex0 = mesh->vertexAt(f * 3 + 0);
+ const uint32_t vertex1 = mesh->vertexAt(f * 3 + 1);
+ const uint32_t vertex2 = mesh->vertexAt(f * 3 + 2);
+ setup_abf_relations(A, t, vertex0, vertex1, vertex2, mesh->position(vertex0), mesh->position(vertex1), mesh->position(vertex2));
+ t++;
+ }
+ const uint32_t lockedParameters[] = {
+ 2 * v0 + 0,
+ 2 * v0 + 1,
+ 2 * v1 + 0,
+ 2 * v1 + 1
+ };
+ // Solve
+ Solver::LeastSquaresSolver(A, b, x, lockedParameters, 4, 0.000001f);
+ // Map x back to texcoords:
+ for (uint32_t v = 0; v < vertexCount; v++)
+ mesh->texcoord(v) = Vector2(x[2 * v + 0], x[2 * v + 1]);
+ return true;
+}
+
+static bool computeOrthogonalProjectionMap(Mesh *mesh)
+{
+ uint32_t vertexCount = mesh->vertexCount();
+ // Avoid redundant computations.
+ float matrix[6];
+ Fit::computeCovariance(vertexCount, &mesh->position(0), matrix);
+ if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0)
+ return false;
+ float eigenValues[3];
+ Vector3 eigenVectors[3];
+ if (!Fit::eigenSolveSymmetric3(matrix, eigenValues, eigenVectors))
+ return false;
+ Vector3 axis[2];
+ axis[0] = normalize(eigenVectors[0], kEpsilon);
+ axis[1] = normalize(eigenVectors[1], kEpsilon);
+ // Project vertices to plane.
+ for (uint32_t i = 0; i < vertexCount; i++)
+ mesh->texcoord(i) = Vector2(dot(axis[0], mesh->position(i)), dot(axis[1], mesh->position(i)));
+ return true;
+}
+
// Estimate quality of existing parameterization.
struct ParameterizationQuality
{
@@ -5578,15 +5555,15 @@ struct ParameterizationQuality
bool boundaryIntersection = false;
};
-static ParameterizationQuality calculateParameterizationQuality(const Mesh *mesh, Array<uint32_t> *flippedFaces)
+static ParameterizationQuality calculateParameterizationQuality(const Mesh *mesh, uint32_t faceCount, Array<uint32_t> *flippedFaces)
{
XA_DEBUG_ASSERT(mesh != nullptr);
ParameterizationQuality quality;
- const uint32_t faceCount = mesh->faceCount();
uint32_t firstBoundaryEdge = UINT32_MAX;
for (uint32_t e = 0; e < mesh->edgeCount(); e++) {
if (mesh->isBoundaryEdge(e)) {
firstBoundaryEdge = e;
+ break;
}
}
XA_DEBUG_ASSERT(firstBoundaryEdge != UINT32_MAX);
@@ -5681,7 +5658,8 @@ static ParameterizationQuality calculateParameterizationQuality(const Mesh *mesh
// If more than half the triangles are flipped, reverse the flipped / not flipped classification.
quality.flippedTriangleCount = quality.totalTriangleCount - quality.flippedTriangleCount;
if (flippedFaces) {
- Array<uint32_t> temp(*flippedFaces);
+ Array<uint32_t> temp;
+ flippedFaces->copyTo(temp);
flippedFaces->clear();
for (uint32_t f = 0; f < faceCount; f++) {
bool match = false;
@@ -5732,28 +5710,36 @@ struct ChartWarningFlags
class Chart
{
public:
- Chart(const Mesh *originalMesh, const Array<uint32_t> &faceArray, const Basis &basis, uint32_t meshId, uint32_t chartGroupId, uint32_t chartId) : m_basis(basis), m_mesh(nullptr), m_unifiedMesh(nullptr), m_isDisk(false), m_isOrtho(false), m_isPlanar(false), m_warningFlags(0), m_closedHolesCount(0), m_fixedTJunctionsCount(0), m_faceArray(faceArray)
+ Chart(const segment::Atlas *atlas, const Mesh *originalMesh, uint32_t chartIndex, uint32_t meshId, uint32_t chartGroupId, uint32_t chartId) : m_mesh(nullptr), m_unifiedMesh(nullptr), m_isDisk(false), m_isOrtho(false), m_isPlanar(false), m_warningFlags(0), m_closedHolesCount(0), m_fixedTJunctionsCount(0)
{
XA_UNUSED(meshId);
XA_UNUSED(chartGroupId);
XA_UNUSED(chartId);
+ m_basis = atlas->chartBasis(chartIndex);
+ atlas->chartFaces(chartIndex).copyTo(m_faceArray);
// Copy face indices.
- m_mesh = XA_NEW(MemTag::Mesh, Mesh, originalMesh->epsilon(), faceArray.size() * 3, faceArray.size());
- m_unifiedMesh = XA_NEW(MemTag::Mesh, Mesh, originalMesh->epsilon(), faceArray.size() * 3, faceArray.size());
+ m_mesh = XA_NEW_ARGS(MemTag::Mesh, Mesh, originalMesh->epsilon(), m_faceArray.size() * 3, m_faceArray.size());
+ m_unifiedMesh = XA_NEW_ARGS(MemTag::Mesh, Mesh, originalMesh->epsilon(), m_faceArray.size() * 3, m_faceArray.size());
Array<uint32_t> chartMeshIndices;
- chartMeshIndices.resize(originalMesh->vertexCount(), (uint32_t)~0);
+ chartMeshIndices.resize(originalMesh->vertexCount());
+ chartMeshIndices.setAll(UINT32_MAX);
Array<uint32_t> unifiedMeshIndices;
- unifiedMeshIndices.resize(originalMesh->vertexCount(), (uint32_t)~0);
+ unifiedMeshIndices.resize(originalMesh->vertexCount());
+ unifiedMeshIndices.setAll(UINT32_MAX);
// Add vertices.
- const uint32_t faceCount = faceArray.size();
+ const uint32_t faceCount = m_initialFaceCount = m_faceArray.size();
for (uint32_t f = 0; f < faceCount; f++) {
for (uint32_t i = 0; i < 3; i++) {
- const uint32_t vertex = originalMesh->vertexAt(faceArray[f] * 3 + i);
+ const uint32_t vertex = originalMesh->vertexAt(m_faceArray[f] * 3 + i);
const uint32_t unifiedVertex = originalMesh->firstColocal(vertex);
if (unifiedMeshIndices[unifiedVertex] == (uint32_t)~0) {
unifiedMeshIndices[unifiedVertex] = m_unifiedMesh->vertexCount();
XA_DEBUG_ASSERT(equal(originalMesh->position(vertex), originalMesh->position(unifiedVertex), originalMesh->epsilon()));
+#if XA_SKIP_PARAMETERIZATION
+ m_unifiedMesh->addVertex(originalMesh->position(vertex), Vector3(0.0f), atlas->faceTexcoords(m_faceArray[f])[i]);
+#else
m_unifiedMesh->addVertex(originalMesh->position(vertex));
+#endif
}
if (chartMeshIndices[vertex] == (uint32_t)~0) {
chartMeshIndices[vertex] = m_mesh->vertexCount();
@@ -5767,7 +5753,7 @@ public:
for (uint32_t f = 0; f < faceCount; f++) {
uint32_t indices[3], unifiedIndices[3];
for (uint32_t i = 0; i < 3; i++) {
- const uint32_t vertex = originalMesh->vertexAt(faceArray[f] * 3 + i);
+ const uint32_t vertex = originalMesh->vertexAt(m_faceArray[f] * 3 + i);
indices[i] = chartMeshIndices[vertex];
unifiedIndices[i] = unifiedMeshIndices[originalMesh->firstColocal(vertex)];
}
@@ -5810,6 +5796,7 @@ public:
m_unifiedMesh = fixedUnifiedMesh;
m_unifiedMesh->createBoundaries();
m_unifiedMesh->linkBoundaries();
+ m_initialFaceCount = m_unifiedMesh->faceCount(); // Fixing t-junctions rewrites faces.
}
// See if there are any holes that need closing.
Array<uint32_t> boundaryLoops;
@@ -5825,7 +5812,7 @@ public:
// - Use minimal spanning trees or seamster.
Array<uint32_t> holeFaceCounts;
XA_PROFILE_START(closeChartMeshHoles)
- failed = !meshCloseHoles(m_unifiedMesh, boundaryLoops, basis.normal, holeFaceCounts);
+ failed = !meshCloseHoles(m_unifiedMesh, boundaryLoops, m_basis.normal, holeFaceCounts);
XA_PROFILE_END(closeChartMeshHoles)
m_unifiedMesh->createBoundaries();
m_unifiedMesh->linkBoundaries();
@@ -5907,7 +5894,7 @@ public:
void evaluateOrthoParameterizationQuality()
{
XA_PROFILE_START(parameterizeChartsEvaluateQuality)
- m_paramQuality = calculateParameterizationQuality(m_unifiedMesh, nullptr);
+ m_paramQuality = calculateParameterizationQuality(m_unifiedMesh, m_initialFaceCount, nullptr);
XA_PROFILE_END(parameterizeChartsEvaluateQuality)
// Use orthogonal parameterization if quality is acceptable.
if (!m_paramQuality.boundaryIntersection && m_paramQuality.geometricArea > 0.0f && m_paramQuality.stretchMetric <= 1.1f && m_paramQuality.maxStretchMetric <= 1.25f)
@@ -5918,9 +5905,9 @@ public:
{
XA_PROFILE_START(parameterizeChartsEvaluateQuality)
#if XA_DEBUG_EXPORT_OBJ_INVALID_PARAMETERIZATION
- m_paramQuality = calculateParameterizationQuality(m_unifiedMesh, &m_paramFlippedFaces);
+ m_paramQuality = calculateParameterizationQuality(m_unifiedMesh, m_initialFaceCount, &m_paramFlippedFaces);
#else
- m_paramQuality = calculateParameterizationQuality(m_unifiedMesh, nullptr);
+ m_paramQuality = calculateParameterizationQuality(m_unifiedMesh, m_initialFaceCount, nullptr);
#endif
XA_PROFILE_END(parameterizeChartsEvaluateQuality)
}
@@ -5961,6 +5948,7 @@ private:
Mesh *m_unifiedMesh;
bool m_isDisk, m_isOrtho, m_isPlanar;
uint32_t m_warningFlags;
+ uint32_t m_initialFaceCount; // Before fixing T-junctions and/or closing holes.
uint32_t m_closedHolesCount, m_fixedTJunctionsCount;
// List of faces of the original mesh that belong to this chart.
@@ -5979,9 +5967,9 @@ private:
struct CreateChartTaskArgs
{
+ const segment::Atlas *atlas;
const Mesh *mesh;
- const Array<uint32_t> *faceArray;
- const Basis *basis;
+ uint32_t chartIndex; // In the atlas.
uint32_t meshId;
uint32_t chartGroupId;
uint32_t chartId;
@@ -5992,7 +5980,7 @@ static void runCreateChartTask(void *userData)
{
XA_PROFILE_START(createChartMeshesThread)
auto args = (CreateChartTaskArgs *)userData;
- *(args->chart) = XA_NEW(MemTag::Default, Chart, args->mesh, *(args->faceArray), *(args->basis), args->meshId, args->chartGroupId, args->chartId);
+ *(args->chart) = XA_NEW_ARGS(MemTag::Default, Chart, args->atlas, args->mesh, args->chartIndex, args->meshId, args->chartGroupId, args->chartId);
XA_PROFILE_END(createChartMeshesThread)
}
@@ -6043,10 +6031,11 @@ public:
}
// Only initial meshes have face groups and ignored faces. The only flag we care about is HasNormals.
const uint32_t faceCount = m_faceToSourceFaceMap.size();
- m_mesh = XA_NEW(MemTag::Mesh, Mesh, sourceMesh->epsilon(), faceCount * 3, faceCount, sourceMesh->flags() & MeshFlags::HasNormals);
+ m_mesh = XA_NEW_ARGS(MemTag::Mesh, Mesh, sourceMesh->epsilon(), faceCount * 3, faceCount, sourceMesh->flags() & MeshFlags::HasNormals);
XA_DEBUG_ASSERT(faceCount > 0);
Array<uint32_t> meshIndices;
- meshIndices.resize(sourceMesh->vertexCount(), (uint32_t)~0);
+ meshIndices.resize(sourceMesh->vertexCount());
+ meshIndices.setAll((uint32_t)~0);
for (uint32_t f = 0; f < faceCount; f++) {
const uint32_t face = m_faceToSourceFaceMap[f];
for (uint32_t i = 0; i < 3; i++) {
@@ -6183,22 +6172,22 @@ public:
chartFaces.resize(m_mesh->faceCount());
for (uint32_t i = 0; i < chartFaces.size(); i++)
chartFaces[i] = i;
- Chart *chart = XA_NEW(MemTag::Default, Chart, m_mesh, chartFaces, m_sourceId, m_id, 0);
+ Chart *chart = XA_NEW_ARGS(MemTag::Default, Chart, m_mesh, chartFaces, m_sourceId, m_id, 0);
m_chartArray.push_back(chart);
#else
- XA_PROFILE_START(atlasBuilder)
- AtlasBuilder builder(m_mesh, nullptr, options);
- runAtlasBuilder(builder, options);
- XA_PROFILE_END(atlasBuilder)
- const uint32_t chartCount = builder.chartCount();
+ XA_PROFILE_START(buildAtlas)
+ segment::Atlas atlas(m_mesh, nullptr, options);
+ buildAtlas(atlas, options);
+ XA_PROFILE_END(buildAtlas)
+ const uint32_t chartCount = atlas.chartCount();
m_chartArray.resize(chartCount);
Array<CreateChartTaskArgs> taskArgs;
taskArgs.resize(chartCount);
for (uint32_t i = 0; i < chartCount; i++) {
CreateChartTaskArgs &args = taskArgs[i];
+ args.atlas = &atlas;
args.mesh = m_mesh;
- args.faceArray = &builder.chartFaces(i);
- args.basis = &builder.chartBasis(i);
+ args.chartIndex = i;
args.meshId = m_sourceId;
args.chartGroupId = m_id;
args.chartId = i;
@@ -6239,6 +6228,16 @@ public:
void parameterizeCharts(TaskScheduler *taskScheduler, ParameterizeFunc func)
{
const uint32_t chartCount = m_chartArray.size();
+#if XA_SKIP_PARAMETERIZATION
+ XA_UNUSED(taskScheduler);
+ XA_UNUSED(func);
+ for (uint32_t i = 0; i < chartCount; i++) {
+ Chart *chart = m_chartArray[i];
+ chart->evaluateOrthoParameterizationQuality();
+ chart->evaluateParameterizationQuality();
+ chart->transferParameterization();
+ }
+#else
Array<ParameterizeChartTaskArgs> taskArgs;
taskArgs.resize(chartCount);
TaskGroupHandle taskGroup = taskScheduler->createTaskGroup(chartCount);
@@ -6279,10 +6278,10 @@ public:
options.maxChartArea = invalidChartArea * 0.2f;
options.maxThreshold = 0.25f;
options.maxIterations = 3;
- AtlasBuilder builder(m_mesh, &meshFaces, options);
- runAtlasBuilder(builder, options);
- for (uint32_t j = 0; j < builder.chartCount(); j++) {
- Chart *chart = XA_NEW(MemTag::Default, Chart, m_mesh, builder.chartFaces(j), builder.chartBasis(j), m_sourceId, m_id, m_chartArray.size());
+ segment::Atlas atlas(m_mesh, &meshFaces, options);
+ buildAtlas(atlas, options);
+ for (uint32_t j = 0; j < atlas.chartCount(); j++) {
+ Chart *chart = XA_NEW_ARGS(MemTag::Default, Chart, &atlas, m_mesh, j, m_sourceId, m_id, m_chartArray.size());
m_chartArray.push_back(chart);
m_paramAddedChartsCount++;
}
@@ -6325,46 +6324,41 @@ public:
XA_FREE(chart);
m_paramDeletedChartsCount++;
}
-#endif
+#endif // XA_RECOMPUTE_CHARTS
+#endif // XA_SKIP_PARAMETERIZATION
}
private:
- void runAtlasBuilder(AtlasBuilder &builder, const ChartOptions &options)
+ void buildAtlas(segment::Atlas &atlas, const ChartOptions &options)
{
- if (builder.facesLeft() == 0)
+ if (atlas.facesLeft() == 0)
return;
- // This seems a reasonable estimate.
- XA_PROFILE_START(atlasBuilderCreateInitialCharts)
// Create initial charts greedely.
- builder.placeSeeds(options.maxThreshold * 0.5f);
+ atlas.placeSeeds(options.maxThreshold * 0.5f);
if (options.maxIterations == 0) {
- XA_DEBUG_ASSERT(builder.facesLeft() == 0);
- XA_PROFILE_END(atlasBuilderCreateInitialCharts)
+ XA_DEBUG_ASSERT(atlas.facesLeft() == 0);
return;
}
- builder.updateProxies();
- builder.relocateSeeds();
- builder.resetCharts();
- XA_PROFILE_END(atlasBuilderCreateInitialCharts)
+ atlas.relocateSeeds();
+ atlas.resetCharts();
// Restart process growing charts in parallel.
uint32_t iteration = 0;
while (true) {
- if (!builder.growCharts(options.maxThreshold, options.growFaceCount)) {
+ if (!atlas.growCharts(options.maxThreshold)) {
// If charts cannot grow more: fill holes, merge charts, relocate seeds and start new iteration.
- builder.fillHoles(options.maxThreshold * 0.5f);
- builder.updateProxies();
+ atlas.fillHoles(options.maxThreshold * 0.5f);
#if XA_MERGE_CHARTS
- builder.mergeCharts();
+ atlas.mergeCharts();
#endif
if (++iteration == options.maxIterations)
break;
- if (!builder.relocateSeeds())
+ if (!atlas.relocateSeeds())
break;
- builder.resetCharts();
+ atlas.resetCharts();
}
}
// Make sure no holes are left!
- XA_DEBUG_ASSERT(builder.facesLeft() == 0);
+ XA_DEBUG_ASSERT(atlas.facesLeft() == 0);
}
void removeChart(const Chart *chart)
@@ -6400,7 +6394,7 @@ static void runCreateChartGroupTask(void *userData)
{
XA_PROFILE_START(addMeshCreateChartGroupsThread)
auto args = (CreateChartGroupTaskArgs *)userData;
- *(args->chartGroup) = XA_NEW(MemTag::Default, ChartGroup, args->groupId, args->mesh, args->faceGroup);
+ *(args->chartGroup) = XA_NEW_ARGS(MemTag::Default, ChartGroup, args->groupId, args->mesh, args->faceGroup);
XA_PROFILE_END(addMeshCreateChartGroupsThread)
}
@@ -6448,7 +6442,7 @@ static void runParameterizeChartsJob(void *userData)
class Atlas
{
public:
- Atlas() : m_chartsComputed(false), m_chartsParameterized(false) {}
+ Atlas() : m_meshCount(0), m_chartsComputed(false), m_chartsParameterized(false) {}
~Atlas()
{
@@ -6460,6 +6454,8 @@ public:
bool chartsComputed() const { return m_chartsComputed; }
bool chartsParameterized() const { return m_chartsParameterized; }
+ uint32_t chartGroupCount() const { return m_chartGroups.size(); }
+ const ChartGroup *chartGroupAt(uint32_t index) const { return m_chartGroups[index]; }
uint32_t chartGroupCount(uint32_t mesh) const
{
@@ -6483,26 +6479,6 @@ public:
return nullptr;
}
- uint32_t chartCount() const
- {
- uint32_t count = 0;
- for (uint32_t i = 0; i < m_chartGroups.size(); i++)
- count += m_chartGroups[i]->chartCount();
- return count;
- }
-
- Chart *chartAt(uint32_t i)
- {
- for (uint32_t c = 0; c < m_chartGroups.size(); c++) {
- uint32_t count = m_chartGroups[c]->chartCount();
- if (i < count) {
- return m_chartGroups[c]->chartAt(i);
- }
- i -= count;
- }
- return nullptr;
- }
-
// This function is thread safe.
void addMesh(TaskScheduler *taskScheduler, const Mesh *mesh)
{
@@ -6548,9 +6524,32 @@ public:
m_chartGroups.push_back(chartGroups[g]);
m_chartGroupSourceMeshes.push_back(mesh->id());
}
+ m_meshCount++;
m_addMeshMutex.unlock();
}
+ // Chart id/index is determined by depth-first hierarchy of mesh -> chart group -> chart.
+ // For chart index to be consistent here, chart groups needs to sorted by mesh index. Since addMesh is called by multithreaded tasks, order is indeterminate, so chart groups need to be explicitly sorted after all meshes are added.
+ void sortChartGroups()
+ {
+ Array<ChartGroup *> oldChartGroups;
+ oldChartGroups.resize(m_chartGroups.size());
+ memcpy(oldChartGroups.data(), m_chartGroups.data(), sizeof(ChartGroup *) * m_chartGroups.size());
+ Array<uint32_t> oldChartGroupSourceMeshes;
+ oldChartGroupSourceMeshes.resize(m_chartGroupSourceMeshes.size());
+ memcpy(oldChartGroupSourceMeshes.data(), m_chartGroupSourceMeshes.data(), sizeof(uint32_t) * m_chartGroupSourceMeshes.size());
+ uint32_t current = 0;
+ for (uint32_t i = 0; i < m_meshCount; i++) {
+ for (uint32_t j = 0; j < oldChartGroups.size(); j++) {
+ if (oldChartGroupSourceMeshes[j] == i) {
+ m_chartGroups[current] = oldChartGroups[j];
+ m_chartGroupSourceMeshes[current] = oldChartGroupSourceMeshes[j];
+ current++;
+ }
+ }
+ }
+ }
+
bool computeCharts(TaskScheduler *taskScheduler, const ChartOptions &options, ProgressFunc progressFunc, void *progressUserData)
{
m_chartsComputed = false;
@@ -6629,37 +6628,18 @@ public:
taskScheduler->wait(&taskGroup);
if (progress.cancel)
return false;
- // Save original texcoords so PackCharts can be called multiple times (packing overwrites the texcoords).
- const uint32_t nCharts = chartCount();
- m_originalChartTexcoords.resize(nCharts);
- for (uint32_t i = 0; i < nCharts; i++) {
- const Mesh *mesh = chartAt(i)->mesh();
- m_originalChartTexcoords[i].resize(mesh->vertexCount());
- for (uint32_t j = 0; j < mesh->vertexCount(); j++)
- m_originalChartTexcoords[i][j] = mesh->texcoord(j);
- }
m_chartsParameterized = true;
return true;
}
- void restoreOriginalChartTexcoords()
- {
- const uint32_t nCharts = chartCount();
- for (uint32_t i = 0; i < nCharts; i++) {
- Mesh *mesh = chartAt(i)->mesh();
- for (uint32_t j = 0; j < mesh->vertexCount(); j++)
- mesh->texcoord(j) = m_originalChartTexcoords[i][j];
- }
- }
-
private:
std::mutex m_addMeshMutex;
+ uint32_t m_meshCount;
bool m_chartsComputed;
bool m_chartsParameterized;
Array<ChartGroup *> m_chartGroups;
RadixSort m_chartGroupsRadix; // By mesh indexCount.
Array<uint32_t> m_chartGroupSourceMeshes;
- Array<Array<Vector2> > m_originalChartTexcoords;
};
} // namespace param
@@ -6733,10 +6713,10 @@ public:
memcpy(&data[y * width], &m_data[y * m_width], min(m_width, width) * sizeof(uint32_t));
m_width = width;
m_height = height;
- swap(m_data, data);
+ data.moveTo(m_data);
}
- void addChart(uint32_t chartIndex, const BitImage *image, bool imageHasPadding, int atlas_w, int atlas_h, int offset_x, int offset_y)
+ void addChart(uint32_t chartIndex, const BitImage *image, const BitImage *imageBilinear, const BitImage *imagePadding, int atlas_w, int atlas_h, int offset_x, int offset_y)
{
const int w = image->width();
const int h = image->height();
@@ -6746,23 +6726,27 @@ public:
continue;
for (int x = 0; x < w; x++) {
const int xx = x + offset_x;
- if (xx >= 0 && xx < atlas_w && yy < atlas_h && image->bitAt(x, y)) {
+ if (xx >= 0 && xx < atlas_w && yy < atlas_h) {
const uint32_t dataOffset = xx + yy * m_width;
- if (m_data[dataOffset] != 0)
- continue;
- uint32_t value = chartIndex | kImageHasChartIndexBit;
- if (imageHasPadding)
- value |= kImageIsPaddingBit;
- m_data[dataOffset] = value;
+ if (image->bitAt(x, y)) {
+ XA_DEBUG_ASSERT(m_data[dataOffset] == 0);
+ m_data[dataOffset] = chartIndex | kImageHasChartIndexBit;
+ } else if (imageBilinear && imageBilinear->bitAt(x, y)) {
+ XA_DEBUG_ASSERT(m_data[dataOffset] == 0);
+ m_data[dataOffset] = chartIndex | kImageHasChartIndexBit | kImageIsBilinearBit;
+ } else if (imagePadding && imagePadding->bitAt(x, y)) {
+ XA_DEBUG_ASSERT(m_data[dataOffset] == 0);
+ m_data[dataOffset] = chartIndex | kImageHasChartIndexBit | kImageIsPaddingBit;
+ }
}
}
}
}
- void copyTo(uint32_t *dest, uint32_t destWidth, uint32_t destHeight) const
+ void copyTo(uint32_t *dest, uint32_t destWidth, uint32_t destHeight, int padding) const
{
for (uint32_t y = 0; y < destHeight; y++)
- memcpy(&dest[y * destWidth], &m_data[y * m_width], destWidth * sizeof(uint32_t));
+ memcpy(&dest[y * destWidth], &m_data[padding + (y + padding) * m_width], destWidth * sizeof(uint32_t));
}
#if XA_DEBUG_EXPORT_ATLAS_IMAGES
@@ -6777,20 +6761,26 @@ public:
if (x >= m_width)
continue;
const uint32_t data = m_data[x + y * m_width];
- if (!(data & kImageHasChartIndexBit))
+ uint8_t *bgr = &image[(x + y * width) * 3];
+ if (data == 0) {
+ bgr[0] = bgr[1] = bgr[2] = 0;
continue;
+ }
const uint32_t chartIndex = data & kImageChartIndexMask;
- uint8_t *color = &image[(x + y * width) * 3];
if (data & kImageIsPaddingBit) {
- color[0] = 255;
- color[1] = 0;
- color[2] = 255;
+ bgr[0] = 0;
+ bgr[1] = 0;
+ bgr[2] = 255;
+ } else if (data & kImageIsBilinearBit) {
+ bgr[0] = 0;
+ bgr[1] = 255;
+ bgr[2] = 0;
} else {
const int mix = 192;
srand((unsigned int)chartIndex);
- color[0] = uint8_t((rand() % 255 + mix) * 0.5f);
- color[1] = uint8_t((rand() % 255 + mix) * 0.5f);
- color[2] = uint8_t((rand() % 255 + mix) * 0.5f);
+ bgr[0] = uint8_t((rand() % 255 + mix) * 0.5f);
+ bgr[1] = uint8_t((rand() % 255 + mix) * 0.5f);
+ bgr[2] = uint8_t((rand() % 255 + mix) * 0.5f);
}
}
}
@@ -6817,11 +6807,61 @@ struct Chart
bool allowRotate;
// bounding box
Vector2 majorAxis, minorAxis, minCorner, maxCorner;
+ // UvMeshChart only
+ Array<uint32_t> faces;
Vector2 &uniqueVertexAt(uint32_t v) { return uniqueVertices.isEmpty() ? vertices[v] : vertices[uniqueVertices[v]]; }
uint32_t uniqueVertexCount() const { return uniqueVertices.isEmpty() ? vertexCount : uniqueVertices.size(); }
};
+struct AddChartTaskArgs
+{
+ param::Chart *paramChart;
+ Chart *chart; // out
+};
+
+static void runAddChartTask(void *userData)
+{
+ XA_PROFILE_START(packChartsAddChartsThread)
+ auto args = (AddChartTaskArgs *)userData;
+ param::Chart *paramChart = args->paramChart;
+ XA_PROFILE_START(packChartsAddChartsRestoreTexcoords)
+ paramChart->transferParameterization();
+ XA_PROFILE_END(packChartsAddChartsRestoreTexcoords)
+ Mesh *mesh = paramChart->mesh();
+ Chart *chart = args->chart = XA_NEW(MemTag::Default, Chart);
+ chart->atlasIndex = -1;
+ chart->material = 0;
+ chart->indexCount = mesh->indexCount();
+ chart->indices = mesh->indices();
+ chart->parametricArea = paramChart->computeParametricArea();
+ if (chart->parametricArea < kAreaEpsilon) {
+ // When the parametric area is too small we use a rough approximation to prevent divisions by very small numbers.
+ const Vector2 bounds = paramChart->computeParametricBounds();
+ chart->parametricArea = bounds.x * bounds.y;
+ }
+ chart->surfaceArea = paramChart->computeSurfaceArea();
+ chart->vertices = mesh->texcoords();
+ chart->vertexCount = mesh->vertexCount();
+ chart->allowRotate = true;
+ // Compute list of boundary vertices.
+ Array<Vector2> boundary;
+ boundary.reserve(16);
+ for (uint32_t v = 0; v < chart->vertexCount; v++) {
+ if (mesh->isBoundaryVertex(v))
+ boundary.push_back(mesh->texcoord(v));
+ }
+ XA_DEBUG_ASSERT(boundary.size() > 0);
+ // Compute bounding box of chart.
+ static thread_local BoundingBox2D boundingBox;
+ boundingBox.compute(boundary.data(), boundary.size(), mesh->texcoords(), mesh->vertexCount());
+ chart->majorAxis = boundingBox.majorAxis();
+ chart->minorAxis = boundingBox.minorAxis();
+ chart->minCorner = boundingBox.minCorner();
+ chart->maxCorner = boundingBox.maxCorner();
+ XA_PROFILE_END(packChartsAddChartsThread)
+}
+
struct FindChartLocationBruteForceTaskArgs
{
std::atomic<bool> *finished; // One of the tasks found a location that doesn't expand the atlas.
@@ -6830,7 +6870,8 @@ struct FindChartLocationBruteForceTaskArgs
const BitImage *chartBitImage;
const BitImage *chartBitImageRotated;
int w, h;
- bool blockAligned, resizableAtlas, allowRotate;
+ bool blockAligned, allowRotate;
+ uint32_t maxResolution;
// out
bool best_insideAtlas;
int best_metric, best_x, best_y, best_w, best_h, best_r;
@@ -6845,6 +6886,8 @@ static void runFindChartLocationBruteForceTask(void *userData)
return;
// Try two different orientations.
for (int r = 0; r < 2; r++) {
+ if (args->finished->load())
+ break;
int cw = args->chartBitImage->width();
int ch = args->chartBitImage->height();
if (r == 1) {
@@ -6855,8 +6898,8 @@ static void runFindChartLocationBruteForceTask(void *userData)
}
const int y = args->startPosition.y;
const int stepSize = args->blockAligned ? 4 : 1;
- for (int x = args->startPosition.x; x <= args->w + stepSize; x += stepSize) { // + 1 not really necessary here.
- if (!args->resizableAtlas && (x > (int)args->atlasBitImage->width() - cw || y > (int)args->atlasBitImage->height() - ch))
+ for (int x = args->startPosition.x; x <= args->w + stepSize; x += stepSize) {
+ if (args->maxResolution > 0 && (x > (int)args->maxResolution - cw || y > (int)args->maxResolution - ch))
continue;
if (args->finished->load())
break;
@@ -6891,6 +6934,10 @@ struct Atlas
{
~Atlas()
{
+ for (uint32_t i = 0; i < m_atlasImages.size(); i++) {
+ m_atlasImages[i]->~AtlasImage();
+ XA_FREE(m_atlasImages[i]);
+ }
for (uint32_t i = 0; i < m_bitImages.size(); i++) {
m_bitImages[i]->~BitImage();
XA_FREE(m_bitImages[i]);
@@ -6910,39 +6957,44 @@ struct Atlas
const Array<AtlasImage *> &getImages() const { return m_atlasImages; }
float getUtilization(uint32_t atlas) const { return m_utilization[atlas]; }
- void addChart(param::Chart *paramChart)
+ void addCharts(TaskScheduler *taskScheduler, param::Atlas *paramAtlas)
{
- Mesh *mesh = paramChart->mesh();
- Chart *chart = XA_NEW(MemTag::Default, Chart);
- chart->atlasIndex = -1;
- chart->material = 0;
- chart->indexCount = mesh->indexCount();
- chart->indices = mesh->indices();
- chart->parametricArea = paramChart->computeParametricArea();
- if (chart->parametricArea < kAreaEpsilon) {
- // When the parametric area is too small we use a rough approximation to prevent divisions by very small numbers.
- const Vector2 bounds = paramChart->computeParametricBounds();
- chart->parametricArea = bounds.x * bounds.y;
- }
- chart->surfaceArea = paramChart->computeSurfaceArea();
- chart->vertices = mesh->texcoords();
- chart->vertexCount = mesh->vertexCount();
- chart->allowRotate = true;
- // Compute list of boundary vertices.
- Array<Vector2> boundary;
- boundary.reserve(16);
- for (uint32_t v = 0; v < chart->vertexCount; v++) {
- if (mesh->isBoundaryVertex(v))
- boundary.push_back(mesh->texcoord(v));
+ // Count charts.
+ uint32_t chartCount = 0;
+ const uint32_t chartGroupsCount = paramAtlas->chartGroupCount();
+ for (uint32_t i = 0; i < chartGroupsCount; i++) {
+ const param::ChartGroup *chartGroup = paramAtlas->chartGroupAt(i);
+ if (chartGroup->isVertexMap())
+ continue;
+ chartCount += chartGroup->chartCount();
}
- XA_DEBUG_ASSERT(boundary.size() > 0);
- // Compute bounding box of chart.
- m_boundingBox.compute(boundary.data(), boundary.size(), mesh->texcoords(), mesh->vertexCount());
- chart->majorAxis = m_boundingBox.majorAxis();
- chart->minorAxis = m_boundingBox.minorAxis();
- chart->minCorner = m_boundingBox.minCorner();
- chart->maxCorner = m_boundingBox.maxCorner();
- m_charts.push_back(chart);
+ if (chartCount == 0)
+ return;
+ // Run one task per chart.
+ Array<AddChartTaskArgs> taskArgs;
+ taskArgs.resize(chartCount);
+ TaskGroupHandle taskGroup = taskScheduler->createTaskGroup(chartCount);
+ uint32_t chartIndex = 0;
+ for (uint32_t i = 0; i < chartGroupsCount; i++) {
+ const param::ChartGroup *chartGroup = paramAtlas->chartGroupAt(i);
+ if (chartGroup->isVertexMap())
+ continue;
+ const uint32_t count = chartGroup->chartCount();
+ for (uint32_t j = 0; j < count; j++) {
+ AddChartTaskArgs &args = taskArgs[chartIndex];
+ args.paramChart = chartGroup->chartAt(j);
+ Task task;
+ task.userData = &taskArgs[chartIndex];
+ task.func = runAddChartTask;
+ taskScheduler->run(taskGroup, task);
+ chartIndex++;
+ }
+ }
+ taskScheduler->wait(&taskGroup);
+ // Get task output.
+ m_charts.resize(chartCount);
+ for (uint32_t i = 0; i < chartCount; i++)
+ m_charts[i] = taskArgs[i].chart;
}
void addUvMeshCharts(UvMeshInstance *mesh)
@@ -6950,6 +7002,7 @@ struct Atlas
BitArray vertexUsed(mesh->texcoords.size());
Array<Vector2> boundary;
boundary.reserve(16);
+ BoundingBox2D boundingBox;
for (uint32_t c = 0; c < mesh->mesh->charts.size(); c++) {
UvMeshChart *uvChart = mesh->mesh->charts[c];
Chart *chart = XA_NEW(MemTag::Default, Chart);
@@ -6960,6 +7013,8 @@ struct Atlas
chart->vertices = mesh->texcoords.data();
chart->vertexCount = mesh->texcoords.size();
chart->allowRotate = mesh->rotateCharts;
+ chart->faces.resize(uvChart->faces.size());
+ memcpy(chart->faces.data(), uvChart->faces.data(), sizeof(uint32_t) * uvChart->faces.size());
// Find unique vertices.
vertexUsed.clearAll();
for (uint32_t i = 0; i < chart->indexCount; i++) {
@@ -6997,11 +7052,11 @@ struct Atlas
boundary.push_back(chart->uniqueVertexAt(v));
XA_DEBUG_ASSERT(boundary.size() > 0);
// Compute bounding box of chart.
- m_boundingBox.compute(boundary.data(), boundary.size(), boundary.data(), boundary.size());
- chart->majorAxis = m_boundingBox.majorAxis();
- chart->minorAxis = m_boundingBox.minorAxis();
- chart->minCorner = m_boundingBox.minCorner();
- chart->maxCorner = m_boundingBox.maxCorner();
+ boundingBox.compute(boundary.data(), boundary.size(), boundary.data(), boundary.size());
+ chart->majorAxis = boundingBox.majorAxis();
+ chart->minorAxis = boundingBox.minorAxis();
+ chart->minCorner = boundingBox.minCorner();
+ chart->maxCorner = boundingBox.maxCorner();
m_charts.push_back(chart);
}
}
@@ -7022,8 +7077,10 @@ struct Atlas
}
return true;
}
- uint32_t resolution = options.resolution;
+ // Estimate resolution and/or texels per unit if not specified.
m_texelsPerUnit = options.texelsPerUnit;
+ uint32_t resolution = options.resolution > 0 ? options.resolution + options.padding * 2 : 0;
+ const uint32_t maxResolution = m_texelsPerUnit > 0.0f ? resolution : 0;
if (resolution <= 0 || m_texelsPerUnit <= 0) {
if (resolution <= 0 && m_texelsPerUnit <= 0)
resolution = 1024;
@@ -7049,15 +7106,11 @@ struct Atlas
float minChartPerimeter = FLT_MAX, maxChartPerimeter = 0.0f;
for (uint32_t c = 0; c < chartCount; c++) {
Chart *chart = m_charts[c];
- //chartOrderArray[c] = chart.surfaceArea;
// Compute chart scale
float scale = (chart->surfaceArea / chart->parametricArea) * m_texelsPerUnit;
- if (chart->parametricArea == 0) { // < kAreaEpsilon)
+ if (chart->parametricArea == 0.0f)
scale = 0;
- }
XA_ASSERT(isFinite(scale));
- // Sort charts by perimeter. @@ This is sometimes producing somewhat unexpected results. Is this right?
- //chartOrderArray[c] = ((chart->maxCorner.x - chart->minCorner.x) + (chart->maxCorner.y - chart->minCorner.y)) * scale;
// Translate, rotate and scale vertices. Compute extents.
Vector2 minCorner(FLT_MAX, FLT_MAX);
if (!chart->allowRotate) {
@@ -7077,58 +7130,59 @@ struct Atlas
texcoord -= minCorner;
}
texcoord *= scale;
- XA_DEBUG_ASSERT(texcoord.x >= 0 && texcoord.y >= 0);
+ XA_DEBUG_ASSERT(texcoord.x >= 0.0f && texcoord.y >= 0.0f);
XA_DEBUG_ASSERT(isFinite(texcoord.x) && isFinite(texcoord.y));
extents = max(extents, texcoord);
}
XA_DEBUG_ASSERT(extents.x >= 0 && extents.y >= 0);
- // Limit chart size.
- const float maxChartSize = (float)options.maxChartSize;
- if (extents.x > maxChartSize || extents.y > maxChartSize) {
- const float limit = max(extents.x, extents.y);
- scale = maxChartSize / (limit + 1.0f);
- for (uint32_t i = 0; i < chart->uniqueVertexCount(); i++)
- chart->uniqueVertexAt(i) *= scale;
- extents *= scale;
- XA_DEBUG_ASSERT(extents.x <= maxChartSize && extents.y <= maxChartSize);
- }
- // Scale the charts to use the entire texel area available. So, if the width is 0.1 we could scale it to 1 without increasing the lightmap usage and making a better
- // use of it. In many cases this also improves the look of the seams, since vertices on the chart boundaries have more chances of being aligned with the texel centers.
- float scale_x = 1.0f;
- float scale_y = 1.0f;
- float divide_x = 1.0f;
- float divide_y = 1.0f;
- if (extents.x > 0) {
- int cw = ftoi_ceil(extents.x);
- if (options.blockAlign) {
- // Align all chart extents to 4x4 blocks, but taking padding into account.
- cw = align(cw + 2, 4) - 2;
+ // Scale the charts to use the entire texel area available. So, if the width is 0.1 we could scale it to 1 without increasing the lightmap usage and making a better use of it. In many cases this also improves the look of the seams, since vertices on the chart boundaries have more chances of being aligned with the texel centers.
+ if (extents.x > 0.0f && extents.y > 0.0f) {
+ // Block align: align all chart extents to 4x4 blocks, but taking padding and texel center offset into account.
+ const int blockAlignSizeOffset = options.padding * 2 + 1;
+ int width = ftoi_ceil(extents.x);
+ if (options.blockAlign)
+ width = align(width + blockAlignSizeOffset, 4) - blockAlignSizeOffset;
+ int height = ftoi_ceil(extents.y);
+ if (options.blockAlign)
+ height = align(height + blockAlignSizeOffset, 4) - blockAlignSizeOffset;
+ for (uint32_t v = 0; v < chart->uniqueVertexCount(); v++) {
+ Vector2 &texcoord = chart->uniqueVertexAt(v);
+ texcoord.x = texcoord.x / extents.x * (float)width;
+ texcoord.y = texcoord.y / extents.y * (float)height;
}
- scale_x = (float(cw) - kEpsilon);
- divide_x = extents.x;
- extents.x = float(cw);
- }
- if (extents.y > 0) {
- int ch = ftoi_ceil(extents.y);
- if (options.blockAlign) {
- // Align all chart extents to 4x4 blocks, but taking padding into account.
- ch = align(ch + 2, 4) - 2;
+ extents.x = (float)width;
+ extents.y = (float)height;
+ }
+ // Limit chart size, either to PackOptions::maxChartSize or maxResolution (if set), whichever is smaller.
+ // If limiting chart size to maxResolution, print a warning, since that may not be desirable to the user.
+ uint32_t maxChartSize = options.maxChartSize;
+ bool warnChartResized = false;
+ if (maxResolution > 0 && (maxChartSize == 0 || maxResolution < maxChartSize)) {
+ maxChartSize = maxResolution - options.padding * 2; // Don't include padding.
+ warnChartResized = true;
+ }
+ if (maxChartSize > 0) {
+ const float realMaxChartSize = (float)maxChartSize - 1.0f; // Aligning to texel centers increases texel footprint by 1.
+ if (extents.x > realMaxChartSize || extents.y > realMaxChartSize) {
+ if (warnChartResized)
+ XA_PRINT(" Resizing chart %u from %gx%g to %ux%u to fit atlas\n", c, extents.x, extents.y, maxChartSize, maxChartSize);
+ scale = realMaxChartSize / max(extents.x, extents.y);
+ for (uint32_t i = 0; i < chart->uniqueVertexCount(); i++) {
+ Vector2 &texcoord = chart->uniqueVertexAt(i);
+ texcoord = min(texcoord * scale, Vector2(realMaxChartSize));
+ }
}
- scale_y = (float(ch) - kEpsilon);
- divide_y = extents.y;
- extents.y = float(ch);
}
+ // Align to texel centers and add padding offset.
+ extents.x = extents.y = 0.0f;
for (uint32_t v = 0; v < chart->uniqueVertexCount(); v++) {
Vector2 &texcoord = chart->uniqueVertexAt(v);
- texcoord.x /= divide_x;
- texcoord.y /= divide_y;
- texcoord.x *= scale_x;
- texcoord.y *= scale_y;
- XA_ASSERT(isFinite(texcoord.x) && isFinite(texcoord.y));
+ texcoord.x += 0.5f + options.padding;
+ texcoord.y += 0.5f + options.padding;
+ extents = max(extents, texcoord);
}
chartExtents[c] = extents;
- // Sort charts by perimeter.
- chartOrderArray[c] = extents.x + extents.y;
+ chartOrderArray[c] = extents.x + extents.y; // Use perimeter for chart sort key.
minChartPerimeter = min(minChartPerimeter, chartOrderArray[c]);
maxChartPerimeter = max(maxChartPerimeter, chartOrderArray[c]);
}
@@ -7147,9 +7201,14 @@ struct Atlas
#else
const bool createImage = options.createImage;
#endif
- BitImage chartBitImage, chartBitImageRotated;
- int atlasWidth = 0, atlasHeight = 0;
- const bool resizableAtlas = !(options.resolution > 0 && options.texelsPerUnit > 0.0f);
+ // chartImage: result from conservative rasterization
+ // chartImageBilinear: chartImage plus any texels that would be sampled by bilinear filtering.
+ // chartImagePadding: either chartImage or chartImageBilinear depending on options, with a dilate filter applied options.padding times.
+ // Rotated versions swap x and y.
+ BitImage chartImage, chartImageBilinear, chartImagePadding;
+ BitImage chartImageRotated, chartImageBilinearRotated, chartImagePaddingRotated;
+ Array<Vector2i> atlasSizes;
+ atlasSizes.push_back(Vector2i(0, 0));
int progress = 0;
for (uint32_t i = 0; i < chartCount; i++) {
uint32_t c = ranks[chartCount - i - 1]; // largest chart first
@@ -7167,29 +7226,46 @@ struct Atlas
// V V V
// 0 1 2
XA_PROFILE_START(packChartsRasterize)
- // Leave room for padding.
- chartBitImage.resize(ftoi_ceil(chartExtents[c].x) + 1 + options.padding * 2, ftoi_ceil(chartExtents[c].y) + 1 + options.padding * 2, true);
+ // Resize and clear (discard = true) chart images.
+ // Leave room for padding at extents.
+ chartImage.resize(ftoi_ceil(chartExtents[c].x) + options.padding, ftoi_ceil(chartExtents[c].y) + options.padding, true);
if (chart->allowRotate)
- chartBitImageRotated.resize(chartBitImage.height(), chartBitImage.width(), true);
+ chartImageRotated.resize(chartImage.height(), chartImage.width(), true);
+ if (options.bilinear) {
+ chartImageBilinear.resize(chartImage.width(), chartImage.height(), true);
+ if (chart->allowRotate)
+ chartImageBilinearRotated.resize(chartImage.height(), chartImage.width(), true);
+ }
// Rasterize chart faces.
const uint32_t faceCount = chart->indexCount / 3;
for (uint32_t f = 0; f < faceCount; f++) {
- // Offset vertices by padding.
Vector2 vertices[3];
for (uint32_t v = 0; v < 3; v++)
- vertices[v] = chart->vertices[chart->indices[f * 3 + v]] + Vector2(0.5f) + Vector2(float(options.padding));
+ vertices[v] = chart->vertices[chart->indices[f * 3 + v]];
DrawTriangleCallbackArgs args;
- args.chartBitImage = &chartBitImage;
- args.chartBitImageRotated = chart->allowRotate ? &chartBitImageRotated : nullptr;
- raster::drawTriangle(Vector2((float)chartBitImage.width(), (float)chartBitImage.height()), vertices, drawTriangleCallback, &args);
- }
- // Expand chart by padding pixels. (dilation)
- BitImage chartBitImageNoPadding(chartBitImage), chartBitImageNoPaddingRotated(chartBitImageRotated);
+ args.chartBitImage = &chartImage;
+ args.chartBitImageRotated = chart->allowRotate ? &chartImageRotated : nullptr;
+ raster::drawTriangle(Vector2((float)chartImage.width(), (float)chartImage.height()), vertices, drawTriangleCallback, &args);
+ }
+ // Expand chart by pixels sampled by bilinear interpolation.
+ if (options.bilinear)
+ bilinearExpand(chart, &chartImage, &chartImageBilinear, chart->allowRotate ? &chartImageBilinearRotated : nullptr);
+ // Expand chart by padding pixels (dilation).
if (options.padding > 0) {
+ // Copy into the same BitImage instances for every chart to avoid reallocating BitImage buffers (largest chart is packed first).
XA_PROFILE_START(packChartsDilate)
- chartBitImage.dilate(options.padding);
- if (chart->allowRotate)
- chartBitImageRotated.dilate(options.padding);
+ if (options.bilinear)
+ chartImageBilinear.copyTo(chartImagePadding);
+ else
+ chartImage.copyTo(chartImagePadding);
+ chartImagePadding.dilate(options.padding);
+ if (chart->allowRotate) {
+ if (options.bilinear)
+ chartImageBilinearRotated.copyTo(chartImagePaddingRotated);
+ else
+ chartImageRotated.copyTo(chartImagePaddingRotated);
+ chartImagePaddingRotated.dilate(options.padding);
+ }
XA_PROFILE_END(packChartsDilate)
}
XA_PROFILE_END(packChartsRasterize)
@@ -7203,6 +7279,17 @@ struct Atlas
}
}
// Find a location to place the chart in the atlas.
+ BitImage *chartImageToPack, *chartImageToPackRotated;
+ if (options.padding > 0) {
+ chartImageToPack = &chartImagePadding;
+ chartImageToPackRotated = &chartImagePaddingRotated;
+ } else if (options.bilinear) {
+ chartImageToPack = &chartImageBilinear;
+ chartImageToPackRotated = &chartImageBilinearRotated;
+ } else {
+ chartImageToPack = &chartImage;
+ chartImageToPackRotated = &chartImageRotated;
+ }
uint32_t currentAtlas = 0;
int best_x = 0, best_y = 0;
int best_cw = 0, best_ch = 0;
@@ -7210,27 +7297,24 @@ struct Atlas
for (;;)
{
bool firstChartInBitImage = false;
+ XA_UNUSED(firstChartInBitImage);
if (currentAtlas + 1 > m_bitImages.size()) {
// Chart doesn't fit in the current bitImage, create a new one.
- BitImage *bi = XA_NEW(MemTag::Default, BitImage);
- bi->resize(resolution, resolution, true);
+ BitImage *bi = XA_NEW_ARGS(MemTag::Default, BitImage, resolution, resolution);
m_bitImages.push_back(bi);
+ atlasSizes.push_back(Vector2i(0, 0));
firstChartInBitImage = true;
if (createImage)
- m_atlasImages.push_back(XA_NEW(MemTag::Default, AtlasImage, resolution, resolution));
+ m_atlasImages.push_back(XA_NEW_ARGS(MemTag::Default, AtlasImage, resolution, resolution));
// Start positions are per-atlas, so create a new one of those too.
chartStartPositions.push_back(Vector2i(0, 0));
}
XA_PROFILE_START(packChartsFindLocation)
- const bool foundLocation = findChartLocation(taskScheduler, chartStartPositions[currentAtlas], options.bruteForce, m_bitImages[currentAtlas], &chartBitImage, &chartBitImageRotated, atlasWidth, atlasHeight, &best_x, &best_y, &best_cw, &best_ch, &best_r, options.blockAlign, resizableAtlas, chart->allowRotate);
+ const bool foundLocation = findChartLocation(taskScheduler, chartStartPositions[currentAtlas], options.bruteForce, m_bitImages[currentAtlas], chartImageToPack, chartImageToPackRotated, atlasSizes[currentAtlas].x, atlasSizes[currentAtlas].y, &best_x, &best_y, &best_cw, &best_ch, &best_r, options.blockAlign, maxResolution, chart->allowRotate);
XA_PROFILE_END(packChartsFindLocation)
- if (firstChartInBitImage && !foundLocation) {
- // Chart doesn't fit in an empty, newly allocated bitImage. texelsPerUnit must be too large for the resolution.
- XA_ASSERT(true && "chart doesn't fit");
- break;
- }
- if (resizableAtlas) {
- XA_DEBUG_ASSERT(foundLocation);
+ XA_DEBUG_ASSERT(!(firstChartInBitImage && !foundLocation)); // Chart doesn't fit in an empty, newly allocated bitImage. Shouldn't happen, since charts are resized if they are too big to fit in the atlas.
+ if (maxResolution == 0) {
+ XA_DEBUG_ASSERT(foundLocation); // The atlas isn't limited to a fixed resolution, a chart location should be found on the first attempt.
break;
}
if (foundLocation)
@@ -7241,7 +7325,7 @@ struct Atlas
// Update brute force start location.
if (options.bruteForce) {
// Reset start location if the chart expanded the atlas.
- if (best_x + best_cw > atlasWidth || best_y + best_ch > atlasHeight) {
+ if (best_x + best_cw > atlasSizes[currentAtlas].x || best_y + best_ch > atlasSizes[currentAtlas].y) {
for (uint32_t j = 0; j < chartStartPositions.size(); j++)
chartStartPositions[j] = Vector2i(0, 0);
}
@@ -7250,28 +7334,37 @@ struct Atlas
}
}
// Update parametric extents.
- atlasWidth = max(atlasWidth, best_x + best_cw);
- atlasHeight = max(atlasHeight, best_y + best_ch);
- if (resizableAtlas) {
- // Resize bitImage if necessary.
- if (uint32_t(atlasWidth) > m_bitImages[0]->width() || uint32_t(atlasHeight) > m_bitImages[0]->height()) {
- m_bitImages[0]->resize(nextPowerOfTwo(uint32_t(atlasWidth)), nextPowerOfTwo(uint32_t(atlasHeight)), false);
+ atlasSizes[currentAtlas].x = max(atlasSizes[currentAtlas].x, best_x + best_cw);
+ atlasSizes[currentAtlas].y = max(atlasSizes[currentAtlas].y, best_y + best_ch);
+ // Resize bitImage if necessary.
+ // If maxResolution > 0, the bitImage is always set to maxResolutionIncludingPadding on creation and doesn't need to be dynamically resized.
+ if (maxResolution == 0) {
+ const uint32_t w = (uint32_t)atlasSizes[currentAtlas].x;
+ const uint32_t h = (uint32_t)atlasSizes[currentAtlas].y;
+ if (w > m_bitImages[0]->width() || h > m_bitImages[0]->height()) {
+ m_bitImages[0]->resize(nextPowerOfTwo(w), nextPowerOfTwo(h), false);
if (createImage)
m_atlasImages[0]->resize(m_bitImages[0]->width(), m_bitImages[0]->height());
}
} else {
- atlasWidth = min((int)options.resolution, atlasWidth);
- atlasHeight = min((int)options.resolution, atlasHeight);
+ XA_DEBUG_ASSERT(atlasSizes[currentAtlas].x <= (int)maxResolution);
+ XA_DEBUG_ASSERT(atlasSizes[currentAtlas].y <= (int)maxResolution);
}
XA_PROFILE_START(packChartsBlit)
- addChart(m_bitImages[currentAtlas], &chartBitImage, &chartBitImageRotated, atlasWidth, atlasHeight, best_x, best_y, best_r);
+ addChart(m_bitImages[currentAtlas], chartImageToPack, chartImageToPackRotated, atlasSizes[currentAtlas].x, atlasSizes[currentAtlas].y, best_x, best_y, best_r);
XA_PROFILE_END(packChartsBlit)
if (createImage) {
- m_atlasImages[currentAtlas]->addChart(c, best_r == 0 ? &chartBitImageNoPadding : &chartBitImageNoPaddingRotated, false, atlasWidth, atlasHeight, best_x, best_y);
- m_atlasImages[currentAtlas]->addChart(c, best_r == 0 ? &chartBitImage : &chartBitImageRotated, true, atlasWidth, atlasHeight, best_x, best_y);
+ if (best_r == 0) {
+ m_atlasImages[currentAtlas]->addChart(c, &chartImage, options.bilinear ? &chartImageBilinear : nullptr, options.padding > 0 ? &chartImagePadding : nullptr, atlasSizes[currentAtlas].x, atlasSizes[currentAtlas].y, best_x, best_y);
+ } else {
+ m_atlasImages[currentAtlas]->addChart(c, &chartImageRotated, options.bilinear ? &chartImageBilinearRotated : nullptr, options.padding > 0 ? &chartImagePaddingRotated : nullptr, atlasSizes[currentAtlas].x, atlasSizes[currentAtlas].y, best_x, best_y);
+ }
}
chart->atlasIndex = (int32_t)currentAtlas;
- // Translate and rotate chart texture coordinates.
+ // Modify texture coordinates:
+ // - rotate if the chart should be rotated
+ // - translate to chart location
+ // - translate to remove padding from top and left atlas edges (unless block aligned)
for (uint32_t v = 0; v < chart->uniqueVertexCount(); v++) {
Vector2 &texcoord = chart->uniqueVertexAt(v);
Vector2 t = texcoord;
@@ -7279,8 +7372,12 @@ struct Atlas
XA_DEBUG_ASSERT(chart->allowRotate);
swap(t.x, t.y);
}
- texcoord.x = best_x + t.x + 0.5f;
- texcoord.y = best_y + t.y + 0.5f;
+ texcoord.x = best_x + t.x;
+ texcoord.y = best_y + t.y;
+ if (!options.blockAlign) {
+ texcoord.x -= (float)options.padding;
+ texcoord.y -= (float)options.padding;
+ }
XA_ASSERT(texcoord.x >= 0 && texcoord.y >= 0);
XA_ASSERT(isFinite(texcoord.x) && isFinite(texcoord.y));
}
@@ -7293,21 +7390,35 @@ struct Atlas
}
}
}
- if (resizableAtlas) {
- m_width = max(0, atlasWidth - (int)options.padding * 2);
- m_height = max(0, atlasHeight - (int)options.padding * 2);
+ if (options.blockAlign) {
+ if (maxResolution == 0) {
+ m_width = max(0, atlasSizes[0].x);
+ m_height = max(0, atlasSizes[0].y);
+ } else {
+ m_width = m_height = maxResolution;
+ }
} else {
- m_width = m_height = options.resolution;
+ // Remove padding from outer edges.
+ if (maxResolution == 0) {
+ m_width = max(0, atlasSizes[0].x - (int)options.padding * 2);
+ m_height = max(0, atlasSizes[0].y - (int)options.padding * 2);
+ } else {
+ m_width = m_height = maxResolution - (int)options.padding * 2;
+ }
}
XA_PRINT(" %dx%d resolution\n", m_width, m_height);
m_utilization.resize(m_bitImages.size());
for (uint32_t i = 0; i < m_utilization.size(); i++) {
- uint32_t count = 0;
- for (uint32_t y = 0; y < m_height; y++) {
- for (uint32_t x = 0; x < m_width; x++)
- count += m_bitImages[i]->bitAt(x, y);
+ if (m_width == 0 || m_height == 0)
+ m_utilization[i] = 0.0f;
+ else {
+ uint32_t count = 0;
+ for (uint32_t y = 0; y < m_height; y++) {
+ for (uint32_t x = 0; x < m_width; x++)
+ count += m_bitImages[i]->bitAt(x, y);
+ }
+ m_utilization[i] = float(count) / (m_width * m_height);
}
- m_utilization[i] = float(count) / (m_width * m_height);
if (m_utilization.size() > 1) {
XA_PRINT(" %u: %f%% utilization\n", i, m_utilization[i] * 100.0f);
}
@@ -7334,27 +7445,33 @@ private:
// is occupied at this point. At the end we have many small charts and a large atlas with sparse holes. Finding those holes randomly is slow. A better approach would be to
// start stacking large charts as if they were tetris pieces. Once charts get small try to place them randomly. It may be interesting to try a intermediate strategy, first try
// along one axis and then try exhaustively along that axis.
- bool findChartLocation(TaskScheduler *taskScheduler, const Vector2i &startPosition, bool bruteForce, const BitImage *atlasBitImage, const BitImage *chartBitImage, const BitImage *chartBitImageRotated, int w, int h, int *best_x, int *best_y, int *best_w, int *best_h, int *best_r, bool blockAligned, bool resizableAtlas, bool allowRotate)
+ bool findChartLocation(TaskScheduler *taskScheduler, const Vector2i &startPosition, bool bruteForce, const BitImage *atlasBitImage, const BitImage *chartBitImage, const BitImage *chartBitImageRotated, int w, int h, int *best_x, int *best_y, int *best_w, int *best_h, int *best_r, bool blockAligned, uint32_t maxResolution, bool allowRotate)
{
const int attempts = 4096;
if (bruteForce || attempts >= w * h)
- return findChartLocation_bruteForce(taskScheduler, startPosition, atlasBitImage, chartBitImage, chartBitImageRotated, w, h, best_x, best_y, best_w, best_h, best_r, blockAligned, resizableAtlas, allowRotate);
- return findChartLocation_random(atlasBitImage, chartBitImage, chartBitImageRotated, w, h, best_x, best_y, best_w, best_h, best_r, attempts, blockAligned, resizableAtlas, allowRotate);
+ return findChartLocation_bruteForce(taskScheduler, startPosition, atlasBitImage, chartBitImage, chartBitImageRotated, w, h, best_x, best_y, best_w, best_h, best_r, blockAligned, maxResolution, allowRotate);
+ return findChartLocation_random(atlasBitImage, chartBitImage, chartBitImageRotated, w, h, best_x, best_y, best_w, best_h, best_r, attempts, blockAligned, maxResolution, allowRotate);
}
- bool findChartLocation_bruteForce(TaskScheduler *taskScheduler, const Vector2i &startPosition, const BitImage *atlasBitImage, const BitImage *chartBitImage, const BitImage *chartBitImageRotated, int w, int h, int *best_x, int *best_y, int *best_w, int *best_h, int *best_r, bool blockAligned, bool resizableAtlas, bool allowRotate)
+ bool findChartLocation_bruteForce(TaskScheduler *taskScheduler, const Vector2i &startPosition, const BitImage *atlasBitImage, const BitImage *chartBitImage, const BitImage *chartBitImageRotated, int w, int h, int *best_x, int *best_y, int *best_w, int *best_h, int *best_r, bool blockAligned, uint32_t maxResolution, bool allowRotate)
{
const int stepSize = blockAligned ? 4 : 1;
+ const int chartMinHeight = min(chartBitImage->height(), chartBitImageRotated->height());
uint32_t taskCount = 0;
- for (int y = startPosition.y; y <= h + stepSize; y += stepSize)
+ for (int y = startPosition.y; y <= h + stepSize; y += stepSize) {
+ if (maxResolution > 0 && y > (int)maxResolution - chartMinHeight)
+ break;
taskCount++;
- Array<FindChartLocationBruteForceTaskArgs> taskArgs;
- taskArgs.resize(taskCount);
+ }
+ m_bruteForceTaskArgs.clear();
+ m_bruteForceTaskArgs.resize(taskCount);
TaskGroupHandle taskGroup = taskScheduler->createTaskGroup(taskCount);
std::atomic<bool> finished(false); // One of the tasks found a location that doesn't expand the atlas.
uint32_t i = 0;
for (int y = startPosition.y; y <= h + stepSize; y += stepSize) {
- FindChartLocationBruteForceTaskArgs &args = taskArgs[i];
+ if (maxResolution > 0 && y > (int)maxResolution - chartMinHeight)
+ break;
+ FindChartLocationBruteForceTaskArgs &args = m_bruteForceTaskArgs[i];
args.finished = &finished;
args.startPosition = Vector2i(y == startPosition.y ? startPosition.x : 0, y);
args.atlasBitImage = atlasBitImage;
@@ -7363,10 +7480,10 @@ private:
args.w = w;
args.h = h;
args.blockAligned = blockAligned;
- args.resizableAtlas = resizableAtlas;
args.allowRotate = allowRotate;
+ args.maxResolution = maxResolution;
Task task;
- task.userData = &taskArgs[i];
+ task.userData = &m_bruteForceTaskArgs[i];
task.func = runFindChartLocationBruteForceTask;
taskScheduler->run(taskGroup, task);
i++;
@@ -7376,7 +7493,7 @@ private:
int best_metric = INT_MAX;
bool best_insideAtlas = false;
for (i = 0; i < taskCount; i++) {
- FindChartLocationBruteForceTaskArgs &args = taskArgs[i];
+ FindChartLocationBruteForceTaskArgs &args = m_bruteForceTaskArgs[i];
if (args.best_metric > best_metric)
continue;
// A location that doesn't expand the atlas is always preferred.
@@ -7396,7 +7513,7 @@ private:
return best_metric != INT_MAX;
}
- bool findChartLocation_random(const BitImage *atlasBitImage, const BitImage *chartBitImage, const BitImage *chartBitImageRotated, int w, int h, int *best_x, int *best_y, int *best_w, int *best_h, int *best_r, int minTrialCount, bool blockAligned, bool resizableAtlas, bool allowRotate)
+ bool findChartLocation_random(const BitImage *atlasBitImage, const BitImage *chartBitImage, const BitImage *chartBitImageRotated, int w, int h, int *best_x, int *best_y, int *best_w, int *best_h, int *best_r, int minTrialCount, bool blockAligned, uint32_t maxResolution, bool allowRotate)
{
bool result = false;
const int BLOCK_SIZE = 4;
@@ -7410,16 +7527,17 @@ private:
// + 1 to extend atlas in case atlas full. We may want to use a higher number to increase probability of extending atlas.
int xRange = w + 1;
int yRange = h + 1;
- if (!resizableAtlas) {
- xRange = min(xRange, (int)atlasBitImage->width() - cw);
- yRange = min(yRange, (int)atlasBitImage->height() - ch);
+ // Clamp to max resolution.
+ if (maxResolution > 0) {
+ xRange = min(xRange, (int)maxResolution - cw);
+ yRange = min(yRange, (int)maxResolution - ch);
}
int x = m_rand.getRange(xRange);
int y = m_rand.getRange(yRange);
if (blockAligned) {
x = align(x, BLOCK_SIZE);
y = align(y, BLOCK_SIZE);
- if (!resizableAtlas && (x > (int)atlasBitImage->width() - cw || y > (int)atlasBitImage->height() - ch))
+ if (maxResolution > 0 && (x > (int)maxResolution - cw || y > (int)maxResolution - ch))
continue; // Block alignment pushed the chart outside the atlas.
}
// Early out.
@@ -7475,10 +7593,68 @@ private:
}
}
+ void bilinearExpand(const Chart *chart, BitImage *source, BitImage *dest, BitImage *destRotated) const
+ {
+ const int xOffsets[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
+ const int yOffsets[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
+ for (uint32_t y = 0; y < source->height(); y++) {
+ for (uint32_t x = 0; x < source->width(); x++) {
+ // Copy pixels from source.
+ if (source->bitAt(x, y))
+ goto setPixel;
+ // Empty pixel. If none of of the surrounding pixels are set, this pixel can't be sampled by bilinear interpolation.
+ {
+ uint32_t s = 0;
+ for (; s < 8; s++) {
+ const int sx = (int)x + xOffsets[s];
+ const int sy = (int)y + yOffsets[s];
+ if (sx < 0 || sy < 0 || sx >= (int)source->width() || sy >= (int)source->height())
+ continue;
+ if (source->bitAt((uint32_t)sx, (uint32_t)sy))
+ break;
+ }
+ if (s == 8)
+ continue;
+ }
+ // If a 2x2 square centered on the pixels centroid intersects the triangle, this pixel will be sampled by bilinear interpolation.
+ // See "Precomputed Global Illumination in Frostbite (GDC 2018)" page 95
+ for (uint32_t f = 0; f < chart->indexCount / 3; f++) {
+ const Vector2 centroid((float)x + 0.5f, (float)y + 0.5f);
+ Vector2 vertices[3];
+ for (uint32_t i = 0; i < 3; i++)
+ vertices[i] = chart->vertices[chart->indices[f * 3 + i]];
+ // Test for triangle vertex in square bounds.
+ for (uint32_t i = 0; i < 3; i++) {
+ const Vector2 &v = vertices[i];
+ if (v.x > centroid.x - 1.0f && v.x < centroid.x + 1.0f && v.y > centroid.y - 1.0f && v.y < centroid.y + 1.0f)
+ goto setPixel;
+ }
+ // Test for triangle edge intersection with square edge.
+ const Vector2 squareVertices[4] = {
+ Vector2(centroid.x - 1.0f, centroid.y - 1.0f),
+ Vector2(centroid.x + 1.0f, centroid.y - 1.0f),
+ Vector2(centroid.x + 1.0f, centroid.y + 1.0f),
+ Vector2(centroid.x - 1.0f, centroid.y + 1.0f)
+ };
+ for (uint32_t i = 0; i < 3; i++) {
+ for (uint32_t j = 0; j < 4; j++) {
+ if (linesIntersect(vertices[i], vertices[(i + 1) % 3], squareVertices[j], squareVertices[(j + 1) % 4], 0.0f))
+ goto setPixel;
+ }
+ }
+ }
+ continue;
+ setPixel:
+ dest->setBitAt(x, y);
+ if (destRotated)
+ destRotated->setBitAt(y, x);
+ }
+ }
+ }
+
struct DrawTriangleCallbackArgs
{
- BitImage *chartBitImage;
- BitImage *chartBitImageRotated;
+ BitImage *chartBitImage, *chartBitImageRotated;
};
static bool drawTriangleCallback(void *param, int x, int y)
@@ -7493,8 +7669,8 @@ private:
Array<AtlasImage *> m_atlasImages;
Array<float> m_utilization;
Array<BitImage *> m_bitImages;
- BoundingBox2D m_boundingBox;
Array<Chart *> m_charts;
+ Array<FindChartLocationBruteForceTaskArgs> m_bruteForceTaskArgs;
RadixSort m_radix;
uint32_t m_width = 0;
uint32_t m_height = 0;
@@ -7534,8 +7710,8 @@ static void DestroyOutputMeshes(Context *ctx)
for (int i = 0; i < (int)ctx->atlas.meshCount; i++) {
Mesh &mesh = ctx->atlas.meshes[i];
for (uint32_t j = 0; j < mesh.chartCount; j++) {
- if (mesh.chartArray[j].indexArray)
- XA_FREE(mesh.chartArray[j].indexArray);
+ if (mesh.chartArray[j].faceArray)
+ XA_FREE(mesh.chartArray[j].faceArray);
}
if (mesh.chartArray)
XA_FREE(mesh.chartArray);
@@ -7715,18 +7891,19 @@ AddMeshError::Enum AddMesh(Atlas *atlas, const MeshDecl &meshDecl, uint32_t mesh
#endif
// Don't know how many times AddMesh will be called, so progress needs to adjusted each time.
if (!ctx->addMeshProgress) {
- ctx->addMeshProgress = XA_NEW(internal::MemTag::Default, internal::Progress, ProgressCategory::AddMesh, ctx->progressFunc, ctx->progressUserData, 1);
+ ctx->addMeshProgress = XA_NEW_ARGS(internal::MemTag::Default, internal::Progress, ProgressCategory::AddMesh, ctx->progressFunc, ctx->progressUserData, 1);
}
else {
ctx->addMeshProgress->setMaxValue(internal::max(ctx->meshCount + 1, meshCountHint));
}
- bool decoded = (meshDecl.indexCount <= 0);
- uint32_t indexCount = decoded ? meshDecl.vertexCount : meshDecl.indexCount;
+ XA_PROFILE_START(addMeshCopyData)
+ const bool hasIndices = meshDecl.indexCount > 0;
+ const uint32_t indexCount = hasIndices ? meshDecl.indexCount : meshDecl.vertexCount;
XA_PRINT("Adding mesh %d: %u vertices, %u triangles\n", ctx->meshCount, meshDecl.vertexCount, indexCount / 3);
// Expecting triangle faces.
if ((indexCount % 3) != 0)
return AddMeshError::InvalidIndexCount;
- if (!decoded) {
+ if (hasIndices) {
// Check if any index is out of range.
for (uint32_t i = 0; i < indexCount; i++) {
const uint32_t index = DecodeIndex(meshDecl.indexFormat, meshDecl.indexData, meshDecl.indexOffset, i);
@@ -7737,7 +7914,7 @@ AddMeshError::Enum AddMesh(Atlas *atlas, const MeshDecl &meshDecl, uint32_t mesh
uint32_t meshFlags = internal::MeshFlags::HasFaceGroups | internal::MeshFlags::HasIgnoredFaces;
if (meshDecl.vertexNormalData)
meshFlags |= internal::MeshFlags::HasNormals;
- internal::Mesh *mesh = XA_NEW(internal::MemTag::Mesh, internal::Mesh, meshDecl.epsilon, meshDecl.vertexCount, indexCount / 3, meshFlags, ctx->meshCount);
+ internal::Mesh *mesh = XA_NEW_ARGS(internal::MemTag::Mesh, internal::Mesh, meshDecl.epsilon, meshDecl.vertexCount, indexCount / 3, meshFlags, ctx->meshCount);
for (uint32_t i = 0; i < meshDecl.vertexCount; i++) {
internal::Vector3 normal(0.0f);
internal::Vector2 texcoord(0.0f);
@@ -7750,7 +7927,7 @@ AddMeshError::Enum AddMesh(Atlas *atlas, const MeshDecl &meshDecl, uint32_t mesh
for (uint32_t i = 0; i < indexCount / 3; i++) {
uint32_t tri[3];
for (int j = 0; j < 3; j++)
- tri[j] = decoded ? i * 3 + j : DecodeIndex(meshDecl.indexFormat, meshDecl.indexData, meshDecl.indexOffset, i * 3 + j);
+ tri[j] = hasIndices ? DecodeIndex(meshDecl.indexFormat, meshDecl.indexData, meshDecl.indexOffset, i * 3 + j) : i * 3 + j;
bool ignore = false;
// Check for degenerate or zero length edges.
for (int j = 0; j < 3; j++) {
@@ -7769,10 +7946,37 @@ AddMeshError::Enum AddMesh(Atlas *atlas, const MeshDecl &meshDecl, uint32_t mesh
break;
}
}
+ // Ignore faces with any nan vertex attributes.
+ if (!ignore) {
+ for (int j = 0; j < 3; j++) {
+ const internal::Vector3 &pos = mesh->position(tri[j]);
+ if (internal::isNan(pos.x) || internal::isNan(pos.y) || internal::isNan(pos.z)) {
+ XA_PRINT(" NAN position in face: %d\n", i);
+ ignore = true;
+ break;
+ }
+ if (meshDecl.vertexNormalData) {
+ const internal::Vector3 &normal = mesh->normal(tri[j]);
+ if (internal::isNan(normal.x) || internal::isNan(normal.y) || internal::isNan(normal.z)) {
+ XA_PRINT(" NAN normal in face: %d\n", i);
+ ignore = true;
+ break;
+ }
+ }
+ if (meshDecl.vertexUvData) {
+ const internal::Vector2 &uv = mesh->texcoord(tri[j]);
+ if (internal::isNan(uv.x) || internal::isNan(uv.y)) {
+ XA_PRINT(" NAN texture coordinate in face: %d\n", i);
+ ignore = true;
+ break;
+ }
+ }
+ }
+ }
const internal::Vector3 &a = mesh->position(tri[0]);
const internal::Vector3 &b = mesh->position(tri[1]);
const internal::Vector3 &c = mesh->position(tri[2]);
- // Check for zero area faces. Don't bother if a degenerate or zero length edge was already detected.
+ // Check for zero area faces.
float area = 0.0f;
if (!ignore) {
area = internal::length(internal::cross(b - a, c - a)) * 0.5f;
@@ -7791,6 +7995,7 @@ AddMeshError::Enum AddMesh(Atlas *atlas, const MeshDecl &meshDecl, uint32_t mesh
ignore = true;
mesh->addFace(tri[0], tri[1], tri[2], ignore);
}
+ XA_PROFILE_END(addMeshCopyData)
if (ctx->addMeshTaskGroup.value == UINT32_MAX)
ctx->addMeshTaskGroup = ctx->taskScheduler->createTaskGroup();
AddMeshTaskArgs *taskArgs = XA_NEW(internal::MemTag::Default, AddMeshTaskArgs); // The task frees this.
@@ -7818,11 +8023,13 @@ void AddMeshJoin(Atlas *atlas)
ctx->addMeshProgress->~Progress();
XA_FREE(ctx->addMeshProgress);
ctx->addMeshProgress = nullptr;
+ ctx->paramAtlas.sortChartGroups();
#if XA_PROFILE
XA_PRINT("Added %u meshes\n", ctx->meshCount);
internal::s_profile.addMeshReal = clock() - internal::s_profile.addMeshReal;
#endif
XA_PROFILE_PRINT_AND_RESET(" Total (real): ", addMeshReal)
+ XA_PROFILE_PRINT_AND_RESET(" Copy data: ", addMeshCopyData)
XA_PROFILE_PRINT_AND_RESET(" Total (thread): ", addMeshThread)
XA_PROFILE_PRINT_AND_RESET(" Create colocals: ", addMeshCreateColocals)
XA_PROFILE_PRINT_AND_RESET(" Create face groups: ", addMeshCreateFaceGroups)
@@ -7880,8 +8087,13 @@ AddMeshError::Enum AddUvMesh(Atlas *atlas, const UvMeshDecl &decl)
}
internal::UvMeshInstance *meshInstance = XA_NEW(internal::MemTag::Default, internal::UvMeshInstance);
meshInstance->texcoords.resize(decl.vertexCount);
- for (uint32_t i = 0; i < decl.vertexCount; i++)
- meshInstance->texcoords[i] = *((const internal::Vector2 *)&((const uint8_t *)decl.vertexUvData)[decl.vertexStride * i]);
+ for (uint32_t i = 0; i < decl.vertexCount; i++) {
+ internal::Vector2 texcoord = *((const internal::Vector2 *)&((const uint8_t *)decl.vertexUvData)[decl.vertexStride * i]);
+ // Set nan values to 0.
+ if (internal::isNan(texcoord.x) || internal::isNan(texcoord.y))
+ texcoord.x = texcoord.y = 0.0f;
+ meshInstance->texcoords[i] = texcoord;
+ }
meshInstance->rotateCharts = decl.rotateCharts;
// See if this is an instance of an already existing mesh.
internal::UvMesh *mesh = nullptr;
@@ -7902,13 +8114,12 @@ AddMeshError::Enum AddUvMesh(Atlas *atlas, const UvMeshDecl &decl)
for (uint32_t i = 0; i < mesh->vertexToChartMap.size(); i++)
mesh->vertexToChartMap[i] = UINT32_MAX;
// Calculate charts (incident faces).
- internal::HashMap<internal::Vector2, uint32_t> vertexToFaceMap(internal::MemTag::Default, indexCount);
+ internal::HashMap<internal::Vector2> vertexToFaceMap(internal::MemTag::Default, indexCount); // Face is index / 3
const uint32_t faceCount = indexCount / 3;
for (uint32_t i = 0; i < indexCount; i++)
- vertexToFaceMap.add(meshInstance->texcoords[mesh->indices[i]], i / 3);
+ vertexToFaceMap.add(meshInstance->texcoords[mesh->indices[i]]);
internal::BitArray faceAssigned(faceCount);
faceAssigned.clearAll();
- internal::Array<uint32_t> chartFaces;
for (uint32_t f = 0; f < faceCount; f++) {
if (faceAssigned.bitAt(f))
continue;
@@ -7917,34 +8128,33 @@ AddMeshError::Enum AddUvMesh(Atlas *atlas, const UvMeshDecl &decl)
chart->material = decl.faceMaterialData ? decl.faceMaterialData[f] : 0;
// Walk incident faces and assign them to the chart.
faceAssigned.setBitAt(f);
- chartFaces.clear();
- chartFaces.push_back(f);
+ chart->faces.push_back(f);
for (;;) {
bool newFaceAssigned = false;
- const uint32_t faceCount2 = chartFaces.size();
+ const uint32_t faceCount2 = chart->faces.size();
for (uint32_t f2 = 0; f2 < faceCount2; f2++) {
- const uint32_t face = chartFaces[f2];
+ const uint32_t face = chart->faces[f2];
for (uint32_t i = 0; i < 3; i++) {
const internal::Vector2 &texcoord = meshInstance->texcoords[meshInstance->mesh->indices[face * 3 + i]];
- uint32_t mapFaceIndex = vertexToFaceMap.get(texcoord);
- while (mapFaceIndex != UINT32_MAX) {
- const uint32_t face2 = vertexToFaceMap.value(mapFaceIndex);
+ uint32_t mapIndex = vertexToFaceMap.get(texcoord);
+ while (mapIndex != UINT32_MAX) {
+ const uint32_t face2 = mapIndex / 3; // 3 vertices added per face.
// Materials must match.
if (!faceAssigned.bitAt(face2) && (!decl.faceMaterialData || decl.faceMaterialData[face] == decl.faceMaterialData[face2])) {
faceAssigned.setBitAt(face2);
- chartFaces.push_back(face2);
+ chart->faces.push_back(face2);
newFaceAssigned = true;
}
- mapFaceIndex = vertexToFaceMap.getNext(mapFaceIndex);
+ mapIndex = vertexToFaceMap.getNext(mapIndex);
}
}
}
if (!newFaceAssigned)
break;
}
- for (uint32_t i = 0; i < chartFaces.size(); i++) {
+ for (uint32_t i = 0; i < chart->faces.size(); i++) {
for (uint32_t j = 0; j < 3; j++) {
- const uint32_t vertex = meshInstance->mesh->indices[chartFaces[i] * 3 + j];
+ const uint32_t vertex = meshInstance->mesh->indices[chart->faces[i] * 3 + j];
chart->indices.push_back(vertex);
mesh->vertexToChartMap[vertex] = mesh->charts.size();
}
@@ -8019,11 +8229,14 @@ void ComputeCharts(Atlas *atlas, ChartOptions chartOptions)
XA_PRINT(" %u charts\n", chartCount);
XA_PROFILE_PRINT_AND_RESET(" Total (real): ", computeChartsReal)
XA_PROFILE_PRINT_AND_RESET(" Total (thread): ", computeChartsThread)
- XA_PROFILE_PRINT_AND_RESET(" Atlas builder: ", atlasBuilder)
- XA_PROFILE_PRINT_AND_RESET(" Init: ", atlasBuilderInit)
- XA_PROFILE_PRINT_AND_RESET(" Create initial charts: ", atlasBuilderCreateInitialCharts)
- XA_PROFILE_PRINT_AND_RESET(" Grow charts: ", atlasBuilderGrowCharts)
- XA_PROFILE_PRINT_AND_RESET(" Merge charts: ", atlasBuilderMergeCharts)
+ XA_PROFILE_PRINT_AND_RESET(" Build atlas: ", buildAtlas)
+ XA_PROFILE_PRINT_AND_RESET(" Init: ", buildAtlasInit)
+ XA_PROFILE_PRINT_AND_RESET(" Place seeds: ", buildAtlasPlaceSeeds)
+ XA_PROFILE_PRINT_AND_RESET(" Relocate seeds: ", buildAtlasRelocateSeeds)
+ XA_PROFILE_PRINT_AND_RESET(" Reset charts: ", buildAtlasResetCharts)
+ XA_PROFILE_PRINT_AND_RESET(" Grow charts: ", buildAtlasGrowCharts)
+ XA_PROFILE_PRINT_AND_RESET(" Merge charts: ", buildAtlasMergeCharts)
+ XA_PROFILE_PRINT_AND_RESET(" Fill holes: ", buildAtlasFillHoles)
XA_PROFILE_PRINT_AND_RESET(" Create chart meshes (real): ", createChartMeshesReal)
XA_PROFILE_PRINT_AND_RESET(" Create chart meshes (thread): ", createChartMeshesThread)
XA_PROFILE_PRINT_AND_RESET(" Fix t-junctions: ", fixChartMeshTJunctions)
@@ -8087,7 +8300,7 @@ void ParameterizeCharts(Atlas *atlas, ParameterizeFunc func)
XA_PRINT(" %u planar charts, %u ortho charts, %u other\n", planarChartsCount, orthoChartsCount, chartCount - (planarChartsCount + orthoChartsCount));
if (chartsDeletedCount > 0) {
XA_PRINT(" %u charts deleted due to invalid parameterizations, %u new charts added\n", chartsDeletedCount, chartsAddedCount);
- XA_PRINT(" %u charts\n", ctx->paramAtlas.chartCount());
+ XA_PRINT(" %u charts\n", chartCount);
}
uint32_t chartIndex = 0, invalidParamCount = 0;
for (uint32_t i = 0; i < ctx->meshCount; i++) {
@@ -8192,16 +8405,15 @@ void PackCharts(Atlas *atlas, PackOptions packOptions)
}
atlas->meshCount = 0;
// Pack charts.
+ XA_PROFILE_START(packChartsAddCharts)
internal::pack::Atlas packAtlas;
if (!ctx->uvMeshInstances.isEmpty()) {
for (uint32_t i = 0; i < ctx->uvMeshInstances.size(); i++)
packAtlas.addUvMeshCharts(ctx->uvMeshInstances[i]);
}
- else if (ctx->paramAtlas.chartCount() > 0) {
- ctx->paramAtlas.restoreOriginalChartTexcoords();
- for (uint32_t i = 0; i < ctx->paramAtlas.chartCount(); i++)
- packAtlas.addChart(ctx->paramAtlas.chartAt(i));
- }
+ else
+ packAtlas.addCharts(ctx->taskScheduler, &ctx->paramAtlas);
+ XA_PROFILE_END(packChartsAddCharts)
XA_PROFILE_START(packCharts)
if (!packAtlas.packCharts(ctx->taskScheduler, packOptions, ctx->progressFunc, ctx->progressUserData))
return;
@@ -8220,9 +8432,12 @@ void PackCharts(Atlas *atlas, PackOptions packOptions)
if (packOptions.createImage) {
atlas->image = XA_ALLOC_ARRAY(internal::MemTag::Default, uint32_t, atlas->atlasCount * atlas->width * atlas->height);
for (uint32_t i = 0; i < atlas->atlasCount; i++)
- packAtlas.getImages()[i]->copyTo(&atlas->image[atlas->width * atlas->height * i], atlas->width, atlas->height);
+ packAtlas.getImages()[i]->copyTo(&atlas->image[atlas->width * atlas->height * i], atlas->width, atlas->height, packOptions.blockAlign ? 0 : packOptions.padding);
}
XA_PROFILE_PRINT_AND_RESET(" Total: ", packCharts)
+ XA_PROFILE_PRINT_AND_RESET(" Add charts (real): ", packChartsAddCharts)
+ XA_PROFILE_PRINT_AND_RESET(" Add charts (thread): ", packChartsAddChartsThread)
+ XA_PROFILE_PRINT_AND_RESET(" Restore texcoords: ", packChartsAddChartsRestoreTexcoords)
XA_PROFILE_PRINT_AND_RESET(" Rasterize: ", packChartsRasterize)
XA_PROFILE_PRINT_AND_RESET(" Dilate (padding): ", packChartsDilate)
XA_PROFILE_PRINT_AND_RESET(" Find location (real): ", packChartsFindLocation)
@@ -8230,6 +8445,7 @@ void PackCharts(Atlas *atlas, PackOptions packOptions)
XA_PROFILE_PRINT_AND_RESET(" Blit: ", packChartsBlit)
XA_PRINT_MEM_USAGE
XA_PRINT("Building output meshes\n");
+ XA_PROFILE_START(buildOutputMeshes)
int progress = 0;
if (ctx->progressFunc) {
if (!ctx->progressFunc(ProgressCategory::BuildOutputMeshes, 0, ctx->progressUserData))
@@ -8265,8 +8481,7 @@ void PackCharts(Atlas *atlas, PackOptions packOptions)
outputMesh.chartArray = XA_ALLOC_ARRAY(internal::MemTag::Default, Chart, outputMesh.chartCount);
XA_PRINT(" mesh %u: %u vertices, %u triangles, %u charts\n", i, outputMesh.vertexCount, outputMesh.indexCount / 3, outputMesh.chartCount);
// Copy mesh data.
- uint32_t firstVertex = 0;
- uint32_t meshChartIndex = 0;
+ uint32_t firstVertex = 0, meshChartIndex = 0;
for (uint32_t cg = 0; cg < ctx->paramAtlas.chartGroupCount(i); cg++) {
const internal::param::ChartGroup *chartGroup = ctx->paramAtlas.chartGroupAt(i, cg);
if (chartGroup->isVertexMap()) {
@@ -8315,16 +8530,14 @@ void PackCharts(Atlas *atlas, PackOptions packOptions)
outputChart->flags = 0;
if (chart->paramQuality().boundaryIntersection || chart->paramQuality().flippedTriangleCount > 0)
outputChart->flags |= ChartFlags::Invalid;
- outputChart->indexCount = mesh->faceCount() * 3;
- outputChart->indexArray = XA_ALLOC_ARRAY(internal::MemTag::Default, uint32_t, outputChart->indexCount);
- for (uint32_t f = 0; f < mesh->faceCount(); f++) {
- for (uint32_t j = 0; j < 3; j++)
- outputChart->indexArray[3 * f + j] = firstVertex + mesh->vertexAt(f * 3 + j);
- }
+ outputChart->faceCount = mesh->faceCount();
+ outputChart->faceArray = XA_ALLOC_ARRAY(internal::MemTag::Default, uint32_t, outputChart->faceCount);
+ for (uint32_t f = 0; f < outputChart->faceCount; f++)
+ outputChart->faceArray[f] = chartGroup->mapFaceToSourceFace(chart->mapFaceToSourceFace(f));
outputChart->material = 0;
meshChartIndex++;
chartIndex++;
- firstVertex += chart->mesh()->vertexCount();
+ firstVertex += mesh->vertexCount();
}
}
}
@@ -8378,10 +8591,11 @@ void PackCharts(Atlas *atlas, PackOptions packOptions)
const internal::pack::Chart *chart = packAtlas.getChart(chartIndex);
XA_DEBUG_ASSERT(chart->atlasIndex >= 0);
outputChart->atlasIndex = (uint32_t)chart->atlasIndex;
- outputChart->indexCount = chart->indexCount;
- outputChart->indexArray = XA_ALLOC_ARRAY(internal::MemTag::Default, uint32_t, outputChart->indexCount);
+ outputChart->faceCount = chart->faces.size();
+ outputChart->faceArray = XA_ALLOC_ARRAY(internal::MemTag::Default, uint32_t, outputChart->faceCount);
outputChart->material = chart->material;
- memcpy(outputChart->indexArray, chart->indices, chart->indexCount * sizeof(uint32_t));
+ for (uint32_t f = 0; f < outputChart->faceCount; f++)
+ outputChart->faceArray[f] = chart->faces[f];
chartIndex++;
}
if (ctx->progressFunc) {
@@ -8396,6 +8610,8 @@ void PackCharts(Atlas *atlas, PackOptions packOptions)
}
if (ctx->progressFunc && progress != 100)
ctx->progressFunc(ProgressCategory::BuildOutputMeshes, 100, ctx->progressUserData);
+ XA_PROFILE_END(buildOutputMeshes)
+ XA_PROFILE_PRINT_AND_RESET(" Total: ", buildOutputMeshes)
XA_PRINT_MEM_USAGE
}
@@ -8430,9 +8646,10 @@ void SetProgressCallback(Atlas *atlas, ProgressFunc progressFunc, void *progress
ctx->progressUserData = progressUserData;
}
-void SetRealloc(ReallocFunc reallocFunc)
+void SetAlloc(ReallocFunc reallocFunc, FreeFunc freeFunc)
{
internal::s_realloc = reallocFunc;
+ internal::s_free = freeFunc;
}
void SetPrint(PrintFunc print, bool verbose)
diff --git a/thirdparty/xatlas/xatlas.h b/thirdparty/xatlas/xatlas.h
index c123e800b4..7be165e7e5 100644
--- a/thirdparty/xatlas/xatlas.h
+++ b/thirdparty/xatlas/xatlas.h
@@ -48,8 +48,8 @@ struct Chart
{
uint32_t atlasIndex; // Sub-atlas index.
uint32_t flags;
- uint32_t *indexArray;
- uint32_t indexCount;
+ uint32_t *faceArray;
+ uint32_t faceCount;
uint32_t material;
};
@@ -73,9 +73,10 @@ struct Mesh
uint32_t vertexCount;
};
-static const uint32_t kImageChartIndexMask = 0x3FFFFFFF;
-static const uint32_t kImageHasChartIndexBit = 0x40000000;
-static const uint32_t kImageIsPaddingBit = 0x80000000;
+static const uint32_t kImageChartIndexMask = 0x1FFFFFFF;
+static const uint32_t kImageHasChartIndexBit = 0x80000000;
+static const uint32_t kImageIsBilinearBit = 0x40000000;
+static const uint32_t kImageIsPaddingBit = 0x20000000;
// Empty on creation. Populated after charts are packed.
struct Atlas
@@ -173,7 +174,6 @@ struct ChartOptions
float textureSeamMetricWeight = 0.5f;
float maxThreshold = 2.0f; // If total of all metrics * weights > maxThreshold, don't grow chart. Lower values result in more charts.
- uint32_t growFaceCount = 32; // Grow this many faces at a time.
uint32_t maxIterations = 1; // Number of iterations of the chart growing and seeding phases. Higher values result in better charts.
};
@@ -188,12 +188,24 @@ void ParameterizeCharts(Atlas *atlas, ParameterizeFunc func = nullptr);
struct PackOptions
{
+ // Leave space around charts for texels that would be sampled by bilinear filtering.
+ bool bilinear = true;
+
+ // Align charts to 4x4 blocks. Also improves packing speed, since there are fewer possible chart locations to consider.
+ bool blockAlign = false;
+
// Slower, but gives the best result. If false, use random chart placement.
bool bruteForce = false;
// Create Atlas::image
bool createImage = false;
+ // Charts larger than this will be scaled down. 0 means no limit.
+ uint32_t maxChartSize = 0;
+
+ // Number of pixels to pad charts with.
+ uint32_t padding = 0;
+
// Unit to texel scale. e.g. a 1x1 quad with texelsPerUnit of 32 will take up approximately 32x32 texels in the atlas.
// If 0, an estimated value will be calculated to approximately match the given resolution.
// If resolution is also 0, the estimated value will approximately match a 1024x1024 atlas.
@@ -203,15 +215,6 @@ struct PackOptions
// If not 0, and texelsPerUnit is not 0, generate one or more atlases with that exact resolution.
// If not 0, and texelsPerUnit is 0, texelsPerUnit is estimated to approximately match the resolution.
uint32_t resolution = 0;
-
- // Charts larger than this will be scaled down.
- uint32_t maxChartSize = 1024;
-
- // Align charts to 4x4 blocks. Also improves packing speed, since there are fewer possible chart locations to consider.
- bool blockAlign = false;
-
- // Number of pixels to pad charts with.
- uint32_t padding = 0;
};
// Call after ParameterizeCharts. Can be called multiple times to re-pack charts with different options.
@@ -240,7 +243,8 @@ void SetProgressCallback(Atlas *atlas, ProgressFunc progressFunc = nullptr, void
// Custom memory allocation.
typedef void *(*ReallocFunc)(void *, size_t);
-void SetRealloc(ReallocFunc reallocFunc);
+typedef void (*FreeFunc)(void *);
+void SetAlloc(ReallocFunc reallocFunc, FreeFunc freeFunc = nullptr);
// Custom print function.
typedef int (*PrintFunc)(const char *, ...);
diff --git a/version.py b/version.py
index 09219f60ad..45817ed69f 100644
--- a/version.py
+++ b/version.py
@@ -2,7 +2,7 @@ short_name = "godot"
name = "Godot Engine"
major = 3
minor = 2
-status = "dev"
+status = "alpha"
module_config = ""
year = 2019
website = "https://godotengine.org"