diff options
Diffstat (limited to 'editor')
74 files changed, 2272 insertions, 1673 deletions
diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp index facd57418d..d3dff3f375 100644 --- a/editor/connections_dialog.cpp +++ b/editor/connections_dialog.cpp @@ -477,11 +477,6 @@ ConnectDialog::ConnectDialog() { advanced->set_text(TTR("Advanced")); advanced->connect("pressed", callable_mp(this, &ConnectDialog::_advanced_pressed)); - // Add spacing so the tree and inspector are the same size. - Control *spacing = memnew(Control); - spacing->set_custom_minimum_size(Size2(0, 4) * EDSCALE); - vbc_right->add_child(spacing); - deferred = memnew(CheckBox); deferred->set_h_size_flags(0); deferred->set_text(TTR("Deferred")); @@ -528,6 +523,10 @@ struct _ConnectionsDockMethodInfoSort { } }; +void ConnectionsDock::_filter_changed(const String &p_text) { + update_tree(); +} + /* * Post-ConnectDialog callback for creating/editing connections. * Creates or edits connections based on state of the ConnectDialog when "Connect" is pressed. @@ -903,6 +902,7 @@ void ConnectionsDock::update_tree() { String name; if (!did_script) { + // Get script signals (including signals from any base scripts). Ref<Script> scr = selectedNode->get_script(); if (scr.is_valid()) { scr->get_script_signal_list(&node_signals2); @@ -928,15 +928,16 @@ void ConnectionsDock::update_tree() { icon = get_theme_icon("Object", "EditorIcons"); } - TreeItem *pitem = nullptr; + TreeItem *section_item = nullptr; + // Create subsections. if (node_signals2.size()) { - pitem = tree->create_item(root); - pitem->set_text(0, name); - pitem->set_icon(0, icon); - pitem->set_selectable(0, false); - pitem->set_editable(0, false); - pitem->set_custom_bg_color(0, get_theme_color("prop_subsection", "Editor")); + section_item = tree->create_item(root); + section_item->set_text(0, name); + section_item->set_icon(0, icon); + section_item->set_selectable(0, false); + section_item->set_editable(0, false); + section_item->set_custom_bg_color(0, get_theme_color("prop_subsection", "Editor")); node_signals2.sort(); } @@ -946,6 +947,12 @@ void ConnectionsDock::update_tree() { StringName signal_name = mi.name; String signaldesc = "("; PackedStringArray argnames; + + String filter_text = search_box->get_text(); + if (!filter_text.is_subsequence_ofi(signal_name)) { + continue; + } + if (mi.arguments.size()) { for (int i = 0; i < mi.arguments.size(); i++) { PropertyInfo &pi = mi.arguments[i]; @@ -965,13 +972,14 @@ void ConnectionsDock::update_tree() { } signaldesc += ")"; - TreeItem *item = tree->create_item(pitem); - item->set_text(0, String(signal_name) + signaldesc); + // Create the children of the subsection - the actual list of signals. + TreeItem *signal_item = tree->create_item(section_item); + signal_item->set_text(0, String(signal_name) + signaldesc); Dictionary sinfo; sinfo["name"] = signal_name; sinfo["args"] = argnames; - item->set_metadata(0, sinfo); - item->set_icon(0, get_theme_icon("Signal", "EditorIcons")); + signal_item->set_metadata(0, sinfo); + signal_item->set_icon(0, get_theme_icon("Signal", "EditorIcons")); // Set tooltip with the signal's documentation. { @@ -1007,7 +1015,7 @@ void ConnectionsDock::update_tree() { } // "::" separators used in make_custom_tooltip for formatting. - item->set_tooltip(0, String(signal_name) + "::" + signaldesc + "::" + descr); + signal_item->set_tooltip(0, String(signal_name) + "::" + signaldesc + "::" + descr); } // List existing connections @@ -1044,11 +1052,11 @@ void ConnectionsDock::update_tree() { path += ")"; } - TreeItem *item2 = tree->create_item(item); - item2->set_text(0, path); + TreeItem *connection_item = tree->create_item(signal_item); + connection_item->set_text(0, path); Connection cd = c; - item2->set_metadata(0, cd); - item2->set_icon(0, get_theme_icon("Slot", "EditorIcons")); + connection_item->set_metadata(0, cd); + connection_item->set_icon(0, get_theme_icon("Slot", "EditorIcons")); } } @@ -1069,6 +1077,14 @@ ConnectionsDock::ConnectionsDock(EditorNode *p_editor) { VBoxContainer *vbc = this; + search_box = memnew(LineEdit); + search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); + search_box->set_placeholder(TTR("Filter signals")); + search_box->set_right_icon(get_theme_icon("Search", "EditorIcons")); + search_box->set_clear_button_enabled(true); + search_box->connect("text_changed", callable_mp(this, &ConnectionsDock::_filter_changed)); + vbc->add_child(search_box); + tree = memnew(ConnectionsDockTree); tree->set_columns(1); tree->set_select_mode(Tree::SELECT_ROW); diff --git a/editor/connections_dialog.h b/editor/connections_dialog.h index 9da9a8fb2c..48fdb91f5a 100644 --- a/editor/connections_dialog.h +++ b/editor/connections_dialog.h @@ -169,9 +169,12 @@ class ConnectionsDock : public VBoxContainer { PopupMenu *signal_menu; PopupMenu *slot_menu; UndoRedo *undo_redo; + LineEdit *search_box; Map<StringName, Map<StringName, String>> descr_cache; + void _filter_changed(const String &p_text); + void _make_or_edit_connection(); void _connect(ConnectDialog::ConnectionData cToMake); void _disconnect(TreeItem &item); diff --git a/editor/debugger/editor_debugger_node.cpp b/editor/debugger/editor_debugger_node.cpp index a9c18138d8..b461ac4f35 100644 --- a/editor/debugger/editor_debugger_node.cpp +++ b/editor/debugger/editor_debugger_node.cpp @@ -34,6 +34,7 @@ #include "editor/debugger/script_editor_debugger.h" #include "editor/editor_log.h" #include "editor/editor_node.h" +#include "editor/plugins/editor_debugger_plugin.h" #include "editor/plugins/script_editor_plugin.h" #include "scene/gui/menu_button.h" #include "scene/gui/tab_container.h" @@ -114,6 +115,12 @@ ScriptEditorDebugger *EditorDebuggerNode::_add_debugger() { tabs->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox("DebuggerPanel", "EditorStyles")); } + if (!debugger_plugins.empty()) { + for (Set<Ref<Script>>::Element *i = debugger_plugins.front(); i; i = i->next()) { + node->add_debugger_plugin(i->get()); + } + } + return node; } @@ -618,3 +625,23 @@ void EditorDebuggerNode::live_debug_reparent_node(const NodePath &p_at, const No dbg->live_debug_reparent_node(p_at, p_new_place, p_new_name, p_at_pos); }); } + +void EditorDebuggerNode::add_debugger_plugin(const Ref<Script> &p_script) { + ERR_FAIL_COND_MSG(debugger_plugins.has(p_script), "Debugger plugin already exists."); + ERR_FAIL_COND_MSG(p_script.is_null(), "Debugger plugin script is null"); + ERR_FAIL_COND_MSG(String(p_script->get_instance_base_type()) == "", "Debugger plugin script has error."); + ERR_FAIL_COND_MSG(String(p_script->get_instance_base_type()) != "EditorDebuggerPlugin", "Base type of debugger plugin is not 'EditorDebuggerPlugin'."); + ERR_FAIL_COND_MSG(!p_script->is_tool(), "Debugger plugin script is not in tool mode."); + debugger_plugins.insert(p_script); + for (int i = 0; get_debugger(i); i++) { + get_debugger(i)->add_debugger_plugin(p_script); + } +} + +void EditorDebuggerNode::remove_debugger_plugin(const Ref<Script> &p_script) { + ERR_FAIL_COND_MSG(!debugger_plugins.has(p_script), "Debugger plugin doesn't exists."); + debugger_plugins.erase(p_script); + for (int i = 0; get_debugger(i); i++) { + get_debugger(i)->remove_debugger_plugin(p_script); + } +} diff --git a/editor/debugger/editor_debugger_node.h b/editor/debugger/editor_debugger_node.h index ff9601c026..8d70a7f961 100644 --- a/editor/debugger/editor_debugger_node.h +++ b/editor/debugger/editor_debugger_node.h @@ -103,6 +103,8 @@ private: CameraOverride camera_override = OVERRIDE_NONE; Map<Breakpoint, bool> breakpoints; + Set<Ref<Script>> debugger_plugins; + ScriptEditorDebugger *_add_debugger(); EditorDebuggerRemoteObject *get_inspected_remote_object(); @@ -186,5 +188,8 @@ public: Error start(const String &p_protocol = "tcp://"); void stop(); + + void add_debugger_plugin(const Ref<Script> &p_script); + void remove_debugger_plugin(const Ref<Script> &p_script); }; #endif // EDITOR_DEBUGGER_NODE_H diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index 49bf068be7..1fca95b6da 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -44,6 +44,7 @@ #include "editor/editor_scale.h" #include "editor/editor_settings.h" #include "editor/plugins/canvas_item_editor_plugin.h" +#include "editor/plugins/editor_debugger_plugin.h" #include "editor/plugins/node_3d_editor_plugin.h" #include "editor/property_editor.h" #include "main/performance.h" @@ -701,7 +702,28 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da performance_profiler->update_monitors(monitors); } else { - WARN_PRINT("unknown message " + p_msg); + int colon_index = p_msg.find_char(':'); + ERR_FAIL_COND_MSG(colon_index < 1, "Invalid message received"); + + bool parsed = false; + const String cap = p_msg.substr(0, colon_index); + Map<StringName, Callable>::Element *element = captures.find(cap); + if (element) { + Callable &c = element->value(); + ERR_FAIL_COND_MSG(c.is_null(), "Invalid callable registered: " + cap); + Variant cmd = p_msg.substr(colon_index + 1), data = p_data; + const Variant *args[2] = { &cmd, &data }; + Variant retval; + Callable::CallError err; + c.call(args, 2, retval, err); + ERR_FAIL_COND_MSG(err.error != Callable::CallError::CALL_OK, "Error calling 'capture' to callable: " + Variant::get_callable_error_text(c, args, 2, err)); + ERR_FAIL_COND_MSG(retval.get_type() != Variant::BOOL, "Error calling 'capture' to callable: " + String(c) + ". Return type is not bool."); + parsed = retval; + } + + if (!parsed) { + WARN_PRINT("unknown message " + p_msg); + } } } @@ -847,6 +869,7 @@ void ScriptEditorDebugger::start(Ref<RemoteDebuggerPeer> p_peer) { tabs->set_current_tab(0); _set_reason_text(TTR("Debug session started."), MESSAGE_SUCCESS); _update_buttons_state(); + emit_signal("started"); } void ScriptEditorDebugger::_update_buttons_state() { @@ -1395,6 +1418,7 @@ void ScriptEditorDebugger::_bind_methods() { ClassDB::bind_method(D_METHOD("request_remote_object", "id"), &ScriptEditorDebugger::request_remote_object); ClassDB::bind_method(D_METHOD("update_remote_object", "id", "property", "value"), &ScriptEditorDebugger::update_remote_object); + ADD_SIGNAL(MethodInfo("started")); ADD_SIGNAL(MethodInfo("stopped")); ADD_SIGNAL(MethodInfo("stop_requested")); ADD_SIGNAL(MethodInfo("stack_frame_selected", PropertyInfo(Variant::INT, "frame"))); @@ -1408,6 +1432,43 @@ void ScriptEditorDebugger::_bind_methods() { ADD_SIGNAL(MethodInfo("remote_tree_updated")); } +void ScriptEditorDebugger::add_debugger_plugin(const Ref<Script> &p_script) { + if (!debugger_plugins.has(p_script)) { + EditorDebuggerPlugin *plugin = memnew(EditorDebuggerPlugin()); + plugin->attach_debugger(this); + plugin->set_script(p_script); + tabs->add_child(plugin); + debugger_plugins.insert(p_script, plugin); + } +} + +void ScriptEditorDebugger::remove_debugger_plugin(const Ref<Script> &p_script) { + if (debugger_plugins.has(p_script)) { + tabs->remove_child(debugger_plugins[p_script]); + debugger_plugins[p_script]->detach_debugger(false); + memdelete(debugger_plugins[p_script]); + debugger_plugins.erase(p_script); + } +} + +void ScriptEditorDebugger::send_message(const String &p_message, const Array &p_args) { + _put_msg(p_message, p_args); +} + +void ScriptEditorDebugger::register_message_capture(const StringName &p_name, const Callable &p_callable) { + ERR_FAIL_COND_MSG(has_capture(p_name), "Capture already registered: " + p_name); + captures.insert(p_name, p_callable); +} + +void ScriptEditorDebugger::unregister_message_capture(const StringName &p_name) { + ERR_FAIL_COND_MSG(!has_capture(p_name), "Capture not registered: " + p_name); + captures.erase(p_name); +} + +bool ScriptEditorDebugger::has_capture(const StringName &p_name) { + return captures.has(p_name); +} + ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { editor = p_editor; diff --git a/editor/debugger/script_editor_debugger.h b/editor/debugger/script_editor_debugger.h index 6e5699e929..56b34e8e8c 100644 --- a/editor/debugger/script_editor_debugger.h +++ b/editor/debugger/script_editor_debugger.h @@ -54,6 +54,7 @@ class EditorVisualProfiler; class EditorNetworkProfiler; class EditorPerformanceProfiler; class SceneDebuggerTree; +class EditorDebuggerPlugin; class ScriptEditorDebugger : public MarginContainer { GDCLASS(ScriptEditorDebugger, MarginContainer); @@ -146,6 +147,10 @@ private: EditorDebuggerNode::CameraOverride camera_override; + Map<Ref<Script>, EditorDebuggerPlugin *> debugger_plugins; + + Map<StringName, Callable> captures; + void _stack_dump_frame_selected(); void _file_selected(const String &p_file); @@ -253,6 +258,16 @@ public: bool is_skip_breakpoints(); virtual Size2 get_minimum_size() const override; + + void add_debugger_plugin(const Ref<Script> &p_script); + void remove_debugger_plugin(const Ref<Script> &p_script); + + void send_message(const String &p_message, const Array &p_args); + + void register_message_capture(const StringName &p_name, const Callable &p_callable); + void unregister_message_capture(const StringName &p_name); + bool has_capture(const StringName &p_name); + ScriptEditorDebugger(EditorNode *p_editor = nullptr); ~ScriptEditorDebugger(); }; diff --git a/editor/doc_data.cpp b/editor/doc_data.cpp index 75b16b4510..791b49319a 100644 --- a/editor/doc_data.cpp +++ b/editor/doc_data.cpp @@ -316,8 +316,7 @@ void DocData::generate(bool p_basic_types) { if (name == "ProjectSettings") { // Special case for project settings, so that settings are not taken from the current project's settings - if (E->get().name == "script" || - ProjectSettings::get_singleton()->get_order(E->get().name) >= ProjectSettings::NO_BUILTIN_ORDER_BASE) { + if (E->get().name == "script" || !ProjectSettings::get_singleton()->is_builtin_setting(E->get().name)) { continue; } if (E->get().usage & PROPERTY_USAGE_EDITOR) { diff --git a/editor/editor_about.cpp b/editor/editor_about.cpp index d99726c57c..aae476ccf4 100644 --- a/editor/editor_about.cpp +++ b/editor/editor_about.cpp @@ -155,12 +155,15 @@ EditorAbout::EditorAbout() { List<String> donor_sections; donor_sections.push_back(TTR("Platinum Sponsors")); donor_sections.push_back(TTR("Gold Sponsors")); + donor_sections.push_back(TTR("Silver Sponsors")); + donor_sections.push_back(TTR("Bronze Sponsors")); donor_sections.push_back(TTR("Mini Sponsors")); donor_sections.push_back(TTR("Gold Donors")); donor_sections.push_back(TTR("Silver Donors")); donor_sections.push_back(TTR("Bronze Donors")); - const char *const *donor_src[] = { DONORS_SPONSOR_PLAT, DONORS_SPONSOR_GOLD, - DONORS_SPONSOR_MINI, DONORS_GOLD, DONORS_SILVER, DONORS_BRONZE }; + const char *const *donor_src[] = { DONORS_SPONSOR_PLATINUM, DONORS_SPONSOR_GOLD, + DONORS_SPONSOR_SILVER, DONORS_SPONSOR_BRONZE, DONORS_SPONSOR_MINI, + DONORS_GOLD, DONORS_SILVER, DONORS_BRONZE }; tc->add_child(_populate_list(TTR("Donors"), donor_sections, donor_src, 3)); // License diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp index 130c330f5a..5118ccacad 100644 --- a/editor/editor_data.cpp +++ b/editor/editor_data.cpp @@ -262,7 +262,9 @@ EditorHistory::EditorHistory() { } EditorPlugin *EditorData::get_editor(Object *p_object) { - for (int i = 0; i < editor_plugins.size(); i++) { + // We need to iterate backwards so that we can check user-created plugins first. + // Otherwise, it would not be possible for plugins to handle CanvasItem and Spatial nodes. + for (int i = editor_plugins.size() - 1; i > -1; i--) { if (editor_plugins[i]->has_main_screen() && editor_plugins[i]->handles(p_object)) { return editor_plugins[i]; } @@ -272,7 +274,7 @@ EditorPlugin *EditorData::get_editor(Object *p_object) { } EditorPlugin *EditorData::get_subeditor(Object *p_object) { - for (int i = 0; i < editor_plugins.size(); i++) { + for (int i = editor_plugins.size() - 1; i > -1; i--) { if (!editor_plugins[i]->has_main_screen() && editor_plugins[i]->handles(p_object)) { return editor_plugins[i]; } @@ -283,7 +285,7 @@ EditorPlugin *EditorData::get_subeditor(Object *p_object) { Vector<EditorPlugin *> EditorData::get_subeditors(Object *p_object) { Vector<EditorPlugin *> sub_plugins; - for (int i = 0; i < editor_plugins.size(); i++) { + for (int i = editor_plugins.size() - 1; i > -1; i--) { if (!editor_plugins[i]->has_main_screen() && editor_plugins[i]->handles(p_object)) { sub_plugins.push_back(editor_plugins[i]); } @@ -292,7 +294,7 @@ Vector<EditorPlugin *> EditorData::get_subeditors(Object *p_object) { } EditorPlugin *EditorData::get_editor(String p_name) { - for (int i = 0; i < editor_plugins.size(); i++) { + for (int i = editor_plugins.size() - 1; i > -1; i--) { if (editor_plugins[i]->get_name() == p_name) { return editor_plugins[i]; } diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index 951bec2c83..16e69734d3 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -512,10 +512,18 @@ void EditorExportPlugin::add_ios_framework(const String &p_path) { ios_frameworks.push_back(p_path); } +void EditorExportPlugin::add_ios_embedded_framework(const String &p_path) { + ios_embedded_frameworks.push_back(p_path); +} + Vector<String> EditorExportPlugin::get_ios_frameworks() const { return ios_frameworks; } +Vector<String> EditorExportPlugin::get_ios_embedded_frameworks() const { + return ios_embedded_frameworks; +} + void EditorExportPlugin::add_ios_plist_content(const String &p_plist_content) { ios_plist_content += p_plist_content + "\n"; } @@ -592,6 +600,7 @@ void EditorExportPlugin::_bind_methods() { ClassDB::bind_method(D_METHOD("add_ios_project_static_lib", "path"), &EditorExportPlugin::add_ios_project_static_lib); ClassDB::bind_method(D_METHOD("add_file", "path", "file", "remap"), &EditorExportPlugin::add_file); ClassDB::bind_method(D_METHOD("add_ios_framework", "path"), &EditorExportPlugin::add_ios_framework); + ClassDB::bind_method(D_METHOD("add_ios_embedded_framework", "path"), &EditorExportPlugin::add_ios_embedded_framework); ClassDB::bind_method(D_METHOD("add_ios_plist_content", "plist_content"), &EditorExportPlugin::add_ios_plist_content); ClassDB::bind_method(D_METHOD("add_ios_linker_flags", "flags"), &EditorExportPlugin::add_ios_linker_flags); ClassDB::bind_method(D_METHOD("add_ios_bundle_file", "path"), &EditorExportPlugin::add_ios_bundle_file); diff --git a/editor/editor_export.h b/editor/editor_export.h index e31b53ad67..bb701b94ec 100644 --- a/editor/editor_export.h +++ b/editor/editor_export.h @@ -290,6 +290,7 @@ class EditorExportPlugin : public Reference { bool skipped; Vector<String> ios_frameworks; + Vector<String> ios_embedded_frameworks; Vector<String> ios_project_static_libs; String ios_plist_content; String ios_linker_flags; @@ -304,6 +305,7 @@ class EditorExportPlugin : public Reference { _FORCE_INLINE_ void _export_end() { ios_frameworks.clear(); + ios_embedded_frameworks.clear(); ios_bundle_files.clear(); ios_plist_content = ""; ios_linker_flags = ""; @@ -322,6 +324,7 @@ protected: void add_shared_object(const String &p_path, const Vector<String> &tags); void add_ios_framework(const String &p_path); + void add_ios_embedded_framework(const String &p_path); void add_ios_project_static_lib(const String &p_path); void add_ios_plist_content(const String &p_plist_content); void add_ios_linker_flags(const String &p_flags); @@ -337,6 +340,7 @@ protected: public: Vector<String> get_ios_frameworks() const; + Vector<String> get_ios_embedded_frameworks() const; Vector<String> get_ios_project_static_libs() const; String get_ios_plist_content() const; String get_ios_linker_flags() const; diff --git a/editor/editor_feature_profile.cpp b/editor/editor_feature_profile.cpp index f68cc3b323..418370a7c3 100644 --- a/editor/editor_feature_profile.cpp +++ b/editor/editor_feature_profile.cpp @@ -41,9 +41,9 @@ const char *EditorFeatureProfile::feature_names[FEATURE_MAX] = { TTRC("Script Editor"), TTRC("Asset Library"), TTRC("Scene Tree Editing"), - TTRC("Import Dock"), TTRC("Node Dock"), - TTRC("FileSystem and Import Docks") + TTRC("FileSystem Dock"), + TTRC("Import Dock"), }; const char *EditorFeatureProfile::feature_identifiers[FEATURE_MAX] = { @@ -51,9 +51,9 @@ const char *EditorFeatureProfile::feature_identifiers[FEATURE_MAX] = { "script", "asset_lib", "scene_tree", - "import_dock", "node_dock", - "filesystem_dock" + "filesystem_dock", + "import_dock", }; void EditorFeatureProfile::set_disable_class(const StringName &p_class, bool p_disabled) { @@ -678,9 +678,16 @@ void EditorFeatureProfileManager::_update_selected_profile() { TreeItem *root = class_list->create_item(); TreeItem *features = class_list->create_item(root); + TreeItem *last_feature; features->set_text(0, TTR("Enabled Features:")); for (int i = 0; i < EditorFeatureProfile::FEATURE_MAX; i++) { - TreeItem *feature = class_list->create_item(features); + TreeItem *feature; + if (i == EditorFeatureProfile::FEATURE_IMPORT_DOCK) { + feature = class_list->create_item(last_feature); + } else { + feature = class_list->create_item(features); + last_feature = feature; + } feature->set_cell_mode(0, TreeItem::CELL_MODE_CHECK); feature->set_text(0, TTRGET(EditorFeatureProfile::get_feature_name(EditorFeatureProfile::Feature(i)))); feature->set_selectable(0, true); diff --git a/editor/editor_feature_profile.h b/editor/editor_feature_profile.h index 38413e35a2..d0d08c61f4 100644 --- a/editor/editor_feature_profile.h +++ b/editor/editor_feature_profile.h @@ -49,9 +49,9 @@ public: FEATURE_SCRIPT, FEATURE_ASSET_LIB, FEATURE_SCENE_TREE, - FEATURE_IMPORT_DOCK, FEATURE_NODE_DOCK, FEATURE_FILESYSTEM_DOCK, + FEATURE_IMPORT_DOCK, FEATURE_MAX }; diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index cf32ffb4e0..336e34298f 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -1174,6 +1174,47 @@ void EditorInspectorSection::_notification(int p_what) { if (arrow.is_valid()) { draw_texture(arrow, Point2(Math::round(arrow_margin * EDSCALE), (h - arrow->get_height()) / 2).floor()); } + + if (dropping && !vbox->is_visible_in_tree()) { + Color accent_color = get_theme_color("accent_color", "Editor"); + draw_rect(Rect2(Point2(), get_size()), accent_color, false); + } + } + + if (p_what == NOTIFICATION_DRAG_BEGIN) { + Dictionary dd = get_viewport()->gui_get_drag_data(); + + // Only allow dropping if the section contains properties which can take the dragged data. + bool children_can_drop = false; + for (int child_idx = 0; child_idx < vbox->get_child_count(); child_idx++) { + Control *editor_property = Object::cast_to<Control>(vbox->get_child(child_idx)); + + // Test can_drop_data and can_drop_data_fw, since can_drop_data only works if set up with forwarding or if script attached. + if (editor_property && (editor_property->can_drop_data(Point2(), dd) || editor_property->call("can_drop_data_fw", Point2(), dd, this))) { + children_can_drop = true; + break; + } + } + + dropping = children_can_drop; + update(); + } + + if (p_what == NOTIFICATION_DRAG_END) { + dropping = false; + update(); + } + + if (p_what == NOTIFICATION_MOUSE_ENTER) { + if (dropping) { + dropping_unfold_timer->start(); + } + } + + if (p_what == NOTIFICATION_MOUSE_EXIT) { + if (dropping) { + dropping_unfold_timer->stop(); + } } } @@ -1236,14 +1277,11 @@ void EditorInspectorSection::_gui_input(const Ref<InputEvent> &p_event) { return; } - _test_unfold(); - - bool unfold = !object->editor_is_section_unfolded(section); - object->editor_set_section_unfold(section, unfold); - if (unfold) { - vbox->show(); + bool should_unfold = !object->editor_is_section_unfolded(section); + if (should_unfold) { + unfold(); } else { - vbox->hide(); + fold(); } } } @@ -1291,6 +1329,13 @@ EditorInspectorSection::EditorInspectorSection() { foldable = false; vbox = memnew(VBoxContainer); vbox_added = false; + + dropping = false; + dropping_unfold_timer = memnew(Timer); + dropping_unfold_timer->set_wait_time(0.6); + dropping_unfold_timer->set_one_shot(true); + add_child(dropping_unfold_timer); + dropping_unfold_timer->connect("timeout", callable_mp(this, &EditorInspectorSection::unfold)); } EditorInspectorSection::~EditorInspectorSection() { @@ -1924,7 +1969,7 @@ void EditorInspector::refresh() { if (refresh_countdown > 0 || changing) { return; } - refresh_countdown = EditorSettings::get_singleton()->get("docks/property_editor/auto_refresh_interval"); + refresh_countdown = refresh_interval_cache; } Object *EditorInspector::get_edited_object() { @@ -2287,6 +2332,8 @@ void EditorInspector::_node_removed(Node *p_node) { void EditorInspector::_notification(int p_what) { if (p_what == NOTIFICATION_READY) { EditorFeatureProfileManager::get_singleton()->connect("current_feature_profile_changed", callable_mp(this, &EditorInspector::_feature_profile_changed)); + refresh_interval_cache = EDITOR_GET("docks/property_editor/auto_refresh_interval"); + refresh_countdown = refresh_interval_cache; } if (p_what == NOTIFICATION_ENTER_TREE) { @@ -2322,6 +2369,9 @@ void EditorInspector::_notification(int p_what) { } } } + } else { + // Restart countdown if <= 0 + refresh_countdown = refresh_interval_cache; } changing++; @@ -2354,6 +2404,9 @@ void EditorInspector::_notification(int p_what) { add_theme_style_override("bg", get_theme_stylebox("bg", "Tree")); } + refresh_interval_cache = EDITOR_GET("docks/property_editor/auto_refresh_interval"); + refresh_countdown = refresh_interval_cache; + update_tree(); } } @@ -2517,6 +2570,7 @@ EditorInspector::EditorInspector() { update_all_pending = false; update_tree_pending = false; refresh_countdown = 0; + refresh_interval_cache = 0; read_only = false; search_box = nullptr; keying = false; diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h index 95072fd703..d1046315f4 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -231,6 +231,9 @@ class EditorInspectorSection : public Container { Color bg_color; bool foldable; + Timer *dropping_unfold_timer; + bool dropping; + void _test_unfold(); protected: @@ -291,6 +294,7 @@ class EditorInspector : public ScrollContainer { bool deletable_properties; float refresh_countdown; + float refresh_interval_cache; bool update_tree_pending; StringName _prop_edited; StringName property_selected; diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index ce131e6a05..16b8c6e0ac 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -123,6 +123,7 @@ #include "editor/plugins/cpu_particles_3d_editor_plugin.h" #include "editor/plugins/curve_editor_plugin.h" #include "editor/plugins/debugger_editor_plugin.h" +#include "editor/plugins/editor_debugger_plugin.h" #include "editor/plugins/editor_preview_plugins.h" #include "editor/plugins/gi_probe_editor_plugin.h" #include "editor/plugins/gpu_particles_2d_editor_plugin.h" @@ -456,8 +457,6 @@ void EditorNode::_notification(int p_what) { editor_selection->update(); - //scene_root->set_size_override(true, Size2(ProjectSettings::get_singleton()->get("display/window/size/width"), ProjectSettings::get_singleton()->get("display/window/size/height"))); - { //TODO should only happen on settings changed int current_filter = GLOBAL_GET("rendering/canvas_textures/default_texture_filter"); if (current_filter != scene_root->get_default_canvas_item_texture_filter()) { @@ -479,6 +478,8 @@ void EditorNode::_notification(int p_what) { RS::get_singleton()->screen_space_roughness_limiter_set_active(GLOBAL_GET("rendering/quality/screen_filters/screen_space_roughness_limiter_enabled"), GLOBAL_GET("rendering/quality/screen_filters/screen_space_roughness_limiter_amount"), GLOBAL_GET("rendering/quality/screen_filters/screen_space_roughness_limiter_limit")); bool glow_bicubic = int(GLOBAL_GET("rendering/quality/glow/upscale_mode")) > 0; RS::get_singleton()->environment_glow_set_use_bicubic_upscale(glow_bicubic); + bool glow_high_quality = GLOBAL_GET("rendering/quality/glow/use_high_quality"); + RS::get_singleton()->environment_glow_set_use_high_quality(glow_high_quality); RS::EnvironmentSSRRoughnessQuality ssr_roughness_quality = RS::EnvironmentSSRRoughnessQuality(int(GLOBAL_GET("rendering/quality/screen_space_reflection/roughness_quality"))); RS::get_singleton()->environment_set_ssr_roughness_quality(ssr_roughness_quality); RS::SubSurfaceScatteringQuality sss_quality = RS::SubSurfaceScatteringQuality(int(GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_quality"))); @@ -498,6 +499,10 @@ void EditorNode::_notification(int p_what) { RS::get_singleton()->environment_set_sdfgi_ray_count(ray_count); RS::GIProbeQuality gi_probe_quality = RS::GIProbeQuality(int(GLOBAL_GET("rendering/quality/gi_probes/quality"))); RS::get_singleton()->gi_probe_set_quality(gi_probe_quality); + RS::get_singleton()->environment_set_volumetric_fog_volume_size(GLOBAL_GET("rendering/volumetric_fog/volume_size"), GLOBAL_GET("rendering/volumetric_fog/volume_depth")); + RS::get_singleton()->environment_set_volumetric_fog_filter_active(bool(GLOBAL_GET("rendering/volumetric_fog/use_filter"))); + RS::get_singleton()->environment_set_volumetric_fog_directional_shadow_shrink_size(GLOBAL_GET("rendering/volumetric_fog/directional_shadow_shrink")); + RS::get_singleton()->environment_set_volumetric_fog_positional_shadow_shrink_size(GLOBAL_GET("rendering/volumetric_fog/positional_shadow_shrink")); } ResourceImporterTexture::get_singleton()->update_imports(); @@ -2620,7 +2625,6 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { case SETTINGS_TOGGLE_CONSOLE: { bool was_visible = DisplayServer::get_singleton()->is_console_visible(); DisplayServer::get_singleton()->console_set_visible(!was_visible); - EditorSettings::get_singleton()->set_setting("interface/editor/hide_console_window", was_visible); } break; case EDITOR_SCREENSHOT: { screenshot_timer->start(); @@ -3619,6 +3623,7 @@ void EditorNode::register_editor_types() { // FIXME: Is this stuff obsolete, or should it be ported to new APIs? ClassDB::register_class<EditorScenePostImport>(); //ClassDB::register_type<EditorImportExport>(); + ClassDB::register_class<EditorDebuggerPlugin>(); } void EditorNode::unregister_editor_types() { @@ -5341,9 +5346,11 @@ void EditorNode::_feature_profile_changed() { TabContainer *node_tabs = cast_to<TabContainer>(node_dock->get_parent()); TabContainer *fs_tabs = cast_to<TabContainer>(filesystem_dock->get_parent()); if (profile.is_valid()) { - import_tabs->set_tab_hidden(import_dock->get_index(), profile->is_feature_disabled(EditorFeatureProfile::FEATURE_IMPORT_DOCK)); node_tabs->set_tab_hidden(node_dock->get_index(), profile->is_feature_disabled(EditorFeatureProfile::FEATURE_NODE_DOCK)); - fs_tabs->set_tab_hidden(filesystem_dock->get_index(), profile->is_feature_disabled(EditorFeatureProfile::FEATURE_FILESYSTEM_DOCK)); + // The Import dock is useless without the FileSystem dock. Ensure the configuration is valid. + bool fs_dock_disabled = profile->is_feature_disabled(EditorFeatureProfile::FEATURE_FILESYSTEM_DOCK); + fs_tabs->set_tab_hidden(filesystem_dock->get_index(), fs_dock_disabled); + import_tabs->set_tab_hidden(import_dock->get_index(), fs_dock_disabled || profile->is_feature_disabled(EditorFeatureProfile::FEATURE_IMPORT_DOCK)); main_editor_buttons[EDITOR_3D]->set_visible(!profile->is_feature_disabled(EditorFeatureProfile::FEATURE_3D)); main_editor_buttons[EDITOR_SCRIPT]->set_visible(!profile->is_feature_disabled(EditorFeatureProfile::FEATURE_SCRIPT)); diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp index da0a0827d2..bce46b719a 100644 --- a/editor/editor_plugin.cpp +++ b/editor/editor_plugin.cpp @@ -811,6 +811,14 @@ ScriptCreateDialog *EditorPlugin::get_script_create_dialog() { return EditorNode::get_singleton()->get_script_create_dialog(); } +void EditorPlugin::add_debugger_plugin(const Ref<Script> &p_script) { + EditorDebuggerNode::get_singleton()->add_debugger_plugin(p_script); +} + +void EditorPlugin::remove_debugger_plugin(const Ref<Script> &p_script) { + EditorDebuggerNode::get_singleton()->remove_debugger_plugin(p_script); +} + void EditorPlugin::_bind_methods() { ClassDB::bind_method(D_METHOD("add_control_to_container", "container", "control"), &EditorPlugin::add_control_to_container); ClassDB::bind_method(D_METHOD("add_control_to_bottom_panel", "control", "title"), &EditorPlugin::add_control_to_bottom_panel); @@ -851,6 +859,8 @@ void EditorPlugin::_bind_methods() { ClassDB::bind_method(D_METHOD("get_editor_interface"), &EditorPlugin::get_editor_interface); ClassDB::bind_method(D_METHOD("get_script_create_dialog"), &EditorPlugin::get_script_create_dialog); + ClassDB::bind_method(D_METHOD("add_debugger_plugin", "script"), &EditorPlugin::add_debugger_plugin); + ClassDB::bind_method(D_METHOD("remove_debugger_plugin", "script"), &EditorPlugin::remove_debugger_plugin); ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "forward_canvas_gui_input", PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent"))); ClassDB::add_virtual_method(get_class_static(), MethodInfo("forward_canvas_draw_over_viewport", PropertyInfo(Variant::OBJECT, "overlay", PROPERTY_HINT_RESOURCE_TYPE, "Control"))); diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h index 685f69bf3f..c7803f73c9 100644 --- a/editor/editor_plugin.h +++ b/editor/editor_plugin.h @@ -33,6 +33,7 @@ #include "core/io/config_file.h" #include "core/undo_redo.h" +#include "editor/debugger/editor_debugger_node.h" #include "editor/editor_inspector.h" #include "editor/editor_translation_parser.h" #include "editor/import/editor_import_plugin.h" @@ -249,6 +250,9 @@ public: void add_autoload_singleton(const String &p_name, const String &p_path); void remove_autoload_singleton(const String &p_name); + void add_debugger_plugin(const Ref<Script> &p_script); + void remove_debugger_plugin(const Ref<Script> &p_script); + void enable_plugin(); void disable_plugin(); diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index daafe095ce..4c8af615b4 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -36,6 +36,7 @@ #include "editor_properties_array_dict.h" #include "editor_scale.h" #include "scene/main/window.h" +#include "scene/resources/dynamic_font.h" ///////////////////// NULL ///////////////////////// @@ -946,14 +947,11 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) { } float val = get_edited_object()->get(get_edited_property()); - if (val == 0) { - return; - } bool sg = val < 0; val = Math::absf(val); val = Math::log(val) / Math::log((float)2.0); - //logspace + // Logarithmic space. val += rel * 0.05; val = Math::pow(2.0f, val); @@ -961,6 +959,16 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) { val = -val; } + // 0 is a singularity, but both positive and negative values + // are otherwise allowed. Enforce 0+ as workaround. + if (Math::is_zero_approx(val)) { + val = 0.00001; + } + + // Limit to a reasonable value to prevent the curve going into infinity, + // which can cause crashes and other issues. + val = CLAMP(val, -1'000'000, 1'000'000); + emit_changed(get_edited_property(), val); easing_draw->update(); } @@ -1003,7 +1011,18 @@ void EditorPropertyEasing::_draw_easing() { } easing_draw->draw_multiline(lines, line_color, 1.0); - f->draw(ci, Point2(10, 10 + f->get_ascent()), String::num(exp, 2), font_color); + // Draw more decimals for small numbers since higher precision is usually required for fine adjustments. + int decimals; + if (Math::abs(exp) < 0.1 - CMP_EPSILON) { + decimals = 4; + } else if (Math::abs(exp) < 1 - CMP_EPSILON) { + decimals = 3; + } else if (Math::abs(exp) < 10 - CMP_EPSILON) { + decimals = 2; + } else { + decimals = 1; + } + f->draw(ci, Point2(10, 10 + f->get_ascent()), rtos(exp).pad_decimals(decimals), font_color); } void EditorPropertyEasing::update_property() { @@ -1035,6 +1054,11 @@ void EditorPropertyEasing::_spin_value_changed(double p_value) { if (Math::is_zero_approx(p_value)) { p_value = 0.00001; } + + // Limit to a reasonable value to prevent the curve going into infinity, + // which can cause crashes and other issues. + p_value = CLAMP(p_value, -1'000'000, 1'000'000); + emit_changed(get_edited_property(), p_value); _spin_focus_exited(); } @@ -2108,6 +2132,11 @@ EditorPropertyTransform::EditorPropertyTransform() { ////////////// COLOR PICKER ////////////////////// void EditorPropertyColor::_color_changed(const Color &p_color) { + // Cancel the color change if the current color is identical to the new one. + if (get_edited_object()->get(get_edited_property()) == p_color) { + return; + } + emit_changed(get_edited_property(), p_color, "", true); } @@ -2919,11 +2948,9 @@ void EditorPropertyResource::_notification(int p_what) { } if (p_what == NOTIFICATION_DRAG_BEGIN) { - if (is_visible_in_tree()) { - if (_is_drop_valid(get_viewport()->gui_get_drag_data())) { - dropping = true; - assign->update(); - } + if (_is_drop_valid(get_viewport()->gui_get_drag_data())) { + dropping = true; + assign->update(); } } @@ -2988,6 +3015,8 @@ bool EditorPropertyResource::_is_drop_valid(const Dictionary &p_drag_data) const allowed_types.append("Texture2D"); } else if (at == "ShaderMaterial") { allowed_types.append("Shader"); + } else if (at == "Font") { + allowed_types.append("DynamicFontData"); } } @@ -3085,6 +3114,13 @@ void EditorPropertyResource::drop_data_fw(const Point2 &p_point, const Variant & res = mat; break; } + + if (at == "Font" && ClassDB::is_parent_class(res->get_class(), "DynamicFontData")) { + Ref<DynamicFont> font = memnew(DynamicFont); + font->set_font_data(res); + res = font; + break; + } } } diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index a3438b3601..7b24e6967a 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -334,7 +334,6 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { _initial_set("interface/editor/automatically_open_screenshots", true); _initial_set("interface/editor/single_window_mode", false); hints["interface/editor/single_window_mode"] = PropertyInfo(Variant::BOOL, "interface/editor/single_window_mode", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED); - _initial_set("interface/editor/hide_console_window", false); _initial_set("interface/editor/save_each_scene_on_quit", true); // Regression _initial_set("interface/editor/quit_confirmation", true); @@ -544,6 +543,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { // 3D: Navigation _initial_set("editors/3d/navigation/navigation_scheme", 0); _initial_set("editors/3d/navigation/invert_y_axis", false); + _initial_set("editors/3d/navigation/invert_x_axis", false); hints["editors/3d/navigation/navigation_scheme"] = PropertyInfo(Variant::INT, "editors/3d/navigation/navigation_scheme", PROPERTY_HINT_ENUM, "Godot,Maya,Modo"); _initial_set("editors/3d/navigation/zoom_style", 0); hints["editors/3d/navigation/zoom_style"] = PropertyInfo(Variant::INT, "editors/3d/navigation/zoom_style", PROPERTY_HINT_ENUM, "Vertical, Horizontal"); diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index a93763810b..8d54bc8021 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -85,7 +85,8 @@ static Ref<StyleBoxLine> make_line_stylebox(Color p_color, int p_thickness = 1, return style; } -Ref<ImageTexture> editor_generate_icon(int p_index, bool p_convert_color, float p_scale = EDSCALE, bool p_force_filter = false) { +#ifdef MODULE_SVG_ENABLED +static Ref<ImageTexture> editor_generate_icon(int p_index, bool p_convert_color, float p_scale = EDSCALE, bool p_force_filter = false) { Ref<ImageTexture> icon = memnew(ImageTexture); Ref<Image> img = memnew(Image); @@ -99,6 +100,7 @@ Ref<ImageTexture> editor_generate_icon(int p_index, bool p_convert_color, float return icon; } +#endif #ifndef ADD_CONVERT_COLOR #define ADD_CONVERT_COLOR(dictionary, old_color, new_color) dictionary[Color::html(old_color)] = Color::html(new_color) diff --git a/editor/editor_translation_parser.cpp b/editor/editor_translation_parser.cpp index da191fbc92..7a90d20000 100644 --- a/editor/editor_translation_parser.cpp +++ b/editor/editor_translation_parser.cpp @@ -37,15 +37,30 @@ EditorTranslationParser *EditorTranslationParser::singleton = nullptr; -Error EditorTranslationParserPlugin::parse_file(const String &p_path, Vector<String> *r_extracted_strings) { +Error EditorTranslationParserPlugin::parse_file(const String &p_path, Vector<String> *r_ids, Vector<Vector<String>> *r_ids_ctx_plural) { if (!get_script_instance()) return ERR_UNAVAILABLE; if (get_script_instance()->has_method("parse_file")) { - Array extracted_strings; - get_script_instance()->call("parse_file", p_path, extracted_strings); - for (int i = 0; i < extracted_strings.size(); i++) { - r_extracted_strings->append(extracted_strings[i]); + Array ids; + Array ids_ctx_plural; + get_script_instance()->call("parse_file", p_path, ids, ids_ctx_plural); + + // Add user's extracted translatable messages. + for (int i = 0; i < ids.size(); i++) { + r_ids->append(ids[i]); + } + + // Add user's collected translatable messages with context or plurals. + for (int i = 0; i < ids_ctx_plural.size(); i++) { + Array arr = ids_ctx_plural[i]; + ERR_FAIL_COND_V_MSG(arr.size() != 3, ERR_INVALID_DATA, "Array entries written into `msgids_context_plural` in `parse_file()` method should have the form [\"message\", \"context\", \"plural message\"]"); + + Vector<String> id_ctx_plural; + id_ctx_plural.push_back(arr[0]); + id_ctx_plural.push_back(arr[1]); + id_ctx_plural.push_back(arr[2]); + r_ids_ctx_plural->append(id_ctx_plural); } return OK; } else { @@ -69,7 +84,7 @@ void EditorTranslationParserPlugin::get_recognized_extensions(List<String> *r_ex } void EditorTranslationParserPlugin::_bind_methods() { - ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::NIL, "parse_file", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::ARRAY, "extracted_strings"))); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::NIL, "parse_file", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::ARRAY, "msgids"), PropertyInfo(Variant::ARRAY, "msgids_context_plural"))); ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::ARRAY, "get_recognized_extensions")); } diff --git a/editor/editor_translation_parser.h b/editor/editor_translation_parser.h index fb8aa6ec9b..18f49b3803 100644 --- a/editor/editor_translation_parser.h +++ b/editor/editor_translation_parser.h @@ -41,7 +41,7 @@ protected: static void _bind_methods(); public: - virtual Error parse_file(const String &p_path, Vector<String> *r_extracted_strings); + virtual Error parse_file(const String &p_path, Vector<String> *r_ids, Vector<Vector<String>> *r_ids_ctx_plural); virtual void get_recognized_extensions(List<String> *r_extensions) const; }; diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 4f37fcf39c..31903c89be 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -2430,11 +2430,31 @@ void FileSystemDock::_file_list_gui_input(Ref<InputEvent> p_event) { } } -void FileSystemDock::_update_import_dock() { - if (!import_dock_needs_update) { +void FileSystemDock::_get_imported_files(const String &p_path, Vector<String> &files) const { + if (!p_path.ends_with("/")) { + if (FileAccess::exists(p_path + ".import")) { + files.push_back(p_path); + } return; } + DirAccess *da = DirAccess::open(p_path); + da->list_dir_begin(); + String n = da->get_next(); + while (n != String()) { + if (n != "." && n != ".." && !n.ends_with(".import")) { + String npath = p_path + n + (da->current_is_dir() ? "/" : ""); + _get_imported_files(npath, files); + } + n = da->get_next(); + } + da->list_dir_end(); +} + +void FileSystemDock::_update_import_dock() { + if (!import_dock_needs_update) + return; + // List selected. Vector<String> selected; if (display_mode == DISPLAY_MODE_TREE_ONLY) { @@ -2444,29 +2464,24 @@ void FileSystemDock::_update_import_dock() { } else { // Use the file list. for (int i = 0; i < files->get_item_count(); i++) { - if (!files->is_selected(i)) { + if (!files->is_selected(i)) continue; - } selected.push_back(files->get_item_metadata(i)); } } + // Expand directory selection + Vector<String> efiles; + for (int i = 0; i < selected.size(); i++) { + _get_imported_files(selected[i], efiles); + } + // Check import. Vector<String> imports; String import_type; - for (int i = 0; i < selected.size(); i++) { - String fpath = selected[i]; - - if (fpath.ends_with("/")) { - imports.clear(); - break; - } - - if (!FileAccess::exists(fpath + ".import")) { - imports.clear(); - break; - } + for (int i = 0; i < efiles.size(); i++) { + String fpath = efiles[i]; Ref<ConfigFile> cf; cf.instance(); Error err = cf->load(fpath + ".import"); diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h index b0118f11aa..ec2a075834 100644 --- a/editor/filesystem_dock.h +++ b/editor/filesystem_dock.h @@ -195,6 +195,7 @@ private: void _file_multi_selected(int p_index, bool p_selected); void _tree_multi_selected(Object *p_item, int p_column, bool p_selected); + void _get_imported_files(const String &p_path, Vector<String> &files) const; void _update_import_dock(); void _get_all_items_in_dir(EditorFileSystemDirectory *efsd, Vector<String> &files, Vector<String> &folders) const; diff --git a/editor/icons/GuiToggleOff.svg b/editor/icons/GuiToggleOff.svg index 928b55b201..9644ef176c 100644 --- a/editor/icons/GuiToggleOff.svg +++ b/editor/icons/GuiToggleOff.svg @@ -1 +1 @@ -<svg height="26" viewBox="0 0 42 25.999998" width="42" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><rect fill-opacity=".188235" height="16" rx="9" stroke-width="55.8958" width="38" x="2" y="5"/><circle cx="10" cy="13" r="5" stroke-width="97.3613"/></g></svg> +<svg height="16" viewBox="0 0 38 15.999999" width="38" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><rect fill-opacity=".188235" height="14" rx="7" stroke-width="55.8958" width="36" x="1" y="1"/><circle cx="8" cy="8" r="5" stroke-width="97.3613"/></g></svg> diff --git a/editor/icons/GuiToggleOn.svg b/editor/icons/GuiToggleOn.svg index a79a8290b1..8ab0998f71 100644 --- a/editor/icons/GuiToggleOn.svg +++ b/editor/icons/GuiToggleOn.svg @@ -1 +1 @@ -<svg height="26" viewBox="0 0 42 25.999998" width="42" xmlns="http://www.w3.org/2000/svg"><path d="m11 5c-4.986 0-9 3.568-9 8s4.014 8 9 8h20c4.986 0 9-3.568 9-8s-4.014-8-9-8zm21 3a5 5 0 0 1 5 5 5 5 0 0 1 -5 5 5 5 0 0 1 -5-5 5 5 0 0 1 5-5z" fill="#e0e0e0" stroke-width="55.8958"/></svg> +<svg height="16" viewBox="0 0 38 15.999999" width="38" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.878 0-7 3.122-7 7s3.122 7 7 7h22c3.878 0 7-3.122 7-7s-3.122-7-7-7zm22 2a5 5 0 0 1 5 5 5 5 0 0 1 -5 5 5 5 0 0 1 -5-5 5 5 0 0 1 5-5z" fill="#e0e0e0" stroke-width="55.8958"/></svg> diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index f3508cedbd..3f9f159d7f 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -2599,6 +2599,11 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) { void CanvasItemEditor::_update_cursor() { CursorShape c = CURSOR_ARROW; + bool should_switch = false; + if (drag_selection.size() != 0) { + float angle = drag_selection[0]->_edit_get_rotation(); + should_switch = abs(Math::cos(angle)) < Math_SQRT12; + } switch (drag_type) { case DRAG_NONE: switch (tool) { @@ -2621,21 +2626,37 @@ void CanvasItemEditor::_update_cursor() { case DRAG_LEFT: case DRAG_RIGHT: case DRAG_V_GUIDE: - c = CURSOR_HSIZE; + if (should_switch) { + c = CURSOR_VSIZE; + } else { + c = CURSOR_HSIZE; + } break; case DRAG_TOP: case DRAG_BOTTOM: case DRAG_H_GUIDE: - c = CURSOR_VSIZE; + if (should_switch) { + c = CURSOR_HSIZE; + } else { + c = CURSOR_VSIZE; + } break; case DRAG_TOP_LEFT: case DRAG_BOTTOM_RIGHT: case DRAG_DOUBLE_GUIDE: - c = CURSOR_FDIAGSIZE; + if (should_switch) { + c = CURSOR_BDIAGSIZE; + } else { + c = CURSOR_FDIAGSIZE; + } break; case DRAG_TOP_RIGHT: case DRAG_BOTTOM_LEFT: - c = CURSOR_BDIAGSIZE; + if (should_switch) { + c = CURSOR_FDIAGSIZE; + } else { + c = CURSOR_BDIAGSIZE; + } break; case DRAG_MOVE: c = CURSOR_MOVE; diff --git a/editor/plugins/editor_debugger_plugin.cpp b/editor/plugins/editor_debugger_plugin.cpp new file mode 100644 index 0000000000..b775e871e2 --- /dev/null +++ b/editor/plugins/editor_debugger_plugin.cpp @@ -0,0 +1,124 @@ +/*************************************************************************/ +/* editor_debugger_plugin.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 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 "editor_debugger_plugin.h" + +#include "editor/debugger/script_editor_debugger.h" + +void EditorDebuggerPlugin::_breaked(bool p_really_did, bool p_can_debug) { + if (p_really_did) { + emit_signal("breaked", p_can_debug); + } else { + emit_signal("continued"); + } +} + +void EditorDebuggerPlugin::_started() { + emit_signal("started"); +} + +void EditorDebuggerPlugin::_stopped() { + emit_signal("stopped"); +} + +void EditorDebuggerPlugin::_bind_methods() { + ClassDB::bind_method(D_METHOD("send_message", "message", "data"), &EditorDebuggerPlugin::send_message); + ClassDB::bind_method(D_METHOD("register_message_capture", "name", "callable"), &EditorDebuggerPlugin::register_message_capture); + ClassDB::bind_method(D_METHOD("unregister_message_capture", "name"), &EditorDebuggerPlugin::unregister_message_capture); + ClassDB::bind_method(D_METHOD("has_capture", "name"), &EditorDebuggerPlugin::has_capture); + ClassDB::bind_method(D_METHOD("is_breaked"), &EditorDebuggerPlugin::is_breaked); + ClassDB::bind_method(D_METHOD("is_debuggable"), &EditorDebuggerPlugin::is_debuggable); + ClassDB::bind_method(D_METHOD("is_session_active"), &EditorDebuggerPlugin::is_session_active); + + ADD_SIGNAL(MethodInfo("started")); + ADD_SIGNAL(MethodInfo("stopped")); + ADD_SIGNAL(MethodInfo("breaked", PropertyInfo(Variant::BOOL, "can_debug"))); + ADD_SIGNAL(MethodInfo("continued")); +} + +void EditorDebuggerPlugin::attach_debugger(ScriptEditorDebugger *p_debugger) { + debugger = p_debugger; + if (debugger) { + debugger->connect("started", callable_mp(this, &EditorDebuggerPlugin::_started)); + debugger->connect("stopped", callable_mp(this, &EditorDebuggerPlugin::_stopped)); + debugger->connect("breaked", callable_mp(this, &EditorDebuggerPlugin::_breaked)); + } +} + +void EditorDebuggerPlugin::detach_debugger(bool p_call_debugger) { + if (debugger) { + debugger->disconnect("started", callable_mp(this, &EditorDebuggerPlugin::_started)); + debugger->disconnect("stopped", callable_mp(this, &EditorDebuggerPlugin::_stopped)); + debugger->disconnect("breaked", callable_mp(this, &EditorDebuggerPlugin::_breaked)); + if (p_call_debugger && get_script_instance()) { + debugger->remove_debugger_plugin(get_script_instance()->get_script()); + } + debugger = nullptr; + } +} + +void EditorDebuggerPlugin::send_message(const String &p_message, const Array &p_args) { + ERR_FAIL_COND_MSG(!debugger, "Plugin is not attached to debugger"); + debugger->send_message(p_message, p_args); +} + +void EditorDebuggerPlugin::register_message_capture(const StringName &p_name, const Callable &p_callable) { + ERR_FAIL_COND_MSG(!debugger, "Plugin is not attached to debugger"); + debugger->register_message_capture(p_name, p_callable); +} + +void EditorDebuggerPlugin::unregister_message_capture(const StringName &p_name) { + ERR_FAIL_COND_MSG(!debugger, "Plugin is not attached to debugger"); + debugger->unregister_message_capture(p_name); +} + +bool EditorDebuggerPlugin::has_capture(const StringName &p_name) { + ERR_FAIL_COND_V_MSG(!debugger, false, "Plugin is not attached to debugger"); + return debugger->has_capture(p_name); +} + +bool EditorDebuggerPlugin::is_breaked() { + ERR_FAIL_COND_V_MSG(!debugger, false, "Plugin is not attached to debugger"); + return debugger->is_breaked(); +} + +bool EditorDebuggerPlugin::is_debuggable() { + ERR_FAIL_COND_V_MSG(!debugger, false, "Plugin is not attached to debugger"); + return debugger->is_debuggable(); +} + +bool EditorDebuggerPlugin::is_session_active() { + ERR_FAIL_COND_V_MSG(!debugger, false, "Plugin is not attached to debugger"); + return debugger->is_session_active(); +} + +EditorDebuggerPlugin::~EditorDebuggerPlugin() { + detach_debugger(true); +} diff --git a/editor/plugins/editor_debugger_plugin.h b/editor/plugins/editor_debugger_plugin.h new file mode 100644 index 0000000000..10fd1151de --- /dev/null +++ b/editor/plugins/editor_debugger_plugin.h @@ -0,0 +1,64 @@ +/*************************************************************************/ +/* editor_debugger_plugin.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 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_DEBUGGER_PLUGIN_H +#define EDITOR_DEBUGGER_PLUGIN_H + +#include "scene/gui/control.h" + +class ScriptEditorDebugger; + +class EditorDebuggerPlugin : public Control { + GDCLASS(EditorDebuggerPlugin, Control); + +private: + ScriptEditorDebugger *debugger = nullptr; + + void _breaked(bool p_really_did, bool p_can_debug); + void _started(); + void _stopped(); + +protected: + static void _bind_methods(); + +public: + void attach_debugger(ScriptEditorDebugger *p_debugger); + void detach_debugger(bool p_call_debugger); + void send_message(const String &p_message, const Array &p_args); + void register_message_capture(const StringName &p_name, const Callable &p_callable); + void unregister_message_capture(const StringName &p_name); + bool has_capture(const StringName &p_name); + bool is_breaked(); + bool is_debuggable(); + bool is_session_active(); + ~EditorDebuggerPlugin(); +}; + +#endif // EDITOR_DEBUGGER_PLUGIN_H diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index b4b81cc7f0..21a75c2f5d 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -2059,7 +2059,12 @@ void Node3DEditorViewport::_nav_pan(Ref<InputEventWithModifiers> p_event, const camera_transform.translate(cursor.pos); camera_transform.basis.rotate(Vector3(1, 0, 0), -cursor.x_rot); camera_transform.basis.rotate(Vector3(0, 1, 0), -cursor.y_rot); - Vector3 translation(-p_relative.x * pan_speed, p_relative.y * pan_speed, 0); + const bool invert_x_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_x_axis"); + const bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis"); + Vector3 translation( + (invert_x_axis ? -1 : 1) * -p_relative.x * pan_speed, + (invert_y_axis ? -1 : 1) * p_relative.y * pan_speed, + 0); translation *= cursor.distance / DISTANCE_DEFAULT; camera_transform.translate(translation); cursor.pos = camera_transform.origin; @@ -2100,17 +2105,24 @@ void Node3DEditorViewport::_nav_orbit(Ref<InputEventWithModifiers> p_event, cons _menu_option(VIEW_PERSPECTIVE); } - real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/navigation_feel/orbit_sensitivity"); - real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel); - bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis"); + const real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/navigation_feel/orbit_sensitivity"); + const real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel); + const bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis"); + const bool invert_x_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_x_axis"); if (invert_y_axis) { cursor.x_rot -= p_relative.y * radians_per_pixel; } else { cursor.x_rot += p_relative.y * radians_per_pixel; } - cursor.y_rot += p_relative.x * radians_per_pixel; + // Clamp the Y rotation to roughly -90..90 degrees so the user can't look upside-down and end up disoriented. cursor.x_rot = CLAMP(cursor.x_rot, -1.57, 1.57); + + if (invert_x_axis) { + cursor.y_rot -= p_relative.x * radians_per_pixel; + } else { + cursor.y_rot += p_relative.x * radians_per_pixel; + } name = ""; _update_name(); } @@ -2125,21 +2137,23 @@ void Node3DEditorViewport::_nav_look(Ref<InputEventWithModifiers> p_event, const _menu_option(VIEW_PERSPECTIVE); } - real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_sensitivity"); - real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel); - bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis"); + const real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_sensitivity"); + const real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel); + const bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis"); // Note: do NOT assume the camera has the "current" transform, because it is interpolated and may have "lag". - Transform prev_camera_transform = to_camera_transform(cursor); + const Transform prev_camera_transform = to_camera_transform(cursor); if (invert_y_axis) { cursor.x_rot -= p_relative.y * radians_per_pixel; } else { cursor.x_rot += p_relative.y * radians_per_pixel; } - cursor.y_rot += p_relative.x * radians_per_pixel; + // Clamp the Y rotation to roughly -90..90 degrees so the user can't look upside-down and end up disoriented. cursor.x_rot = CLAMP(cursor.x_rot, -1.57, 1.57); + cursor.y_rot += p_relative.x * radians_per_pixel; + // Look is like the opposite of Orbit: the focus point rotates around the camera Transform camera_transform = to_camera_transform(cursor); Vector3 pos = camera_transform.xform(Vector3(0, 0, 0)); diff --git a/editor/plugins/packed_scene_translation_parser_plugin.cpp b/editor/plugins/packed_scene_translation_parser_plugin.cpp index 52af0008b7..608b5c3104 100644 --- a/editor/plugins/packed_scene_translation_parser_plugin.cpp +++ b/editor/plugins/packed_scene_translation_parser_plugin.cpp @@ -37,7 +37,7 @@ void PackedSceneEditorTranslationParserPlugin::get_recognized_extensions(List<St ResourceLoader::get_recognized_extensions_for_type("PackedScene", r_extensions); } -Error PackedSceneEditorTranslationParserPlugin::parse_file(const String &p_path, Vector<String> *r_extracted_strings) { +Error PackedSceneEditorTranslationParserPlugin::parse_file(const String &p_path, Vector<String> *r_ids, Vector<Vector<String>> *r_ids_ctx_plural) { // Parse specific scene Node's properties (see in constructor) that are auto-translated by the engine when set. E.g Label's text property. // These properties are translated with the tr() function in the C++ code when being set or updated. @@ -71,8 +71,10 @@ Error PackedSceneEditorTranslationParserPlugin::parse_file(const String &p_path, String extension = s->get_language()->get_extension(); if (EditorTranslationParser::get_singleton()->can_parse(extension)) { Vector<String> temp; - EditorTranslationParser::get_singleton()->get_parser(extension)->parse_file(s->get_path(), &temp); + Vector<Vector<String>> ids_context_plural; + EditorTranslationParser::get_singleton()->get_parser(extension)->parse_file(s->get_path(), &temp, &ids_context_plural); parsed_strings.append_array(temp); + r_ids_ctx_plural->append_array(ids_context_plural); } } else if (property_name == "filters") { // Extract FileDialog's filters property with values in format "*.png ; PNG Images","*.gd ; GDScript Files". @@ -93,7 +95,7 @@ Error PackedSceneEditorTranslationParserPlugin::parse_file(const String &p_path, } } - r_extracted_strings->append_array(parsed_strings); + r_ids->append_array(parsed_strings); return OK; } diff --git a/editor/plugins/packed_scene_translation_parser_plugin.h b/editor/plugins/packed_scene_translation_parser_plugin.h index 2bd4dae995..a0ffdf692c 100644 --- a/editor/plugins/packed_scene_translation_parser_plugin.h +++ b/editor/plugins/packed_scene_translation_parser_plugin.h @@ -40,7 +40,7 @@ class PackedSceneEditorTranslationParserPlugin : public EditorTranslationParserP Set<String> lookup_properties; public: - virtual Error parse_file(const String &p_path, Vector<String> *r_extracted_strings) override; + virtual Error parse_file(const String &p_path, Vector<String> *r_ids, Vector<Vector<String>> *r_ids_ctx_plural) override; virtual void get_recognized_extensions(List<String> *r_extensions) const override; PackedSceneEditorTranslationParserPlugin(); diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp index 1073da7d8c..18942b371c 100644 --- a/editor/plugins/sprite_frames_editor_plugin.cpp +++ b/editor/plugins/sprite_frames_editor_plugin.cpp @@ -36,6 +36,8 @@ #include "editor/editor_settings.h" #include "scene/3d/sprite_3d.h" #include "scene/gui/center_container.h" +#include "scene/gui/margin_container.h" +#include "scene/gui/panel_container.h" void SpriteFramesEditor::_gui_input(Ref<InputEvent> p_event) { } @@ -140,8 +142,27 @@ void SpriteFramesEditor::_sheet_preview_input(const Ref<InputEvent> &p_event) { } } +void SpriteFramesEditor::_sheet_scroll_input(const Ref<InputEvent> &p_event) { + const Ref<InputEventMouseButton> mb = p_event; + + if (mb.is_valid()) { + // Zoom in/out using Ctrl + mouse wheel. This is done on the ScrollContainer + // to allow performing this action anywhere, even if the cursor isn't + // hovering the texture in the workspace. + if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) { + _sheet_zoom_in(); + // Don't scroll up after zooming in. + accept_event(); + } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) { + _sheet_zoom_out(); + // Don't scroll down after zooming out. + accept_event(); + } + } +} + void SpriteFramesEditor::_sheet_add_frames() { - Size2i size = split_sheet_preview->get_size(); + Size2i size = split_sheet_preview->get_texture()->get_size(); int h = split_sheet_h->get_value(); int v = split_sheet_v->get_value(); @@ -180,6 +201,28 @@ void SpriteFramesEditor::_sheet_add_frames() { undo_redo->commit_action(); } +void SpriteFramesEditor::_sheet_zoom_in() { + if (sheet_zoom < max_sheet_zoom) { + sheet_zoom *= scale_ratio; + Size2 texture_size = split_sheet_preview->get_texture()->get_size(); + split_sheet_preview->set_custom_minimum_size(texture_size * sheet_zoom); + } +} + +void SpriteFramesEditor::_sheet_zoom_out() { + if (sheet_zoom > min_sheet_zoom) { + sheet_zoom /= scale_ratio; + Size2 texture_size = split_sheet_preview->get_texture()->get_size(); + split_sheet_preview->set_custom_minimum_size(texture_size * sheet_zoom); + } +} + +void SpriteFramesEditor::_sheet_zoom_reset() { + sheet_zoom = 1.f; + Size2 texture_size = split_sheet_preview->get_texture()->get_size(); + split_sheet_preview->set_custom_minimum_size(texture_size * sheet_zoom); +} + void SpriteFramesEditor::_sheet_select_clear_all_frames() { bool should_clear = true; for (int i = 0; i < split_sheet_h->get_value() * split_sheet_v->get_value(); i++) { @@ -207,15 +250,18 @@ void SpriteFramesEditor::_prepare_sprite_sheet(const String &p_file) { EditorNode::get_singleton()->show_warning(TTR("Unable to load images")); ERR_FAIL_COND(!texture.is_valid()); } - if (texture != split_sheet_preview->get_texture()) { - //different texture, reset to 4x4 - split_sheet_h->set_value(4); - split_sheet_v->set_value(4); - } + bool new_texture = texture != split_sheet_preview->get_texture(); frames_selected.clear(); last_frame_selected = -1; split_sheet_preview->set_texture(texture); + if (new_texture) { + //different texture, reset to 4x4 + split_sheet_h->set_value(4); + split_sheet_v->set_value(4); + //reset zoom + _sheet_zoom_reset(); + } split_sheet_dialog->popup_centered_ratio(0.65); } @@ -231,8 +277,14 @@ void SpriteFramesEditor::_notification(int p_what) { move_up->set_icon(get_theme_icon("MoveLeft", "EditorIcons")); move_down->set_icon(get_theme_icon("MoveRight", "EditorIcons")); _delete->set_icon(get_theme_icon("Remove", "EditorIcons")); + zoom_out->set_icon(get_theme_icon("ZoomLess", "EditorIcons")); + zoom_1->set_icon(get_theme_icon("ZoomReset", "EditorIcons")); + zoom_in->set_icon(get_theme_icon("ZoomMore", "EditorIcons")); new_anim->set_icon(get_theme_icon("New", "EditorIcons")); remove_anim->set_icon(get_theme_icon("Remove", "EditorIcons")); + split_sheet_zoom_out->set_icon(get_theme_icon("ZoomLess", "EditorIcons")); + split_sheet_zoom_1->set_icon(get_theme_icon("ZoomReset", "EditorIcons")); + split_sheet_zoom_in->set_icon(get_theme_icon("ZoomMore", "EditorIcons")); [[fallthrough]]; } case NOTIFICATION_THEME_CHANGED: { @@ -636,6 +688,54 @@ void SpriteFramesEditor::_animation_fps_changed(double p_value) { undo_redo->commit_action(); } +void SpriteFramesEditor::_tree_input(const Ref<InputEvent> &p_event) { + const Ref<InputEventMouseButton> mb = p_event; + + if (mb.is_valid()) { + if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) { + _zoom_in(); + // Don't scroll up after zooming in. + accept_event(); + } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) { + _zoom_out(); + // Don't scroll down after zooming out. + accept_event(); + } + } +} + +void SpriteFramesEditor::_zoom_in() { + // Do not zoom in or out with no visible frames + if (frames->get_frame_count(edited_anim) <= 0) { + return; + } + if (thumbnail_zoom < max_thumbnail_zoom) { + thumbnail_zoom *= scale_ratio; + int thumbnail_size = (int)(thumbnail_default_size * thumbnail_zoom); + tree->set_fixed_column_width(thumbnail_size * 3 / 2); + tree->set_fixed_icon_size(Size2(thumbnail_size, thumbnail_size)); + } +} + +void SpriteFramesEditor::_zoom_out() { + // Do not zoom in or out with no visible frames + if (frames->get_frame_count(edited_anim) <= 0) { + return; + } + if (thumbnail_zoom > min_thumbnail_zoom) { + thumbnail_zoom /= scale_ratio; + int thumbnail_size = (int)(thumbnail_default_size * thumbnail_zoom); + tree->set_fixed_column_width(thumbnail_size * 3 / 2); + tree->set_fixed_icon_size(Size2(thumbnail_size, thumbnail_size)); + } +} + +void SpriteFramesEditor::_zoom_reset() { + thumbnail_zoom = 1.0f; + tree->set_fixed_column_width(thumbnail_default_size * 3 / 2); + tree->set_fixed_icon_size(Size2(thumbnail_default_size, thumbnail_default_size)); +} + void SpriteFramesEditor::_update_library(bool p_skip_selector) { updating = true; @@ -727,6 +827,9 @@ void SpriteFramesEditor::edit(SpriteFrames *p_frames) { } _update_library(); + // Clear zoom and split sheet texture + split_sheet_preview->set_texture(Ref<Texture2D>()); + _zoom_reset(); } else { hide(); } @@ -965,6 +1068,24 @@ SpriteFramesEditor::SpriteFramesEditor() { _delete->set_tooltip(TTR("Delete")); hbc->add_child(_delete); + hbc->add_spacer(); + + zoom_out = memnew(Button); + zoom_out->connect("pressed", callable_mp(this, &SpriteFramesEditor::_zoom_out)); + zoom_out->set_flat(true); + zoom_out->set_tooltip(TTR("Zoom Out")); + hbc->add_child(zoom_out); + zoom_1 = memnew(Button); + zoom_1->connect("pressed", callable_mp(this, &SpriteFramesEditor::_zoom_reset)); + zoom_1->set_flat(true); + zoom_1->set_tooltip(TTR("Zoom Reset")); + hbc->add_child(zoom_1); + zoom_in = memnew(Button); + zoom_in->connect("pressed", callable_mp(this, &SpriteFramesEditor::_zoom_in)); + zoom_in->set_flat(true); + zoom_in->set_tooltip(TTR("Zoom In")); + hbc->add_child(zoom_in); + file = memnew(EditorFileDialog); add_child(file); @@ -972,13 +1093,11 @@ SpriteFramesEditor::SpriteFramesEditor() { tree->set_v_size_flags(SIZE_EXPAND_FILL); tree->set_icon_mode(ItemList::ICON_MODE_TOP); - int thumbnail_size = 96; tree->set_max_columns(0); tree->set_icon_mode(ItemList::ICON_MODE_TOP); - tree->set_fixed_column_width(thumbnail_size * 3 / 2); tree->set_max_text_lines(2); - tree->set_fixed_icon_size(Size2(thumbnail_size, thumbnail_size)); tree->set_drag_forwarding(this); + tree->connect("gui_input", callable_mp(this, &SpriteFramesEditor::_tree_input)); sub_vb->add_child(tree); @@ -1042,8 +1161,13 @@ SpriteFramesEditor::SpriteFramesEditor() { split_sheet_vb->add_child(split_sheet_hb); + PanelContainer *split_sheet_panel = memnew(PanelContainer); + split_sheet_panel->set_h_size_flags(SIZE_EXPAND_FILL); + split_sheet_panel->set_v_size_flags(SIZE_EXPAND_FILL); + split_sheet_vb->add_child(split_sheet_panel); + split_sheet_preview = memnew(TextureRect); - split_sheet_preview->set_expand(false); + split_sheet_preview->set_expand(true); split_sheet_preview->set_mouse_filter(MOUSE_FILTER_PASS); split_sheet_preview->connect("draw", callable_mp(this, &SpriteFramesEditor::_sheet_preview_draw)); split_sheet_preview->connect("gui_input", callable_mp(this, &SpriteFramesEditor::_sheet_preview_input)); @@ -1051,20 +1175,58 @@ SpriteFramesEditor::SpriteFramesEditor() { splite_sheet_scroll = memnew(ScrollContainer); splite_sheet_scroll->set_enable_h_scroll(true); splite_sheet_scroll->set_enable_v_scroll(true); - splite_sheet_scroll->set_v_size_flags(SIZE_EXPAND_FILL); + splite_sheet_scroll->connect("gui_input", callable_mp(this, &SpriteFramesEditor::_sheet_scroll_input)); + split_sheet_panel->add_child(splite_sheet_scroll); CenterContainer *cc = memnew(CenterContainer); cc->add_child(split_sheet_preview); cc->set_h_size_flags(SIZE_EXPAND_FILL); cc->set_v_size_flags(SIZE_EXPAND_FILL); splite_sheet_scroll->add_child(cc); - split_sheet_vb->add_child(splite_sheet_scroll); + MarginContainer *split_sheet_zoom_margin = memnew(MarginContainer); + split_sheet_panel->add_child(split_sheet_zoom_margin); + split_sheet_zoom_margin->set_h_size_flags(0); + split_sheet_zoom_margin->set_v_size_flags(0); + split_sheet_zoom_margin->add_theme_constant_override("margin_top", 5); + split_sheet_zoom_margin->add_theme_constant_override("margin_left", 5); + HBoxContainer *split_sheet_zoom_hb = memnew(HBoxContainer); + split_sheet_zoom_margin->add_child(split_sheet_zoom_hb); + + split_sheet_zoom_out = memnew(Button); + split_sheet_zoom_out->set_flat(true); + split_sheet_zoom_out->set_focus_mode(FOCUS_NONE); + split_sheet_zoom_out->set_tooltip(TTR("Zoom Out")); + split_sheet_zoom_out->connect("pressed", callable_mp(this, &SpriteFramesEditor::_sheet_zoom_out)); + split_sheet_zoom_hb->add_child(split_sheet_zoom_out); + split_sheet_zoom_1 = memnew(Button); + split_sheet_zoom_1->set_flat(true); + split_sheet_zoom_1->set_focus_mode(FOCUS_NONE); + split_sheet_zoom_1->set_tooltip(TTR("Zoom Reset")); + split_sheet_zoom_1->connect("pressed", callable_mp(this, &SpriteFramesEditor::_sheet_zoom_reset)); + split_sheet_zoom_hb->add_child(split_sheet_zoom_1); + split_sheet_zoom_in = memnew(Button); + split_sheet_zoom_in->set_flat(true); + split_sheet_zoom_in->set_focus_mode(FOCUS_NONE); + split_sheet_zoom_in->set_tooltip(TTR("Zoom In")); + split_sheet_zoom_in->connect("pressed", callable_mp(this, &SpriteFramesEditor::_sheet_zoom_in)); + split_sheet_zoom_hb->add_child(split_sheet_zoom_in); file_split_sheet = memnew(EditorFileDialog); file_split_sheet->set_title(TTR("Create Frames from Sprite Sheet")); file_split_sheet->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); add_child(file_split_sheet); file_split_sheet->connect("file_selected", callable_mp(this, &SpriteFramesEditor::_prepare_sprite_sheet)); + + // Config scale. + scale_ratio = 1.2f; + thumbnail_default_size = 96; + thumbnail_zoom = 1.0f; + max_thumbnail_zoom = 8.0f; + min_thumbnail_zoom = 0.1f; + sheet_zoom = 1.0f; + max_sheet_zoom = 16.0f; + min_sheet_zoom = 0.01f; + _zoom_reset(); } void SpriteFramesEditorPlugin::edit(Object *p_object) { diff --git a/editor/plugins/sprite_frames_editor_plugin.h b/editor/plugins/sprite_frames_editor_plugin.h index ee743fe60d..0dce93f55a 100644 --- a/editor/plugins/sprite_frames_editor_plugin.h +++ b/editor/plugins/sprite_frames_editor_plugin.h @@ -36,6 +36,7 @@ #include "scene/2d/animated_sprite_2d.h" #include "scene/gui/dialogs.h" #include "scene/gui/file_dialog.h" +#include "scene/gui/scroll_container.h" #include "scene/gui/split_container.h" #include "scene/gui/texture_rect.h" #include "scene/gui/tree.h" @@ -52,6 +53,9 @@ class SpriteFramesEditor : public HSplitContainer { Button *empty2; Button *move_up; Button *move_down; + Button *zoom_out; + Button *zoom_1; + Button *zoom_in; ItemList *tree; bool loading_scene; int sel; @@ -79,10 +83,22 @@ class SpriteFramesEditor : public HSplitContainer { TextureRect *split_sheet_preview; SpinBox *split_sheet_h; SpinBox *split_sheet_v; + Button *split_sheet_zoom_out; + Button *split_sheet_zoom_1; + Button *split_sheet_zoom_in; EditorFileDialog *file_split_sheet; Set<int> frames_selected; int last_frame_selected; + float scale_ratio; + int thumbnail_default_size; + float thumbnail_zoom; + float max_thumbnail_zoom; + float min_thumbnail_zoom; + float sheet_zoom; + float max_sheet_zoom; + float min_sheet_zoom; + void _load_pressed(); void _load_scene_pressed(); void _file_load_request(const Vector<String> &p_path, int p_at_pos = -1); @@ -103,6 +119,11 @@ class SpriteFramesEditor : public HSplitContainer { void _animation_loop_changed(); void _animation_fps_changed(double p_value); + void _tree_input(const Ref<InputEvent> &p_event); + void _zoom_in(); + void _zoom_out(); + void _zoom_reset(); + bool updating; UndoRedo *undo_redo; @@ -117,7 +138,11 @@ class SpriteFramesEditor : public HSplitContainer { void _sheet_preview_draw(); void _sheet_spin_changed(double); void _sheet_preview_input(const Ref<InputEvent> &p_event); + void _sheet_scroll_input(const Ref<InputEvent> &p_event); void _sheet_add_frames(); + void _sheet_zoom_in(); + void _sheet_zoom_out(); + void _sheet_zoom_reset(); void _sheet_select_clear_all_frames(); protected: diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index 762f42abeb..6e722607f7 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -875,7 +875,7 @@ void TextureRegionEditor::_changed_callback(Object *p_changed, const char *p_pro if (!is_visible()) { return; } - if (p_prop == StringName("atlas") || p_prop == StringName("texture")) { + if (p_prop == StringName("atlas") || p_prop == StringName("texture") || p_prop == StringName("region")) { _edit_region(); } } diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp index 18a107ff75..932ded6938 100644 --- a/editor/plugins/theme_editor_plugin.cpp +++ b/editor/plugins/theme_editor_plugin.cpp @@ -206,8 +206,8 @@ void ThemeEditor::_save_template_cbk(String fname) { file->store_line("; [value] examples:"); file->store_line("; "); file->store_line("; Type.item = 6 ; numeric constant. "); - file->store_line("; Type.item = #FF00FF ; HTML color "); - file->store_line("; Type.item = #55FF00FF ; HTML color with alpha 55."); + file->store_line("; Type.item = #FF00FF ; HTML color (magenta)."); + file->store_line("; Type.item = #FF00FF55 ; HTML color (magenta with alpha 0x55)."); file->store_line("; Type.item = icon(image.png) ; icon in a png file (relative to theme file)."); file->store_line("; Type.item = font(font.xres) ; font in a resource (relative to theme file)."); file->store_line("; Type.item = sbox(stylebox.xres) ; stylebox in a resource (relative to theme file)."); @@ -629,7 +629,7 @@ ThemeEditor::ThemeEditor() { ScrollContainer *scroll = memnew(ScrollContainer); add_child(scroll); scroll->set_enable_v_scroll(true); - scroll->set_enable_h_scroll(false); + scroll->set_enable_h_scroll(true); scroll->set_v_size_flags(SIZE_EXPAND_FILL); MarginContainer *root_container = memnew(MarginContainer); diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp index 307a8a9001..e71485e9fc 100644 --- a/editor/plugins/tile_map_editor_plugin.cpp +++ b/editor/plugins/tile_map_editor_plugin.cpp @@ -886,17 +886,17 @@ void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p rect.position += tile_ofs; } - rect.position = p_xform.xform(rect.position); - rect.size *= sc; - Color modulate = node->get_tileset()->tile_get_modulate(p_cell); modulate.a = 0.5; + Transform2D old_transform = p_viewport->get_viewport_transform(); + p_viewport->draw_set_transform_matrix(p_xform); // Take into account TileMap transformation when displaying cell if (r.has_no_area()) { p_viewport->draw_texture_rect(t, rect, false, modulate, p_transpose); } else { p_viewport->draw_texture_rect_region(t, rect, r, modulate, p_transpose); } + p_viewport->draw_set_transform_matrix(old_transform); } void TileMapEditor::_draw_fill_preview(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i &p_autotile_coord, const Transform2D &p_xform) { diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp index a613174ed9..274c64263f 100644 --- a/editor/plugins/tile_set_editor_plugin.cpp +++ b/editor/plugins/tile_set_editor_plugin.cpp @@ -342,11 +342,13 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) { left_container->add_child(tileset_toolbar_container); tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE] = memnew(Button); + tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_flat(true); tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tileset_toolbar_button_pressed), varray(TOOL_TILESET_ADD_TEXTURE)); tileset_toolbar_container->add_child(tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]); tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_tooltip(TTR("Add Texture(s) to TileSet.")); tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE] = memnew(Button); + tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_flat(true); tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tileset_toolbar_button_pressed), varray(TOOL_TILESET_REMOVE_TEXTURE)); tileset_toolbar_container->add_child(tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]); tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_tooltip(TTR("Remove selected Texture from TileSet.")); @@ -405,12 +407,14 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) { tools[SELECT_NEXT] = memnew(Button); tool_hb->add_child(tools[SELECT_NEXT]); tool_hb->move_child(tools[SELECT_NEXT], WORKSPACE_CREATE_SINGLE); + tools[SELECT_NEXT]->set_flat(true); tools[SELECT_NEXT]->set_shortcut(ED_SHORTCUT("tileset_editor/next_shape", TTR("Next Coordinate"), KEY_PAGEDOWN)); tools[SELECT_NEXT]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SELECT_NEXT)); tools[SELECT_NEXT]->set_tooltip(TTR("Select the next shape, subtile, or Tile.")); tools[SELECT_PREVIOUS] = memnew(Button); tool_hb->add_child(tools[SELECT_PREVIOUS]); tool_hb->move_child(tools[SELECT_PREVIOUS], WORKSPACE_CREATE_SINGLE); + tools[SELECT_PREVIOUS]->set_flat(true); tools[SELECT_PREVIOUS]->set_shortcut(ED_SHORTCUT("tileset_editor/previous_shape", TTR("Previous Coordinate"), KEY_PAGEUP)); tools[SELECT_PREVIOUS]->set_tooltip(TTR("Select the previous shape, subtile, or Tile.")); tools[SELECT_PREVIOUS]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SELECT_PREVIOUS)); @@ -467,6 +471,7 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) { tools[TOOL_SELECT] = memnew(Button); toolbar->add_child(tools[TOOL_SELECT]); + tools[TOOL_SELECT]->set_flat(true); tools[TOOL_SELECT]->set_toggle_mode(true); tools[TOOL_SELECT]->set_button_group(tg); tools[TOOL_SELECT]->set_pressed(true); @@ -475,20 +480,24 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) { separator_bitmask = memnew(VSeparator); toolbar->add_child(separator_bitmask); tools[BITMASK_COPY] = memnew(Button); + tools[BITMASK_COPY]->set_flat(true); tools[BITMASK_COPY]->set_tooltip(TTR("Copy bitmask.")); tools[BITMASK_COPY]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(BITMASK_COPY)); toolbar->add_child(tools[BITMASK_COPY]); tools[BITMASK_PASTE] = memnew(Button); + tools[BITMASK_PASTE]->set_flat(true); tools[BITMASK_PASTE]->set_tooltip(TTR("Paste bitmask.")); tools[BITMASK_PASTE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(BITMASK_PASTE)); toolbar->add_child(tools[BITMASK_PASTE]); tools[BITMASK_CLEAR] = memnew(Button); + tools[BITMASK_CLEAR]->set_flat(true); tools[BITMASK_CLEAR]->set_tooltip(TTR("Erase bitmask.")); tools[BITMASK_CLEAR]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(BITMASK_CLEAR)); toolbar->add_child(tools[BITMASK_CLEAR]); tools[SHAPE_NEW_RECTANGLE] = memnew(Button); toolbar->add_child(tools[SHAPE_NEW_RECTANGLE]); + tools[SHAPE_NEW_RECTANGLE]->set_flat(true); tools[SHAPE_NEW_RECTANGLE]->set_toggle_mode(true); tools[SHAPE_NEW_RECTANGLE]->set_button_group(tg); tools[SHAPE_NEW_RECTANGLE]->set_tooltip(TTR("Create a new rectangle.")); @@ -496,6 +505,7 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) { tools[SHAPE_NEW_POLYGON] = memnew(Button); toolbar->add_child(tools[SHAPE_NEW_POLYGON]); + tools[SHAPE_NEW_POLYGON]->set_flat(true); tools[SHAPE_NEW_POLYGON]->set_toggle_mode(true); tools[SHAPE_NEW_POLYGON]->set_button_group(tg); tools[SHAPE_NEW_POLYGON]->set_tooltip(TTR("Create a new polygon.")); @@ -504,12 +514,14 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) { separator_shape_toggle = memnew(VSeparator); toolbar->add_child(separator_shape_toggle); tools[SHAPE_TOGGLE_TYPE] = memnew(Button); + tools[SHAPE_TOGGLE_TYPE]->set_flat(true); tools[SHAPE_TOGGLE_TYPE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SHAPE_TOGGLE_TYPE)); toolbar->add_child(tools[SHAPE_TOGGLE_TYPE]); separator_delete = memnew(VSeparator); toolbar->add_child(separator_delete); tools[SHAPE_DELETE] = memnew(Button); + tools[SHAPE_DELETE]->set_flat(true); tools[SHAPE_DELETE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SHAPE_DELETE)); toolbar->add_child(tools[SHAPE_DELETE]); @@ -534,11 +546,13 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) { separator_grid = memnew(VSeparator); toolbar->add_child(separator_grid); tools[SHAPE_KEEP_INSIDE_TILE] = memnew(Button); + tools[SHAPE_KEEP_INSIDE_TILE]->set_flat(true); tools[SHAPE_KEEP_INSIDE_TILE]->set_toggle_mode(true); tools[SHAPE_KEEP_INSIDE_TILE]->set_pressed(true); tools[SHAPE_KEEP_INSIDE_TILE]->set_tooltip(TTR("Keep polygon inside region Rect.")); toolbar->add_child(tools[SHAPE_KEEP_INSIDE_TILE]); tools[TOOL_GRID_SNAP] = memnew(Button); + tools[TOOL_GRID_SNAP]->set_flat(true); tools[TOOL_GRID_SNAP]->set_toggle_mode(true); tools[TOOL_GRID_SNAP]->set_tooltip(TTR("Enable snap and show grid (configurable via the Inspector).")); tools[TOOL_GRID_SNAP]->connect("toggled", callable_mp(this, &TileSetEditor::_on_grid_snap_toggled)); @@ -549,19 +563,23 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) { toolbar->add_child(separator); tools[ZOOM_OUT] = memnew(Button); + tools[ZOOM_OUT]->set_flat(true); tools[ZOOM_OUT]->connect("pressed", callable_mp(this, &TileSetEditor::_zoom_out)); toolbar->add_child(tools[ZOOM_OUT]); tools[ZOOM_OUT]->set_tooltip(TTR("Zoom Out")); tools[ZOOM_1] = memnew(Button); + tools[ZOOM_1]->set_flat(true); tools[ZOOM_1]->connect("pressed", callable_mp(this, &TileSetEditor::_zoom_reset)); toolbar->add_child(tools[ZOOM_1]); tools[ZOOM_1]->set_tooltip(TTR("Zoom Reset")); tools[ZOOM_IN] = memnew(Button); + tools[ZOOM_IN]->set_flat(true); tools[ZOOM_IN]->connect("pressed", callable_mp(this, &TileSetEditor::_zoom_in)); toolbar->add_child(tools[ZOOM_IN]); tools[ZOOM_IN]->set_tooltip(TTR("Zoom In")); tools[VISIBLE_INFO] = memnew(Button); + tools[VISIBLE_INFO]->set_flat(true); tools[VISIBLE_INFO]->set_toggle_mode(true); tools[VISIBLE_INFO]->set_tooltip(TTR("Display Tile Names (Hold Alt Key)")); toolbar->add_child(tools[VISIBLE_INFO]); diff --git a/editor/pot_generator.cpp b/editor/pot_generator.cpp index f9b8722aad..f09750efdc 100644 --- a/editor/pot_generator.cpp +++ b/editor/pot_generator.cpp @@ -31,23 +31,25 @@ #include "pot_generator.h" #include "core/error_macros.h" -#include "core/os/file_access.h" #include "core/project_settings.h" #include "editor_translation_parser.h" #include "plugins/packed_scene_translation_parser_plugin.h" POTGenerator *POTGenerator::singleton = nullptr; -//#define DEBUG_POT - #ifdef DEBUG_POT -void _print_all_translation_strings(const OrderedHashMap<String, Set<String>> &p_all_translation_strings) { - for (auto E_pair = p_all_translation_strings.front(); E_pair; E_pair = E_pair.next()) { - String msg = static_cast<String>(E_pair.key()) + " : "; - for (Set<String>::Element *E = E_pair.value().front(); E; E = E->next()) { - msg += E->get() + " "; +void POTGenerator::_print_all_translation_strings() { + for (auto E = all_translation_strings.front(); E; E = E.next()) { + Vector<MsgidData> v_md = all_translation_strings[E.key()]; + for (int i = 0; i < v_md.size(); i++) { + print_line("++++++"); + print_line("msgid: " + E.key()); + print_line("context: " + v_md[i].ctx); + print_line("msgid_plural: " + v_md[i].plural); + for (Set<String>::Element *E = v_md[i].locations.front(); E; E = E->next()) { + print_line("location: " + E->get()); + } } - print_line(msg); } } #endif @@ -65,27 +67,27 @@ void POTGenerator::generate_pot(const String &p_file) { // Collect all translatable strings according to files order in "POT Generation" setting. for (int i = 0; i < files.size(); i++) { - Vector<String> translation_strings; + Vector<String> msgids; + Vector<Vector<String>> msgids_context_plural; String file_path = files[i]; String file_extension = file_path.get_extension(); if (EditorTranslationParser::get_singleton()->can_parse(file_extension)) { - EditorTranslationParser::get_singleton()->get_parser(file_extension)->parse_file(file_path, &translation_strings); + EditorTranslationParser::get_singleton()->get_parser(file_extension)->parse_file(file_path, &msgids, &msgids_context_plural); } else { ERR_PRINT("Unrecognized file extension " + file_extension + " in generate_pot()"); return; } - // Store translation strings parsed in this iteration along with their corresponding source file - to write into POT later on. - for (int j = 0; j < translation_strings.size(); j++) { - all_translation_strings[translation_strings[j]].insert(file_path); + for (int j = 0; j < msgids_context_plural.size(); j++) { + Vector<String> entry = msgids_context_plural[j]; + _add_new_msgid(entry[0], entry[1], entry[2], file_path); + } + for (int j = 0; j < msgids.size(); j++) { + _add_new_msgid(msgids[j], "", "", file_path); } } -#ifdef DEBUG_POT - _print_all_translation_strings(all_translation_strings); -#endif - _write_to_pot(p_file); } @@ -119,35 +121,86 @@ void POTGenerator::_write_to_pot(const String &p_file) { file->store_string(header); - for (OrderedHashMap<String, Set<String>>::Element E_pair = all_translation_strings.front(); E_pair; E_pair = E_pair.next()) { - String msg = E_pair.key(); + for (OrderedHashMap<String, Vector<MsgidData>>::Element E_pair = all_translation_strings.front(); E_pair; E_pair = E_pair.next()) { + String msgid = E_pair.key(); + Vector<MsgidData> v_msgid_data = E_pair.value(); + for (int i = 0; i < v_msgid_data.size(); i++) { + String context = v_msgid_data[i].ctx; + String plural = v_msgid_data[i].plural; + const Set<String> &locations = v_msgid_data[i].locations; + + // Write file locations. + for (Set<String>::Element *E = locations.front(); E; E = E->next()) { + file->store_line("#: " + E->get().trim_prefix("res://")); + } - // Write file locations. - for (Set<String>::Element *E = E_pair.value().front(); E; E = E->next()) { - file->store_line("#: " + E->get().trim_prefix("res://")); - } + // Write context. + if (!context.empty()) { + file->store_line("msgctxt \"" + context + "\""); + } - // Split \\n and \n. - Vector<String> temp = msg.split("\\n"); - Vector<String> msg_lines; - for (int i = 0; i < temp.size(); i++) { - msg_lines.append_array(temp[i].split("\n")); - if (i < temp.size() - 1) { - // Add \n. - msg_lines.set(msg_lines.size() - 1, msg_lines[msg_lines.size() - 1] + "\\n"); + // Write msgid. + _write_msgid(file, msgid, false); + + // Write msgid_plural + if (!plural.empty()) { + _write_msgid(file, plural, true); + file->store_line("msgstr[0] \"\""); + file->store_line("msgstr[1] \"\"\n"); + } else { + file->store_line("msgstr \"\"\n"); } } + } - // Write msgid. - file->store_string("msgid "); - for (int i = 0; i < msg_lines.size(); i++) { - file->store_line("\"" + msg_lines[i] + "\""); + file->close(); +} + +void POTGenerator::_write_msgid(FileAccess *r_file, const String &p_id, bool p_plural) { + // Split \\n and \n. + Vector<String> temp = p_id.split("\\n"); + Vector<String> msg_lines; + for (int i = 0; i < temp.size(); i++) { + msg_lines.append_array(temp[i].split("\n")); + if (i < temp.size() - 1) { + // Add \n. + msg_lines.set(msg_lines.size() - 1, msg_lines[msg_lines.size() - 1] + "\\n"); } + } - file->store_line("msgstr \"\"\n"); + if (p_plural) { + r_file->store_string("msgid_plural "); + } else { + r_file->store_string("msgid "); } - file->close(); + for (int i = 0; i < msg_lines.size(); i++) { + r_file->store_line("\"" + msg_lines[i] + "\""); + } +} + +void POTGenerator::_add_new_msgid(const String &p_msgid, const String &p_context, const String &p_plural, const String &p_location) { + // Insert new location if msgid under same context exists already. + if (all_translation_strings.has(p_msgid)) { + Vector<MsgidData> &v_mdata = all_translation_strings[p_msgid]; + for (int i = 0; i < v_mdata.size(); i++) { + if (v_mdata[i].ctx == p_context) { + if (!v_mdata[i].plural.empty() && !p_plural.empty() && v_mdata[i].plural != p_plural) { + WARN_PRINT("Redefinition of plural message (msgid_plural), under the same message (msgid) and context (msgctxt)"); + } + v_mdata.write[i].locations.insert(p_location); + return; + } + } + } + + // Add a new entry of msgid, context, plural and location - context and plural might be empty if the inserted msgid doesn't associated + // context or plurals. + MsgidData mdata; + mdata.ctx = p_context; + mdata.plural = p_plural; + mdata.locations.insert(p_location); + all_translation_strings[p_msgid].push_back(mdata); } POTGenerator *POTGenerator::get_singleton() { diff --git a/editor/pot_generator.h b/editor/pot_generator.h index abe1a21d41..8853b784ed 100644 --- a/editor/pot_generator.h +++ b/editor/pot_generator.h @@ -32,14 +32,29 @@ #define POT_GENERATOR_H #include "core/ordered_hash_map.h" +#include "core/os/file_access.h" #include "core/set.h" +//#define DEBUG_POT + class POTGenerator { static POTGenerator *singleton; - // Stores all translatable strings and the source files containing them. - OrderedHashMap<String, Set<String>> all_translation_strings; + + struct MsgidData { + String ctx; + String plural; + Set<String> locations; + }; + // Store msgid as key and the additional data around the msgid - if it's under a context, has plurals and its file locations. + OrderedHashMap<String, Vector<MsgidData>> all_translation_strings; void _write_to_pot(const String &p_file); + void _write_msgid(FileAccess *r_file, const String &p_id, bool p_plural); + void _add_new_msgid(const String &p_msgid, const String &p_context, const String &p_plural, const String &p_location); + +#ifdef DEBUG_POT + void _print_all_translation_strings(); +#endif public: static POTGenerator *get_singleton(); diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index a68742a985..a316756808 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -330,6 +330,7 @@ private: return; } } + String sp = p.simplify_path(); project_path->set_text(sp); _path_text_changed(sp); @@ -475,10 +476,12 @@ private: set_message(TTR("Couldn't create project.godot in project path."), MESSAGE_ERROR); } else { f->store_line("[gd_resource type=\"Environment\" load_steps=2 format=2]"); + f->store_line(""); f->store_line("[sub_resource type=\"Sky\" id=1]"); + f->store_line(""); f->store_line("[resource]"); f->store_line("background_mode = 2"); - f->store_line("background_sky = SubResource( 1 )"); + f->store_line("sky = SubResource( 1 )"); memdelete(f); } } @@ -1010,7 +1013,7 @@ public: void update_dock_menu(); void load_projects(); void set_search_term(String p_search_term); - void set_order_option(ProjectListFilter::FilterOption p_option); + void set_order_option(int p_option); void sort_projects(); int get_project_count() const; void select_project(int p_index); @@ -1043,7 +1046,7 @@ private: static void load_project_data(const String &p_property_key, Item &p_item, bool p_favorite); String _search_term; - ProjectListFilter::FilterOption _order_option; + FilterOption _order_option; Set<String> _selected_project_keys; String _last_clicked; // Project key VBoxContainer *_scroll_children; @@ -1053,7 +1056,7 @@ private: }; struct ProjectListComparator { - ProjectListFilter::FilterOption order_option; + FilterOption order_option; // operator< _FORCE_INLINE_ bool operator()(const ProjectList::Item &a, const ProjectList::Item &b) const { @@ -1064,9 +1067,9 @@ struct ProjectListComparator { return false; } switch (order_option) { - case ProjectListFilter::FILTER_PATH: + case PATH: return a.project_key < b.project_key; - case ProjectListFilter::FILTER_EDIT_DATE: + case EDIT_DATE: return a.last_edited > b.last_edited; default: return a.project_name < b.project_name; @@ -1075,8 +1078,7 @@ struct ProjectListComparator { }; ProjectList::ProjectList() { - _order_option = ProjectListFilter::FILTER_EDIT_DATE; - + _order_option = FilterOption::NAME; _scroll_children = memnew(VBoxContainer); _scroll_children->set_h_size_flags(Control::SIZE_EXPAND_FILL); add_child(_scroll_children); @@ -1236,8 +1238,6 @@ void ProjectList::load_projects() { create_project_item_control(i); } - sort_projects(); - set_v_scroll(0); update_icons_async(); @@ -1389,12 +1389,13 @@ void ProjectList::set_search_term(String p_search_term) { _search_term = p_search_term; } -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)_order_option); - EditorSettings::get_singleton()->save(); - } +void ProjectList::set_order_option(int p_option) { + FilterOption selected = (FilterOption)p_option; + EditorSettings::get_singleton()->set("project_manager/sorting_order", p_option); + EditorSettings::get_singleton()->save(); + _order_option = selected; + + sort_projects(); } void ProjectList::sort_projects() { @@ -1796,6 +1797,9 @@ void ProjectList::_bind_methods() { void ProjectManager::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { + search_box->set_right_icon(get_theme_icon("Search", "EditorIcons")); + search_box->set_clear_button_enabled(true); + Engine::get_singleton()->set_editor_hint(false); } break; case NOTIFICATION_RESIZED: { @@ -1804,6 +1808,10 @@ void ProjectManager::_notification(int p_what) { } } break; case NOTIFICATION_READY: { + int default_sorting = (int)EditorSettings::get_singleton()->get("project_manager/sorting_order"); + filter_option->select(default_sorting); + _project_list->set_order_option(default_sorting); + if (_project_list->get_project_count() == 0 && StreamPeerSSL::is_available()) { open_templates->popup_centered(); } @@ -1811,7 +1819,7 @@ void ProjectManager::_notification(int p_what) { if (_project_list->get_project_count() >= 1) { // Focus on the search box immediately to allow the user // to search without having to reach for their mouse - project_filter->search_box->grab_focus(); + search_box->grab_focus(); } } break; case NOTIFICATION_VISIBILITY_CHANGED: { @@ -1831,7 +1839,7 @@ void ProjectManager::_dim_window() { // No transition is applied, as the effect needs to be visible immediately float c = 0.5f; Color dim_color = Color(c, c, c); - gui_base->set_modulate(dim_color); + set_modulate(dim_color); } void ProjectManager::_update_project_buttons() { @@ -1851,7 +1859,7 @@ void ProjectManager::_update_project_buttons() { 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()); + erase_missing_btn->set_disabled(!_project_list->is_any_project_missing()); } void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) { @@ -1928,7 +1936,7 @@ void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) { } break; case KEY_F: { if (k->get_command()) { - this->project_filter->search_box->grab_focus(); + this->search_box->grab_focus(); } else { keycode_handled = false; } @@ -1945,8 +1953,7 @@ void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) { } void ProjectManager::_load_recent_projects() { - _project_list->set_order_option(project_order_filter->get_filter_option()); - _project_list->set_search_term(project_filter->get_search_term()); + _project_list->set_search_term(search_box->get_text().strip_edges()); _project_list->load_projects(); _update_project_buttons(); @@ -1968,7 +1975,7 @@ void ProjectManager::_on_projects_updated() { } void ProjectManager::_on_project_created(const String &dir) { - project_filter->clear(); + search_box->clear(); int i = _project_list->refresh_project(dir); _project_list->select_project(i); _project_list->ensure_project_visible(i); @@ -2111,7 +2118,6 @@ void ProjectManager::_run_project_confirm() { } } -// When you press the "Run" button void ProjectManager::_run_project() { const Set<String> &selected_list = _project_list->get_selected_project_keys(); @@ -2224,8 +2230,6 @@ void ProjectManager::_erase_missing_projects() { void ProjectManager::_language_selected(int p_id) { String lang = language_btn->get_item_metadata(p_id); EditorSettings::get_singleton()->set("interface/editor/editor_language", lang); - language_btn->set_text(lang); - language_btn->set_icon(get_theme_icon("Environment", "EditorIcons")); language_restart_ask->set_text(TTR("Language changed.\nThe interface will update after restarting the editor or project manager.")); language_restart_ask->popup_centered(); @@ -2302,13 +2306,14 @@ void ProjectManager::_scan_multiple_folders(PackedStringArray p_files) { } } -void ProjectManager::_on_order_option_changed() { - _project_list->set_order_option(project_order_filter->get_filter_option()); - _project_list->sort_projects(); +void ProjectManager::_on_order_option_changed(int p_idx) { + if (is_inside_tree()) { + _project_list->set_order_option(p_idx); + } } -void ProjectManager::_on_filter_option_changed() { - _project_list->set_search_term(project_filter->get_search_term()); +void ProjectManager::_on_search_term_changed(const String &p_term) { + _project_list->set_search_term(p_term); _project_list->sort_projects(); // Select the first visible project in the list. @@ -2339,7 +2344,6 @@ ProjectManager::ProjectManager() { { int display_scale = EditorSettings::get_singleton()->get("interface/editor/display_scale"); - float custom_display_scale = EditorSettings::get_singleton()->get("interface/editor/custom_display_scale"); switch (display_scale) { case 0: { @@ -2370,9 +2374,8 @@ ProjectManager::ProjectManager() { case 6: editor_set_scale(2.0); break; - default: { - editor_set_scale(custom_display_scale); + editor_set_scale(EditorSettings::get_singleton()->get("interface/editor/custom_display_scale")); } break; } @@ -2383,28 +2386,26 @@ ProjectManager::ProjectManager() { DisplayServer::get_singleton()->window_set_size(DisplayServer::get_singleton()->window_get_size() * MAX(1, EDSCALE)); } + String cp; + cp += 0xA9; + DisplayServer::get_singleton()->window_set_title(VERSION_NAME + String(" - ") + TTR("Project Manager") + " - " + cp + " 2007-2020 Juan Linietsky, Ariel Manzur & Godot Contributors"); + FileDialog::set_default_show_hidden_files(EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files")); set_anchors_and_margins_preset(Control::PRESET_WIDE); set_theme(create_custom_theme()); - gui_base = memnew(Control); - add_child(gui_base); - gui_base->set_anchors_and_margins_preset(Control::PRESET_WIDE); + set_anchors_and_margins_preset(Control::PRESET_WIDE); Panel *panel = memnew(Panel); - gui_base->add_child(panel); + add_child(panel); panel->set_anchors_and_margins_preset(Control::PRESET_WIDE); - panel->add_theme_style_override("panel", gui_base->get_theme_stylebox("Background", "EditorStyles")); + panel->add_theme_style_override("panel", get_theme_stylebox("Background", "EditorStyles")); VBoxContainer *vb = memnew(VBoxContainer); panel->add_child(vb); vb->set_anchors_and_margins_preset(Control::PRESET_WIDE, Control::PRESET_MODE_MINSIZE, 8 * EDSCALE); - String cp; - cp += 0xA9; - DisplayServer::get_singleton()->window_set_title(VERSION_NAME + String(" - ") + TTR("Project Manager") + " - " + cp + " 2007-2020 Juan Linietsky, Ariel Manzur & Godot Contributors"); - Control *center_box = memnew(Control); center_box->set_v_size_flags(Control::SIZE_EXPAND_FILL); vb->add_child(center_box); @@ -2414,218 +2415,231 @@ ProjectManager::ProjectManager() { 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; - + HBoxContainer *projects_hb = memnew(HBoxContainer); projects_hb->set_name(TTR("Projects")); + tabs->add_child(projects_hb); - tabs->add_child(tree_hb); - - VBoxContainer *search_tree_vb = memnew(VBoxContainer); - tree_hb->add_child(search_tree_vb); - search_tree_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL); - - HBoxContainer *sort_filters = memnew(HBoxContainer); - Label *sort_label = memnew(Label); - sort_label->set_text(TTR("Sort:")); - sort_filters->add_child(sort_label); - Vector<String> sort_filter_titles; - sort_filter_titles.push_back(TTR("Name")); - sort_filter_titles.push_back(TTR("Path")); - sort_filter_titles.push_back(TTR("Last Edited")); - 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); - project_order_filter->connect("filter_changed", callable_mp(this, &ProjectManager::_on_order_option_changed)); - project_order_filter->set_custom_minimum_size(Size2(180, 10) * EDSCALE); - - int projects_sorting_order = (int)EditorSettings::get_singleton()->get("project_manager/sorting_order"); - project_order_filter->set_filter_option((ProjectListFilter::FilterOption)projects_sorting_order); - - sort_filters->add_spacer(true); - - project_filter = memnew(ProjectListFilter); - project_filter->add_search_box(); - project_filter->connect("filter_changed", callable_mp(this, &ProjectManager::_on_filter_option_changed)); - project_filter->set_custom_minimum_size(Size2(280, 10) * EDSCALE); - sort_filters->add_child(project_filter); - - search_tree_vb->add_child(sort_filters); - - PanelContainer *pc = memnew(PanelContainer); - pc->add_theme_style_override("panel", gui_base->get_theme_stylebox("bg", "Tree")); - search_tree_vb->add_child(pc); - pc->set_v_size_flags(Control::SIZE_EXPAND_FILL); - - _project_list = memnew(ProjectList); - _project_list->connect(ProjectList::SIGNAL_SELECTION_CHANGED, callable_mp(this, &ProjectManager::_update_project_buttons)); - _project_list->connect(ProjectList::SIGNAL_PROJECT_ASK_OPEN, callable_mp(this, &ProjectManager::_open_selected_projects_ask)); - pc->add_child(_project_list); - _project_list->set_enable_h_scroll(false); - - VBoxContainer *tree_vb = memnew(VBoxContainer); - tree_hb->add_child(tree_vb); - - Button *open = memnew(Button); - open->set_text(TTR("Edit")); - tree_vb->add_child(open); - open->connect("pressed", callable_mp(this, &ProjectManager::_open_selected_projects_ask)); - open_btn = open; - - Button *run = memnew(Button); - run->set_text(TTR("Run")); - tree_vb->add_child(run); - run->connect("pressed", callable_mp(this, &ProjectManager::_run_project)); - run_btn = run; - - tree_vb->add_child(memnew(HSeparator)); - - Button *scan = memnew(Button); - scan->set_text(TTR("Scan")); - tree_vb->add_child(scan); - scan->connect("pressed", callable_mp(this, &ProjectManager::_scan_projects)); - - tree_vb->add_child(memnew(HSeparator)); - - scan_dir = memnew(FileDialog); - scan_dir->set_access(FileDialog::ACCESS_FILESYSTEM); - scan_dir->set_file_mode(FileDialog::FILE_MODE_OPEN_DIR); - scan_dir->set_title(TTR("Select a Folder to Scan")); // must be after mode or it's overridden - scan_dir->set_current_dir(EditorSettings::get_singleton()->get("filesystem/directories/default_project_path")); - gui_base->add_child(scan_dir); - scan_dir->connect("dir_selected", callable_mp(this, &ProjectManager::_scan_begin)); - - Button *create = memnew(Button); - create->set_text(TTR("New Project")); - tree_vb->add_child(create); - create->connect("pressed", callable_mp(this, &ProjectManager::_new_project)); - - Button *import = memnew(Button); - import->set_text(TTR("Import")); - tree_vb->add_child(import); - import->connect("pressed", callable_mp(this, &ProjectManager::_import_project)); - - Button *rename = memnew(Button); - rename->set_text(TTR("Rename")); - tree_vb->add_child(rename); - rename->connect("pressed", callable_mp(this, &ProjectManager::_rename_project)); - rename_btn = rename; - - Button *erase = memnew(Button); - erase->set_text(TTR("Remove")); - tree_vb->add_child(erase); - erase->connect("pressed", callable_mp(this, &ProjectManager::_erase_project)); - erase_btn = erase; - - Button *erase_missing = memnew(Button); - erase_missing->set_text(TTR("Remove Missing")); - tree_vb->add_child(erase_missing); - erase_missing->connect("pressed", callable_mp(this, &ProjectManager::_erase_missing_projects)); - erase_missing_btn = erase_missing; - - tree_vb->add_spacer(); + { + // Projects + search bar + VBoxContainer *search_tree_vb = memnew(VBoxContainer); + projects_hb->add_child(search_tree_vb); + search_tree_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL); - if (StreamPeerSSL::is_available()) { - asset_library = memnew(EditorAssetLibrary(true)); - asset_library->set_name(TTR("Templates")); - tabs->add_child(asset_library); - asset_library->connect("install_asset", callable_mp(this, &ProjectManager::_install_project)); - } else { - WARN_PRINT("Asset Library not available, as it requires SSL to work."); - } + HBoxContainer *hb = memnew(HBoxContainer); + hb->set_h_size_flags(Control::SIZE_EXPAND_FILL); + search_tree_vb->add_child(hb); - HBoxContainer *settings_hb = memnew(HBoxContainer); - settings_hb->set_alignment(BoxContainer::ALIGN_END); - settings_hb->set_h_grow_direction(Control::GROW_DIRECTION_BEGIN); + search_box = memnew(LineEdit); + search_box->set_placeholder(TTR("Search")); + search_box->set_tooltip(TTR("The search box filters projects by name and last path component.\nTo filter projects by name and full path, the query must contain at least one `/` character.")); + search_box->connect("text_changed", callable_mp(this, &ProjectManager::_on_search_term_changed)); + search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); + hb->add_child(search_box); - 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); + hb->add_spacer(); - language_btn = memnew(OptionButton); - language_btn->set_flat(true); - language_btn->set_focus_mode(Control::FOCUS_NONE); + Label *sort_label = memnew(Label); + sort_label->set_text(TTR("Sort:")); + hb->add_child(sort_label); - Vector<String> editor_languages; - List<PropertyInfo> editor_settings_properties; - EditorSettings::get_singleton()->get_property_list(&editor_settings_properties); - for (List<PropertyInfo>::Element *E = editor_settings_properties.front(); E; E = E->next()) { - PropertyInfo &pi = E->get(); - if (pi.name == "interface/editor/editor_language") { - editor_languages = pi.hint_string.split(","); - } - } - String current_lang = EditorSettings::get_singleton()->get("interface/editor/editor_language"); - for (int i = 0; i < editor_languages.size(); i++) { - String lang = editor_languages[i]; - String lang_name = TranslationServer::get_singleton()->get_locale_name(lang); - language_btn->add_item(lang_name + " [" + lang + "]", i); - language_btn->set_item_metadata(i, lang); - if (current_lang == lang) { - language_btn->select(i); - language_btn->set_text(lang); - } - } - language_btn->set_icon(get_theme_icon("Environment", "EditorIcons")); + filter_option = memnew(OptionButton); + filter_option->set_clip_text(true); + filter_option->set_custom_minimum_size(Size2(150 * EDSCALE, 10 * EDSCALE)); + filter_option->connect("item_selected", callable_mp(this, &ProjectManager::_on_order_option_changed)); + hb->add_child(filter_option); - settings_hb->add_child(language_btn); - language_btn->connect("item_selected", callable_mp(this, &ProjectManager::_language_selected)); + Vector<String> sort_filter_titles; + sort_filter_titles.push_back(TTR("Name")); + sort_filter_titles.push_back(TTR("Path")); + sort_filter_titles.push_back(TTR("Last Edited")); - center_box->add_child(settings_hb); - settings_hb->set_anchors_and_margins_preset(Control::PRESET_TOP_RIGHT); + for (int i = 0; i < sort_filter_titles.size(); i++) { + filter_option->add_item(sort_filter_titles[i]); + } - ////////////////////////////////////////////////////////////// + PanelContainer *pc = memnew(PanelContainer); + pc->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree")); + pc->set_v_size_flags(Control::SIZE_EXPAND_FILL); + search_tree_vb->add_child(pc); - language_restart_ask = memnew(ConfirmationDialog); - language_restart_ask->get_ok()->set_text(TTR("Restart Now")); - language_restart_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_restart_confirm)); - language_restart_ask->get_cancel()->set_text(TTR("Continue")); - gui_base->add_child(language_restart_ask); + _project_list = memnew(ProjectList); + _project_list->connect(ProjectList::SIGNAL_SELECTION_CHANGED, callable_mp(this, &ProjectManager::_update_project_buttons)); + _project_list->connect(ProjectList::SIGNAL_PROJECT_ASK_OPEN, callable_mp(this, &ProjectManager::_open_selected_projects_ask)); + _project_list->set_enable_h_scroll(false); + pc->add_child(_project_list); + } - erase_missing_ask = memnew(ConfirmationDialog); - erase_missing_ask->get_ok()->set_text(TTR("Remove All")); - erase_missing_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_erase_missing_projects_confirm)); - gui_base->add_child(erase_missing_ask); + { + // Project tab side bar + VBoxContainer *tree_vb = memnew(VBoxContainer); + tree_vb->set_custom_minimum_size(Size2(120, 120)); + projects_hb->add_child(tree_vb); + + Button *create = memnew(Button); + create->set_text(TTR("New Project")); + create->connect("pressed", callable_mp(this, &ProjectManager::_new_project)); + tree_vb->add_child(create); + + Button *import = memnew(Button); + import->set_text(TTR("Import")); + import->connect("pressed", callable_mp(this, &ProjectManager::_import_project)); + tree_vb->add_child(import); + + Button *scan = memnew(Button); + scan->set_text(TTR("Scan")); + scan->connect("pressed", callable_mp(this, &ProjectManager::_scan_projects)); + tree_vb->add_child(scan); + + tree_vb->add_child(memnew(HSeparator)); + + open_btn = memnew(Button); + open_btn->set_text(TTR("Edit")); + open_btn->connect("pressed", callable_mp(this, &ProjectManager::_open_selected_projects_ask)); + tree_vb->add_child(open_btn); + + run_btn = memnew(Button); + run_btn->set_text(TTR("Run")); + run_btn->connect("pressed", callable_mp(this, &ProjectManager::_run_project)); + tree_vb->add_child(run_btn); + + rename_btn = memnew(Button); + rename_btn->set_text(TTR("Rename")); + rename_btn->connect("pressed", callable_mp(this, &ProjectManager::_rename_project)); + tree_vb->add_child(rename_btn); + + erase_btn = memnew(Button); + erase_btn->set_text(TTR("Remove")); + erase_btn->connect("pressed", callable_mp(this, &ProjectManager::_erase_project)); + tree_vb->add_child(erase_btn); + + erase_missing_btn = memnew(Button); + erase_missing_btn->set_text(TTR("Remove Missing")); + erase_missing_btn->connect("pressed", callable_mp(this, &ProjectManager::_erase_missing_projects)); + tree_vb->add_child(erase_missing_btn); + } - erase_ask = memnew(ConfirmationDialog); - erase_ask->get_ok()->set_text(TTR("Remove")); - erase_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_erase_project_confirm)); - gui_base->add_child(erase_ask); + { + // Version info and language options + HBoxContainer *settings_hb = memnew(HBoxContainer); + 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); + 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_icon(get_theme_icon("Environment", "EditorIcons")); + language_btn->set_focus_mode(Control::FOCUS_NONE); + language_btn->connect("item_selected", callable_mp(this, &ProjectManager::_language_selected)); + + Vector<String> editor_languages; + List<PropertyInfo> editor_settings_properties; + EditorSettings::get_singleton()->get_property_list(&editor_settings_properties); + for (List<PropertyInfo>::Element *E = editor_settings_properties.front(); E; E = E->next()) { + PropertyInfo &pi = E->get(); + if (pi.name == "interface/editor/editor_language") { + editor_languages = pi.hint_string.split(","); + break; + } + } - multi_open_ask = memnew(ConfirmationDialog); - multi_open_ask->get_ok()->set_text(TTR("Edit")); - multi_open_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_open_selected_projects)); - gui_base->add_child(multi_open_ask); + String current_lang = EditorSettings::get_singleton()->get("interface/editor/editor_language"); + language_btn->set_text(current_lang); - multi_run_ask = memnew(ConfirmationDialog); - multi_run_ask->get_ok()->set_text(TTR("Run")); - multi_run_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_run_project_confirm)); - gui_base->add_child(multi_run_ask); + for (int i = 0; i < editor_languages.size(); i++) { + String lang = editor_languages[i]; + String lang_name = TranslationServer::get_singleton()->get_locale_name(lang); + language_btn->add_item(lang_name + " [" + lang + "]", i); + language_btn->set_item_metadata(i, lang); + if (current_lang == lang) { + language_btn->select(i); + } + } - multi_scan_ask = memnew(ConfirmationDialog); - multi_scan_ask->get_ok()->set_text(TTR("Scan")); - gui_base->add_child(multi_scan_ask); + settings_hb->add_child(language_btn); + center_box->add_child(settings_hb); + settings_hb->set_anchors_and_margins_preset(Control::PRESET_TOP_RIGHT); + } - ask_update_settings = memnew(ConfirmationDialog); - ask_update_settings->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_confirm_update_settings)); - gui_base->add_child(ask_update_settings); + if (StreamPeerSSL::is_available()) { + asset_library = memnew(EditorAssetLibrary(true)); + asset_library->set_name(TTR("Templates")); + tabs->add_child(asset_library); + asset_library->connect("install_asset", callable_mp(this, &ProjectManager::_install_project)); + } else { + WARN_PRINT("Asset Library not available, as it requires SSL to work."); + } - OS::get_singleton()->set_low_processor_usage_mode(true); + { + // Dialogs + language_restart_ask = memnew(ConfirmationDialog); + language_restart_ask->get_ok()->set_text(TTR("Restart Now")); + language_restart_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_restart_confirm)); + language_restart_ask->get_cancel()->set_text(TTR("Continue")); + add_child(language_restart_ask); + + scan_dir = memnew(FileDialog); + scan_dir->set_access(FileDialog::ACCESS_FILESYSTEM); + scan_dir->set_file_mode(FileDialog::FILE_MODE_OPEN_DIR); + scan_dir->set_title(TTR("Select a Folder to Scan")); // must be after mode or it's overridden + scan_dir->set_current_dir(EditorSettings::get_singleton()->get("filesystem/directories/default_project_path")); + add_child(scan_dir); + scan_dir->connect("dir_selected", callable_mp(this, &ProjectManager::_scan_begin)); + + erase_missing_ask = memnew(ConfirmationDialog); + erase_missing_ask->get_ok()->set_text(TTR("Remove All")); + erase_missing_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_erase_missing_projects_confirm)); + add_child(erase_missing_ask); + + erase_ask = memnew(ConfirmationDialog); + erase_ask->get_ok()->set_text(TTR("Remove")); + erase_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_erase_project_confirm)); + add_child(erase_ask); + + multi_open_ask = memnew(ConfirmationDialog); + multi_open_ask->get_ok()->set_text(TTR("Edit")); + multi_open_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_open_selected_projects)); + add_child(multi_open_ask); + + multi_run_ask = memnew(ConfirmationDialog); + multi_run_ask->get_ok()->set_text(TTR("Run")); + multi_run_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_run_project_confirm)); + add_child(multi_run_ask); + + multi_scan_ask = memnew(ConfirmationDialog); + multi_scan_ask->get_ok()->set_text(TTR("Scan")); + add_child(multi_scan_ask); + + ask_update_settings = memnew(ConfirmationDialog); + ask_update_settings->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_confirm_update_settings)); + add_child(ask_update_settings); + + npdialog = memnew(ProjectDialog); + npdialog->connect("projects_updated", callable_mp(this, &ProjectManager::_on_projects_updated)); + npdialog->connect("project_created", callable_mp(this, &ProjectManager::_on_project_created)); + add_child(npdialog); + + run_error_diag = memnew(AcceptDialog); + run_error_diag->set_title(TTR("Can't run project")); + add_child(run_error_diag); - npdialog = memnew(ProjectDialog); - gui_base->add_child(npdialog); + dialog_error = memnew(AcceptDialog); + add_child(dialog_error); - npdialog->connect("projects_updated", callable_mp(this, &ProjectManager::_on_projects_updated)); - npdialog->connect("project_created", callable_mp(this, &ProjectManager::_on_project_created)); + open_templates = memnew(ConfirmationDialog); + open_templates->set_text(TTR("You currently don't have any projects.\nWould you like to explore official example projects in the Asset Library?")); + open_templates->get_ok()->set_text(TTR("Open Asset Library")); + open_templates->connect("confirmed", callable_mp(this, &ProjectManager::_open_asset_library)); + add_child(open_templates); + } _load_recent_projects(); @@ -2635,18 +2649,7 @@ ProjectManager::ProjectManager() { SceneTree::get_singleton()->get_root()->connect("files_dropped", callable_mp(this, &ProjectManager::_files_dropped)); - run_error_diag = memnew(AcceptDialog); - gui_base->add_child(run_error_diag); - run_error_diag->set_title(TTR("Can't run project")); - - dialog_error = memnew(AcceptDialog); - gui_base->add_child(dialog_error); - - open_templates = memnew(ConfirmationDialog); - open_templates->set_text(TTR("You currently don't have any projects.\nWould you like to explore official example projects in the Asset Library?")); - open_templates->get_ok()->set_text(TTR("Open Asset Library")); - open_templates->connect("confirmed", callable_mp(this, &ProjectManager::_open_asset_library)); - add_child(open_templates); + OS::get_singleton()->set_low_processor_usage_mode(true); } ProjectManager::~ProjectManager() { @@ -2654,82 +2657,3 @@ ProjectManager::~ProjectManager() { EditorSettings::destroy(); } } - -void ProjectListFilter::_setup_filters(Vector<String> options) { - filter_option->clear(); - for (int i = 0; i < options.size(); i++) { - filter_option->add_item(options[i]); - } -} - -void ProjectListFilter::_search_text_changed(const String &p_newtext) { - emit_signal("filter_changed"); -} - -String ProjectListFilter::get_search_term() { - return search_box->get_text().strip_edges(); -} - -ProjectListFilter::FilterOption ProjectListFilter::get_filter_option() { - return _current_filter; -} - -void ProjectListFilter::set_filter_option(FilterOption option) { - filter_option->select((int)option); - _filter_option_selected(0); -} - -void ProjectListFilter::_filter_option_selected(int p_idx) { - FilterOption selected = (FilterOption)(filter_option->get_selected()); - if (_current_filter != selected) { - _current_filter = selected; - if (is_inside_tree()) { - emit_signal("filter_changed"); - } - } -} - -void ProjectListFilter::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE && has_search_box) { - search_box->set_right_icon(get_theme_icon("Search", "EditorIcons")); - search_box->set_clear_button_enabled(true); - } -} - -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", callable_mp(this, &ProjectListFilter::_filter_option_selected)); - add_child(filter_option); -} - -void ProjectListFilter::add_search_box() { - search_box = memnew(LineEdit); - search_box->set_placeholder(TTR("Search")); - search_box->set_tooltip( - TTR("The search box filters projects by name and last path component.\nTo filter projects by name and full path, the query must contain at least one `/` character.")); - search_box->connect("text_changed", callable_mp(this, &ProjectListFilter::_search_text_changed)); - search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); - add_child(search_box); - - has_search_box = true; -} - -void ProjectListFilter::set_filter_size(int h_size) { - filter_option->set_custom_minimum_size(Size2(h_size * EDSCALE, 10 * EDSCALE)); -} - -ProjectListFilter::ProjectListFilter() { - _current_filter = FILTER_NAME; - has_search_box = false; -} - -void ProjectListFilter::clear() { - if (has_search_box) { - search_box->clear(); - } -} diff --git a/editor/project_manager.h b/editor/project_manager.h index 66b38d0746..407dba0c94 100644 --- a/editor/project_manager.h +++ b/editor/project_manager.h @@ -39,22 +39,31 @@ class ProjectDialog; class ProjectList; -class ProjectListFilter; + +enum FilterOption { + NAME, + PATH, + EDIT_DATE, +}; class ProjectManager : public Control { GDCLASS(ProjectManager, Control); - Button *erase_btn; - Button *erase_missing_btn; + TabContainer *tabs; + + ProjectList *_project_list; + + LineEdit *search_box; + OptionButton *filter_option; + + Button *run_btn; Button *open_btn; Button *rename_btn; - Button *run_btn; + Button *erase_btn; + Button *erase_missing_btn; EditorAssetLibrary *asset_library; - ProjectListFilter *project_filter; - ProjectListFilter *project_order_filter; - FileDialog *scan_dir; ConfirmationDialog *language_restart_ask; ConfirmationDialog *erase_ask; @@ -64,18 +73,12 @@ class ProjectManager : public Control { ConfirmationDialog *multi_scan_ask; ConfirmationDialog *ask_update_settings; ConfirmationDialog *open_templates; + AcceptDialog *run_error_diag; AcceptDialog *dialog_error; ProjectDialog *npdialog; - HBoxContainer *projects_hb; - TabContainer *tabs; - ProjectList *_project_list; - OptionButton *language_btn; - Control *gui_base; - - bool importing; void _open_asset_library(); void _scan_projects(); @@ -94,14 +97,13 @@ class ProjectManager : public Control { void _language_selected(int p_id); void _restart_confirm(); void _exit_dialog(); - void _scan_begin(const String &p_base); - void _confirm_update_settings(); void _load_recent_projects(); void _on_project_created(const String &dir); void _on_projects_updated(); - void _update_scroll_position(const String &dir); + void _scan_multiple_folders(PackedStringArray p_files); + void _scan_begin(const String &p_base); void _scan_dir(const String &path, List<String> *r_projects); void _install_project(const String &p_zip_path, const String &p_title); @@ -109,10 +111,9 @@ class ProjectManager : public Control { void _dim_window(); void _unhandled_input(const Ref<InputEvent> &p_ev); void _files_dropped(PackedStringArray p_files, int p_screen); - void _scan_multiple_folders(PackedStringArray p_files); - void _on_order_option_changed(); - void _on_filter_option_changed(); + void _on_order_option_changed(int p_idx); + void _on_search_term_changed(const String &p_term); protected: void _notification(int p_what); @@ -123,41 +124,4 @@ public: ~ProjectManager(); }; -class ProjectListFilter : public HBoxContainer { - GDCLASS(ProjectListFilter, HBoxContainer); - -public: - enum FilterOption { - FILTER_NAME, - FILTER_PATH, - FILTER_EDIT_DATE, - }; - -private: - friend class ProjectManager; - - OptionButton *filter_option; - LineEdit *search_box; - bool has_search_box; - FilterOption _current_filter; - - void _search_text_changed(const String &p_newtext); - void _filter_option_selected(int p_idx); - -protected: - void _notification(int p_what); - static void _bind_methods(); - -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(); - FilterOption get_filter_option(); - void set_filter_option(FilterOption); - ProjectListFilter(); - void clear(); -}; - #endif // PROJECT_MANAGER_H diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index 0257e31ee7..b6621d0d1e 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -30,8 +30,6 @@ #include "project_settings_editor.h" -#include "core/global_constants.h" -#include "core/os/keyboard.h" #include "core/project_settings.h" #include "editor/editor_export.h" #include "editor/editor_node.h" @@ -48,175 +46,163 @@ void ProjectSettingsEditor::popup_project_settings() { popup_centered_clamped(Size2(900, 700) * EDSCALE, 0.8); } - globals_editor->update_category_list(); + _add_feature_overrides(); + inspector->update_category_list(); + localization_editor->update_translations(); autoload_settings->update_autoload(); plugin_settings->update_plugins(); - set_process_unhandled_input(true); } -void ProjectSettingsEditor::_unhandled_input(const Ref<InputEvent> &p_event) { - const Ref<InputEventKey> k = p_event; - - if (k.is_valid() && k->is_pressed()) { - if (k->get_keycode_with_modifiers() == (KEY_MASK_CMD | KEY_F)) { - if (search_button->is_pressed()) { - search_box->grab_focus(); - search_box->select_all(); - } else { - // This toggles the search bar display while giving the button its "pressed" appearance - search_button->set_pressed(true); - } - - set_input_as_handled(); - } - } +void ProjectSettingsEditor::queue_save() { + timer->start(); } -void ProjectSettingsEditor::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_VISIBILITY_CHANGED: { - if (!is_visible()) { - EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "project_settings", Rect2(get_position(), get_size())); - set_process_unhandled_input(false); - } - } break; - case NOTIFICATION_ENTER_TREE: { - globals_editor->edit(ProjectSettings::get_singleton()); - - search_button->set_icon(get_theme_icon("Search", "EditorIcons")); - search_box->set_right_icon(get_theme_icon("Search", "EditorIcons")); - search_box->set_clear_button_enabled(true); - - restart_close_button->set_icon(get_theme_icon("Close", "EditorIcons")); - restart_container->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree")); - restart_icon->set_texture(get_theme_icon("StatusWarning", "EditorIcons")); - restart_label->add_theme_color_override("font_color", get_theme_color("warning_color", "Editor")); - - } break; - case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { - search_button->set_icon(get_theme_icon("Search", "EditorIcons")); - search_box->set_right_icon(get_theme_icon("Search", "EditorIcons")); - search_box->set_clear_button_enabled(true); - } break; - } +void ProjectSettingsEditor::set_plugins_page() { + tab_container->set_current_tab(plugin_settings->get_index()); } void ProjectSettingsEditor::update_plugins() { plugin_settings->update_plugins(); } -void ProjectSettingsEditor::_item_selected(const String &p_path) { - const String &selected_path = p_path; - if (selected_path == String()) { - return; - } - category->set_text(globals_editor->get_current_section()); - property->set_text(selected_path); - popup_copy_to_feature->set_disabled(false); +void ProjectSettingsEditor::_setting_edited(const String &p_name) { + queue_save(); } -void ProjectSettingsEditor::_item_adds(String) { - _item_add(); +void ProjectSettingsEditor::_advanced_pressed() { + if (advanced->is_pressed()) { + _update_advanced_bar(); + advanced_bar->show(); + } else { + advanced_bar->hide(); + } } -void ProjectSettingsEditor::_item_add() { - // Initialize the property with the default value for the given type. - // The type list starts at 1 (as we exclude Nil), so add 1 to the selected value. - Callable::CallError ce; - const Variant value = Variant::construct(Variant::Type(type->get_selected() + 1), nullptr, 0, ce); - - String catname = category->get_text().strip_edges(); - String propname = property->get_text().strip_edges(); - - if (propname.empty()) { +void ProjectSettingsEditor::_setting_selected(const String &p_path) { + if (p_path == String()) { return; } - if (catname.empty()) { - catname = "global"; - } + category_box->set_text(inspector->get_current_section()); + property_box->set_text(p_path); - String name = catname + "/" + propname; + if (advanced_bar->is_visible()) { + _update_advanced_bar(); // set_text doesn't trigger text_changed + } +} - undo_redo->create_action(TTR("Add Global Property")); +void ProjectSettingsEditor::_add_setting() { + String setting = _get_setting_name(); - undo_redo->add_do_property(ProjectSettings::get_singleton(), name, value); + // Initialize the property with the default value for the given type. + // The type list starts at 1 (as we exclude Nil), so add 1 to the selected value. + Callable::CallError ce; + const Variant value = Variant::construct(Variant::Type(type->get_selected() + 1), nullptr, 0, ce); - if (ProjectSettings::get_singleton()->has_setting(name)) { - undo_redo->add_undo_property(ProjectSettings::get_singleton(), name, ProjectSettings::get_singleton()->get(name)); - } else { - undo_redo->add_undo_property(ProjectSettings::get_singleton(), name, Variant()); - } + undo_redo->create_action(TTR("Add Project Setting")); + undo_redo->add_do_property(ps, setting, value); + undo_redo->add_undo_property(ps, setting, ps->has_setting(setting) ? ps->get(setting) : Variant()); - undo_redo->add_do_method(globals_editor, "update_category_list"); - undo_redo->add_undo_method(globals_editor, "update_category_list"); - undo_redo->add_do_method(this, "_settings_changed"); - undo_redo->add_undo_method(this, "_settings_changed"); + undo_redo->add_do_method(inspector, "update_category_list"); + undo_redo->add_undo_method(inspector, "update_category_list"); + undo_redo->add_do_method(this, "queue_save"); + undo_redo->add_undo_method(this, "queue_save"); undo_redo->commit_action(); - globals_editor->set_current_section(catname); - - _settings_changed(); + inspector->set_current_section(setting.get_slice("/", 1)); } -void ProjectSettingsEditor::_item_del() { - String path = globals_editor->get_inspector()->get_selected_path(); - if (path == String()) { - EditorNode::get_singleton()->show_warning(TTR("Select a setting item first!")); - return; - } - - String property = globals_editor->get_current_section().plus_file(path); - - if (!ProjectSettings::get_singleton()->has_setting(property)) { - EditorNode::get_singleton()->show_warning(vformat(TTR("No property '%s' exists."), property)); - return; - } +void ProjectSettingsEditor::_delete_setting(bool p_confirmed) { + String setting = _get_setting_name(); + Variant value = ps->get(setting); + int order = ps->get_order(setting); - if (ProjectSettings::get_singleton()->get_order(property) < ProjectSettings::NO_BUILTIN_ORDER_BASE) { - EditorNode::get_singleton()->show_warning(vformat(TTR("Setting '%s' is internal, and it can't be deleted."), property)); + if (!p_confirmed) { + del_confirmation->set_text(vformat(TTR("Are you sure you want to delete '%s'?"), setting)); + del_confirmation->popup_centered(); return; } undo_redo->create_action(TTR("Delete Item")); - Variant value = ProjectSettings::get_singleton()->get(property); - int order = ProjectSettings::get_singleton()->get_order(property); + undo_redo->add_do_method(ps, "clear", setting); + undo_redo->add_undo_method(ps, "set", setting, value); + undo_redo->add_undo_method(ps, "set_order", setting, order); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", property); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", property, value); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", property, order); - - undo_redo->add_do_method(globals_editor, "update_category_list"); - undo_redo->add_undo_method(globals_editor, "update_category_list"); - - undo_redo->add_do_method(this, "_settings_changed"); - undo_redo->add_undo_method(this, "_settings_changed"); + undo_redo->add_do_method(inspector, "update_category_list"); + undo_redo->add_undo_method(inspector, "update_category_list"); + undo_redo->add_do_method(this, "queue_save"); + undo_redo->add_undo_method(this, "queue_save"); undo_redo->commit_action(); + + property_box->clear(); } -void ProjectSettingsEditor::_save() { - Error err = ProjectSettings::get_singleton()->save(); - message->set_text(err != OK ? TTR("Error saving settings.") : TTR("Settings saved OK.")); - message->popup_centered(Size2(300, 100) * EDSCALE); +void ProjectSettingsEditor::_text_field_changed(const String &p_text) { + _update_advanced_bar(); } -void ProjectSettingsEditor::_settings_prop_edited(const String &p_name) { - // Method needed to discard the mandatory argument of the property_edited signal - _settings_changed(); +void ProjectSettingsEditor::_feature_selected(int p_index) { + _update_advanced_bar(); } -void ProjectSettingsEditor::_settings_changed() { - timer->start(); +void ProjectSettingsEditor::_update_advanced_bar() { + const String property_text = property_box->get_text().strip_edges(); + + String error_msg = ""; + bool disable_add = true; + bool disable_del = true; + + if (!property_box->get_text().empty()) { + const String setting = _get_setting_name(); + bool setting_exists = ps->has_setting(setting); + if (setting_exists) { + error_msg = TTR(" - Cannot add already existing setting."); + + disable_del = ps->is_builtin_setting(setting); + if (disable_del) { + String msg = TTR(" - Cannot delete built-in setting."); + error_msg += (error_msg == "") ? msg : "\n" + msg; + } + } else { + bool bad_category = false; // Allow empty string. + Vector<String> cats = category_box->get_text().strip_edges().split("/"); + for (int i = 0; i < cats.size(); i++) { + if (!cats[i].is_valid_identifier()) { + bad_category = true; + error_msg = TTR(" - Invalid category name."); + break; + } + } + + disable_add = bad_category; + + if (!property_text.is_valid_identifier()) { + disable_add = true; + String msg = TTR(" - Invalid property name."); + error_msg += (error_msg == "") ? msg : "\n" + msg; + } + } + } + + add_button->set_disabled(disable_add); + del_button->set_disabled(disable_del); + + error_label->set_text(error_msg); + error_label->set_visible(error_msg != ""); } -void ProjectSettingsEditor::queue_save() { - _settings_changed(); +String ProjectSettingsEditor::_get_setting_name() const { + const String cat = category_box->get_text(); + const String name = (cat.empty() ? "global" : cat.strip_edges()).plus_file(property_box->get_text().strip_edges()); + const String feature = feature_override->get_item_text(feature_override->get_selected()); + + return (feature == "") ? name : (name + "." + feature); } -void ProjectSettingsEditor::_copy_to_platform_about_to_show() { +void ProjectSettingsEditor::_add_feature_overrides() { Set<String> presets; presets.insert("bptc"); @@ -230,25 +216,26 @@ void ProjectSettingsEditor::_copy_to_platform_about_to_show() { presets.insert("standalone"); presets.insert("32"); presets.insert("64"); - // Not available as an export platform yet, so it needs to be added manually - presets.insert("Server"); + presets.insert("Server"); // Not available as an export platform yet, so it needs to be added manually + + EditorExport *ee = EditorExport::get_singleton(); - for (int i = 0; i < EditorExport::get_singleton()->get_export_platform_count(); i++) { + for (int i = 0; i < ee->get_export_platform_count(); i++) { List<String> p; - EditorExport::get_singleton()->get_export_platform(i)->get_platform_features(&p); + ee->get_export_platform(i)->get_platform_features(&p); for (List<String>::Element *E = p.front(); E; E = E->next()) { presets.insert(E->get()); } } - for (int i = 0; i < EditorExport::get_singleton()->get_export_preset_count(); i++) { + for (int i = 0; i < ee->get_export_preset_count(); i++) { List<String> p; - EditorExport::get_singleton()->get_export_preset(i)->get_platform()->get_preset_features(EditorExport::get_singleton()->get_export_preset(i), &p); + ee->get_export_preset(i)->get_platform()->get_preset_features(ee->get_export_preset(i), &p); for (List<String>::Element *E = p.front(); E; E = E->next()) { presets.insert(E->get()); } - String custom = EditorExport::get_singleton()->get_export_preset(i)->get_custom_features(); + String custom = ee->get_export_preset(i)->get_custom_features(); Vector<String> custom_list = custom.split(","); for (int j = 0; j < custom_list.size(); j++) { String f = custom_list[j].strip_edges(); @@ -258,70 +245,14 @@ void ProjectSettingsEditor::_copy_to_platform_about_to_show() { } } - popup_copy_to_feature->get_popup()->clear(); - int id = 0; + feature_override->clear(); + feature_override->add_item("", 0); // So it is always on top. + int id = 1; for (Set<String>::Element *E = presets.front(); E; E = E->next()) { - popup_copy_to_feature->get_popup()->add_item(E->get(), id++); + feature_override->add_item(E->get(), id++); } } -void ProjectSettingsEditor::_copy_to_platform(int p_which) { - String path = globals_editor->get_inspector()->get_selected_path(); - if (path == String()) { - EditorNode::get_singleton()->show_warning(TTR("Select a setting item first!")); - return; - } - - String property = globals_editor->get_current_section().plus_file(path); - - undo_redo->create_action(TTR("Override for Feature")); - - Variant value = ProjectSettings::get_singleton()->get(property); - if (property.find(".") != -1) { //overwriting overwrite, keep overwrite - undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", property); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", property, value); - } - - String feature = popup_copy_to_feature->get_popup()->get_item_text(p_which); - String new_path = property + "." + feature; - - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", new_path, value); - if (ProjectSettings::get_singleton()->has_setting(new_path)) { - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", new_path, ProjectSettings::get_singleton()->get(new_path)); - } - - undo_redo->add_do_method(globals_editor, "update_category_list"); - undo_redo->add_undo_method(globals_editor, "update_category_list"); - - undo_redo->add_do_method(this, "_settings_changed"); - undo_redo->add_undo_method(this, "_settings_changed"); - - undo_redo->commit_action(); -} - -void ProjectSettingsEditor::_toggle_search_bar(bool p_pressed) { - globals_editor->get_inspector()->set_use_filter(p_pressed); - - if (p_pressed) { - search_bar->show(); - add_prop_bar->hide(); - search_box->grab_focus(); - search_box->select_all(); - } else { - search_box->clear(); - search_bar->hide(); - add_prop_bar->show(); - } -} - -void ProjectSettingsEditor::set_plugins_page() { - tab_container->set_current_tab(plugin_settings->get_index()); -} - -TabContainer *ProjectSettingsEditor::get_tabs() { - return tab_container; -} - void ProjectSettingsEditor::_editor_restart() { EditorNode::get_singleton()->save_all_scenes(); EditorNode::get_singleton()->restart_editor(); @@ -335,17 +266,48 @@ void ProjectSettingsEditor::_editor_restart_close() { restart_container->hide(); } -void ProjectSettingsEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_unhandled_input"), &ProjectSettingsEditor::_unhandled_input); - ClassDB::bind_method(D_METHOD("_save"), &ProjectSettingsEditor::_save); +void ProjectSettingsEditor::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_VISIBILITY_CHANGED: { + if (!is_visible()) { + EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "project_settings", Rect2(get_position(), get_size())); + if (advanced->is_pressed()) { + advanced->set_pressed(false); + advanced_bar->hide(); + } + } + } break; + case NOTIFICATION_ENTER_TREE: { + inspector->edit(ps); + + error_label->add_theme_color_override("font_color", error_label->get_theme_color("error_color", "Editor")); + add_button->set_icon(get_theme_icon("Add", "EditorIcons")); + del_button->set_icon(get_theme_icon("Remove", "EditorIcons")); + + search_box->set_right_icon(get_theme_icon("Search", "EditorIcons")); + search_box->set_clear_button_enabled(true); - ClassDB::bind_method(D_METHOD("get_tabs"), &ProjectSettingsEditor::get_tabs); + restart_close_button->set_icon(get_theme_icon("Close", "EditorIcons")); + restart_container->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree")); + restart_icon->set_texture(get_theme_icon("StatusWarning", "EditorIcons")); + restart_label->add_theme_color_override("font_color", get_theme_color("warning_color", "Editor")); + } break; + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + search_box->set_right_icon(get_theme_icon("Search", "EditorIcons")); + search_box->set_clear_button_enabled(true); + } break; + } +} + +void ProjectSettingsEditor::_bind_methods() { + ClassDB::bind_method(D_METHOD("queue_save"), &ProjectSettingsEditor::queue_save); } ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { singleton = this; set_title(TTR("Project Settings (project.godot)")); + ps = ProjectSettings::get_singleton(); undo_redo = &p_data->get_undo_redo(); data = p_data; @@ -354,103 +316,109 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { tab_container->set_use_hidden_tabs_for_min_size(true); add_child(tab_container); - VBoxContainer *props_base = memnew(VBoxContainer); - props_base->set_name(TTR("General")); - props_base->set_alignment(BoxContainer::ALIGN_BEGIN); - props_base->set_v_size_flags(Control::SIZE_EXPAND_FILL); - tab_container->add_child(props_base); - - HBoxContainer *hbc = memnew(HBoxContainer); - hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL); - props_base->add_child(hbc); - - search_button = memnew(Button); - search_button->set_text(TTR("Search")); - search_button->set_toggle_mode(true); - search_button->set_pressed(false); - search_button->connect("toggled", callable_mp(this, &ProjectSettingsEditor::_toggle_search_bar)); - hbc->add_child(search_button); - - hbc->add_child(memnew(VSeparator)); - - add_prop_bar = memnew(HBoxContainer); - add_prop_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL); - hbc->add_child(add_prop_bar); - - Label *l = memnew(Label); - l->set_text(TTR("Category:")); - add_prop_bar->add_child(l); - - category = memnew(LineEdit); - category->set_h_size_flags(Control::SIZE_EXPAND_FILL); - category->connect("text_entered", callable_mp(this, &ProjectSettingsEditor::_item_adds)); - add_prop_bar->add_child(category); - - l = memnew(Label); - l->set_text(TTR("Property:")); - add_prop_bar->add_child(l); - - property = memnew(LineEdit); - property->set_h_size_flags(Control::SIZE_EXPAND_FILL); - property->connect("text_entered", callable_mp(this, &ProjectSettingsEditor::_item_adds)); - add_prop_bar->add_child(property); - - l = memnew(Label); - l->set_text(TTR("Type:")); - add_prop_bar->add_child(l); - - type = memnew(OptionButton); - type->set_h_size_flags(Control::SIZE_EXPAND_FILL); - add_prop_bar->add_child(type); - - // Start at 1 to avoid adding "Nil" as an option - for (int i = 1; i < Variant::VARIANT_MAX; i++) { - type->add_item(Variant::get_type_name(Variant::Type(i))); + VBoxContainer *general_editor = memnew(VBoxContainer); + general_editor->set_name(TTR("General")); + general_editor->set_alignment(BoxContainer::ALIGN_BEGIN); + general_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); + tab_container->add_child(general_editor); + + VBoxContainer *header = memnew(VBoxContainer); + header->set_h_size_flags(Control::SIZE_EXPAND_FILL); + general_editor->add_child(header); + + { + // Search bar. + search_bar = memnew(HBoxContainer); + search_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL); + header->add_child(search_bar); + + search_box = memnew(LineEdit); + search_box->set_placeholder(TTR("Search")); + search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); + search_bar->add_child(search_box); + + advanced = memnew(CheckButton); + advanced->set_text(TTR("Advanced")); + advanced->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_advanced_pressed)); + search_bar->add_child(advanced); } - Button *add = memnew(Button); - add->set_text(TTR("Add")); - add->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_item_add)); - add_prop_bar->add_child(add); - - search_bar = memnew(HBoxContainer); - search_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL); - search_bar->hide(); - hbc->add_child(search_bar); - - search_box = memnew(LineEdit); - search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); - search_bar->add_child(search_box); + { + // Advanced bar. + advanced_bar = memnew(VBoxContainer); + advanced_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL); + advanced_bar->hide(); + header->add_child(advanced_bar); + + advanced_bar->add_child(memnew(HSeparator)); + + HBoxContainer *hbc = memnew(HBoxContainer); + hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL); + advanced_bar->add_margin_child(TTR("Add or Remove Custom Project Settings:"), hbc, true); + + category_box = memnew(LineEdit); + category_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); + category_box->connect("text_changed", callable_mp(this, &ProjectSettingsEditor::_text_field_changed)); + category_box->set_placeholder(TTR("Category")); + hbc->add_child(category_box); + + Label *l = memnew(Label); + l->set_text("/"); + hbc->add_child(l); + + property_box = memnew(LineEdit); + property_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); + property_box->set_placeholder(TTR("Property")); + property_box->connect("text_changed", callable_mp(this, &ProjectSettingsEditor::_text_field_changed)); + hbc->add_child(property_box); + + l = memnew(Label); + l->set_text(TTR("Type:")); + hbc->add_child(l); + + type = memnew(OptionButton); + type->set_custom_minimum_size(Size2(100, 0) * EDSCALE); + hbc->add_child(type); + + // Start at 1 to avoid adding "Nil" as an option + for (int i = 1; i < Variant::VARIANT_MAX; i++) { + type->add_item(Variant::get_type_name(Variant::Type(i))); + } - globals_editor = memnew(SectionedInspector); - globals_editor->get_inspector()->set_undo_redo(EditorNode::get_singleton()->get_undo_redo()); - globals_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); - globals_editor->register_search_box(search_box); - globals_editor->get_inspector()->connect("property_selected", callable_mp(this, &ProjectSettingsEditor::_item_selected)); - globals_editor->get_inspector()->connect("property_edited", callable_mp(this, &ProjectSettingsEditor::_settings_prop_edited)); - globals_editor->get_inspector()->connect("restart_requested", callable_mp(this, &ProjectSettingsEditor::_editor_restart_request)); - props_base->add_child(globals_editor); + l = memnew(Label); + l->set_text(TTR("Feature Override:")); + hbc->add_child(l); - Button *del = memnew(Button); - del->set_text(TTR("Delete")); - del->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_item_del)); - hbc->add_child(del); + feature_override = memnew(OptionButton); + feature_override->set_custom_minimum_size(Size2(100, 0) * EDSCALE); + feature_override->connect("item_selected", callable_mp(this, &ProjectSettingsEditor::_feature_selected)); + hbc->add_child(feature_override); - add_prop_bar->add_child(memnew(VSeparator)); + add_button = memnew(Button); + add_button->set_flat(true); + add_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_add_setting)); + hbc->add_child(add_button); - popup_copy_to_feature = memnew(MenuButton); - popup_copy_to_feature->set_text(TTR("Override For...")); - popup_copy_to_feature->set_disabled(true); - add_prop_bar->add_child(popup_copy_to_feature); + del_button = memnew(Button); + del_button->set_flat(true); + del_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_delete_setting), varray(false)); + hbc->add_child(del_button); - popup_copy_to_feature->get_popup()->connect("id_pressed", callable_mp(this, &ProjectSettingsEditor::_copy_to_platform)); - popup_copy_to_feature->get_popup()->connect("about_to_popup", callable_mp(this, &ProjectSettingsEditor::_copy_to_platform_about_to_show)); + error_label = memnew(Label); + advanced_bar->add_child(error_label); + } - get_ok()->set_text(TTR("Close")); - set_hide_on_ok(true); + inspector = memnew(SectionedInspector); + inspector->get_inspector()->set_undo_redo(EditorNode::get_singleton()->get_undo_redo()); + inspector->set_v_size_flags(Control::SIZE_EXPAND_FILL); + inspector->register_search_box(search_box); + inspector->get_inspector()->connect("property_selected", callable_mp(this, &ProjectSettingsEditor::_setting_selected)); + inspector->get_inspector()->connect("property_edited", callable_mp(this, &ProjectSettingsEditor::_setting_edited)); + inspector->get_inspector()->connect("restart_requested", callable_mp(this, &ProjectSettingsEditor::_editor_restart_request)); + general_editor->add_child(inspector); restart_container = memnew(PanelContainer); - props_base->add_child(restart_container); + general_editor->add_child(restart_container); HBoxContainer *restart_hb = memnew(HBoxContainer); restart_container->hide(); @@ -475,27 +443,24 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { restart_close_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_editor_restart_close)); restart_hb->add_child(restart_close_button); - message = memnew(AcceptDialog); - add_child(message); - inputmap_editor = memnew(InputMapEditor); inputmap_editor->set_name(TTR("Input Map")); - inputmap_editor->connect("inputmap_changed", callable_mp(this, &ProjectSettingsEditor::_settings_changed)); + inputmap_editor->connect("inputmap_changed", callable_mp(this, &ProjectSettingsEditor::queue_save)); tab_container->add_child(inputmap_editor); localization_editor = memnew(LocalizationEditor); localization_editor->set_name(TTR("Localization")); - localization_editor->connect("localization_changed", callable_mp(this, &ProjectSettingsEditor::_settings_changed)); + localization_editor->connect("localization_changed", callable_mp(this, &ProjectSettingsEditor::queue_save)); tab_container->add_child(localization_editor); autoload_settings = memnew(EditorAutoloadSettings); autoload_settings->set_name(TTR("AutoLoad")); - autoload_settings->connect("autoload_changed", callable_mp(this, &ProjectSettingsEditor::_settings_changed)); + autoload_settings->connect("autoload_changed", callable_mp(this, &ProjectSettingsEditor::queue_save)); tab_container->add_child(autoload_settings); shaders_global_variables_editor = memnew(ShaderGlobalsEditor); shaders_global_variables_editor->set_name(TTR("Shader Globals")); - shaders_global_variables_editor->connect("globals_changed", callable_mp(this, &ProjectSettingsEditor::_settings_changed)); + shaders_global_variables_editor->connect("globals_changed", callable_mp(this, &ProjectSettingsEditor::queue_save)); tab_container->add_child(shaders_global_variables_editor); plugin_settings = memnew(EditorPluginSettings); @@ -504,7 +469,14 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { timer = memnew(Timer); timer->set_wait_time(1.5); - timer->connect("timeout", callable_mp(ProjectSettings::get_singleton(), &ProjectSettings::save)); + timer->connect("timeout", callable_mp(ps, &ProjectSettings::save)); timer->set_one_shot(true); add_child(timer); + + del_confirmation = memnew(ConfirmationDialog); + del_confirmation->connect("confirmed", callable_mp(this, &ProjectSettingsEditor::_delete_setting), varray(true)); + add_child(del_confirmation); + + get_ok()->set_text(TTR("Close")); + set_hide_on_ok(true); } diff --git a/editor/project_settings_editor.h b/editor/project_settings_editor.h index c99c2fe9a2..4ecd28e514 100644 --- a/editor/project_settings_editor.h +++ b/editor/project_settings_editor.h @@ -35,12 +35,11 @@ #include "editor/editor_data.h" #include "editor/editor_plugin_settings.h" #include "editor/editor_sectioned_inspector.h" +#include "editor/input_map_editor.h" +#include "editor/localization_editor.h" +#include "editor/shader_globals_editor.h" #include "editor_autoload_settings.h" -#include "input_map_editor.h" -#include "localization_editor.h" -#include "scene/gui/dialogs.h" #include "scene/gui/tab_container.h" -#include "shader_globals_editor.h" class ProjectSettingsEditor : public AcceptDialog { GDCLASS(ProjectSettingsEditor, AcceptDialog); @@ -53,28 +52,33 @@ class ProjectSettingsEditor : public AcceptDialog { INPUT_MOUSE_BUTTON }; - TabContainer *tab_container; - AcceptDialog *message; + static ProjectSettingsEditor *singleton; + ProjectSettings *ps; Timer *timer; - HBoxContainer *search_bar; - Button *search_button; - LineEdit *search_box; - HBoxContainer *add_prop_bar; - LineEdit *category; - LineEdit *property; - OptionButton *type; - - SectionedInspector *globals_editor; - - MenuButton *popup_copy_to_feature; - + TabContainer *tab_container; + SectionedInspector *inspector; InputMapEditor *inputmap_editor; LocalizationEditor *localization_editor; EditorAutoloadSettings *autoload_settings; ShaderGlobalsEditor *shaders_global_variables_editor; EditorPluginSettings *plugin_settings; + HBoxContainer *search_bar; + LineEdit *search_box; + CheckButton *advanced; + + VBoxContainer *advanced_bar; + LineEdit *category_box; + LineEdit *property_box; + Button *add_button; + Button *del_button; + OptionButton *type; + OptionButton *feature_override; + Label *error_label; + + ConfirmationDialog *del_confirmation; + Label *restart_label; TextureRect *restart_icon; PanelContainer *restart_container; @@ -83,30 +87,25 @@ class ProjectSettingsEditor : public AcceptDialog { EditorData *data; UndoRedo *undo_redo; - void _item_selected(const String &); - void _item_adds(String); - void _item_add(); - void _item_del(); - void _save(); - - void _settings_prop_edited(const String &p_name); - void _settings_changed(); - - void _copy_to_platform(int p_which); - void _copy_to_platform_about_to_show(); - - void _toggle_search_bar(bool p_pressed); + void _advanced_pressed(); + void _update_advanced_bar(); + void _text_field_changed(const String &p_text); + void _feature_selected(int p_index); - ProjectSettingsEditor(); - - static ProjectSettingsEditor *singleton; + String _get_setting_name() const; + void _setting_edited(const String &p_name); + void _setting_selected(const String &p_path); + void _add_setting(); + void _delete_setting(bool p_confirmed); void _editor_restart_request(); void _editor_restart(); void _editor_restart_close(); + void _add_feature_overrides(); + ProjectSettingsEditor(); + protected: - void _unhandled_input(const Ref<InputEvent> &p_event); void _notification(int p_what); static void _bind_methods(); @@ -117,8 +116,7 @@ public: void update_plugins(); EditorAutoloadSettings *get_autoload_settings() { return autoload_settings; } - - TabContainer *get_tabs(); + TabContainer *get_tabs() { return tab_container; } void queue_save(); diff --git a/editor/property_selector.cpp b/editor/property_selector.cpp index c6c93fae83..27b11e4fb5 100644 --- a/editor/property_selector.cpp +++ b/editor/property_selector.cpp @@ -84,6 +84,9 @@ void PropertySelector::_update_search() { TreeItem *root = search_options->create_item(); + // Allow using spaces in place of underscores in the search string (makes the search more fault-tolerant). + const String search_text = search_box->get_text().replace(" ", "_"); + if (properties) { List<PropertyInfo> props; @@ -167,7 +170,7 @@ void PropertySelector::_update_search() { continue; } - if (search_box->get_text() != String() && E->get().name.find(search_box->get_text()) == -1) { + if (search_box->get_text() != String() && E->get().name.findn(search_text) == -1) { continue; } @@ -180,7 +183,7 @@ void PropertySelector::_update_search() { item->set_metadata(0, E->get().name); item->set_icon(0, type_icons[E->get().type]); - if (!found && search_box->get_text() != String() && E->get().name.find(search_box->get_text()) != -1) { + if (!found && search_box->get_text() != String() && E->get().name.findn(search_text) != -1) { item->select(0); found = true; } @@ -255,7 +258,7 @@ void PropertySelector::_update_search() { continue; } - if (search_box->get_text() != String() && name.find(search_box->get_text()) == -1) { + if (search_box->get_text() != String() && name.findn(search_text) == -1) { continue; } @@ -270,29 +273,29 @@ void PropertySelector::_update_search() { } else if (mi.return_val.type != Variant::NIL) { desc = Variant::get_type_name(mi.return_val.type); } else { - desc = "void "; + desc = "void"; } - desc += " " + mi.name + " ( "; + desc += vformat(" %s(", mi.name); for (int i = 0; i < mi.arguments.size(); i++) { if (i > 0) { desc += ", "; } + desc += mi.arguments[i].name; + if (mi.arguments[i].type == Variant::NIL) { - desc += "var "; + desc += ": Variant"; } else if (mi.arguments[i].name.find(":") != -1) { - desc += mi.arguments[i].name.get_slice(":", 1) + " "; + desc += vformat(": %s", mi.arguments[i].name.get_slice(":", 1)); mi.arguments[i].name = mi.arguments[i].name.get_slice(":", 0); } else { - desc += Variant::get_type_name(mi.arguments[i].type) + " "; + desc += vformat(": %s", Variant::get_type_name(mi.arguments[i].type)); } - - desc += mi.arguments[i].name; } - desc += " )"; + desc += ")"; if (E->get().flags & METHOD_FLAG_CONST) { desc += " const"; @@ -306,7 +309,7 @@ void PropertySelector::_update_search() { item->set_metadata(0, name); item->set_selectable(0, true); - if (!found && search_box->get_text() != String() && name.find(search_box->get_text()) != -1) { + if (!found && search_box->get_text() != String() && name.findn(search_text) != -1) { item->select(0); found = true; } diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp index 211e365454..23990bca07 100644 --- a/editor/rename_dialog.cpp +++ b/editor/rename_dialog.cpp @@ -61,18 +61,16 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und // ---- 1st & 2nd row Label *lbl_search = memnew(Label); - lbl_search->set_text(TTR("Search")); + lbl_search->set_text(TTR("Search:")); lne_search = memnew(LineEdit); - lne_search->set_placeholder(TTR("Search")); lne_search->set_name("lne_search"); lne_search->set_h_size_flags(Control::SIZE_EXPAND_FILL); Label *lbl_replace = memnew(Label); - lbl_replace->set_text(TTR("Replace")); + lbl_replace->set_text(TTR("Replace:")); lne_replace = memnew(LineEdit); - lne_replace->set_placeholder(TTR("Replace")); lne_replace->set_name("lne_replace"); lne_replace->set_h_size_flags(Control::SIZE_EXPAND_FILL); @@ -84,18 +82,16 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und // ---- 3rd & 4th row Label *lbl_prefix = memnew(Label); - lbl_prefix->set_text(TTR("Prefix")); + lbl_prefix->set_text(TTR("Prefix:")); lne_prefix = memnew(LineEdit); - lne_prefix->set_placeholder(TTR("Prefix")); lne_prefix->set_name("lne_prefix"); lne_prefix->set_h_size_flags(Control::SIZE_EXPAND_FILL); Label *lbl_suffix = memnew(Label); - lbl_suffix->set_text(TTR("Suffix")); + lbl_suffix->set_text(TTR("Suffix:")); lne_suffix = memnew(LineEdit); - lne_suffix->set_placeholder(TTR("Suffix")); lne_suffix->set_name("lne_suffix"); lne_suffix->set_h_size_flags(Control::SIZE_EXPAND_FILL); @@ -106,8 +102,6 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und // -- Feature Tabs - const int feature_min_height = 160 * EDSCALE; - cbut_regex = memnew(CheckButton); cbut_regex->set_text(TTR("Use Regular Expressions")); vbc->add_child(cbut_regex); @@ -118,13 +112,13 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und tabc_features = memnew(TabContainer); tabc_features->set_tab_align(TabContainer::ALIGN_LEFT); + tabc_features->set_use_hidden_tabs_for_min_size(true); vbc->add_child(tabc_features); // ---- Tab Substitute VBoxContainer *vbc_substitute = memnew(VBoxContainer); vbc_substitute->set_h_size_flags(Control::SIZE_EXPAND_FILL); - vbc_substitute->set_custom_minimum_size(Size2(0, feature_min_height)); vbc_substitute->set_name(TTR("Substitute")); tabc_features->add_child(vbc_substitute); @@ -199,7 +193,7 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und chk_per_level_counter = memnew(CheckBox); chk_per_level_counter->set_text(TTR("Per-level Counter")); - chk_per_level_counter->set_tooltip(TTR("If set the counter restarts for each group of child nodes.")); + chk_per_level_counter->set_tooltip(TTR("If set, the counter restarts for each group of child nodes.")); vbc_substitute->add_child(chk_per_level_counter); HBoxContainer *hbc_count_options = memnew(HBoxContainer); @@ -241,7 +235,6 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und VBoxContainer *vbc_process = memnew(VBoxContainer); vbc_process->set_h_size_flags(Control::SIZE_EXPAND_FILL); vbc_process->set_name(TTR("Post-Process")); - vbc_process->set_custom_minimum_size(Size2(0, feature_min_height)); tabc_features->add_child(vbc_process); cbut_process = memnew(CheckBox); @@ -285,18 +278,14 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und vbc->add_child(sep_preview); lbl_preview_title = memnew(Label); - lbl_preview_title->set_text(TTR("Preview")); vbc->add_child(lbl_preview_title); lbl_preview = memnew(Label); - lbl_preview->set_text(""); - lbl_preview->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color("error_color", "Editor")); vbc->add_child(lbl_preview); // ---- Dialog related set_min_size(Size2(383, 0)); - //set_as_toplevel(true); get_ok()->set_text(TTR("Rename")); Button *but_reset = add_button(TTR("Reset")); @@ -307,7 +296,7 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und cbut_collapse_features->connect("toggled", callable_mp(this, &RenameDialog::_features_toggled)); - // Substitite Buttons + // Substitute Buttons lne_search->connect("focus_entered", callable_mp(this, &RenameDialog::_update_substitute)); lne_search->connect("focus_exited", callable_mp(this, &RenameDialog::_update_substitute)); @@ -391,7 +380,7 @@ void RenameDialog::_update_preview(String new_text) { String new_name = _apply_rename(preview_node, spn_count_start->get_value()); if (!has_errors) { - lbl_preview_title->set_text(TTR("Preview")); + lbl_preview_title->set_text(TTR("Preview:")); lbl_preview->set_text(new_name); if (new_name == preview_node->get_name()) { @@ -482,7 +471,7 @@ void RenameDialog::_error_handler(void *p_self, const char *p_func, const char * } self->has_errors = true; - self->lbl_preview_title->set_text(TTR("Regular Expression Error")); + self->lbl_preview_title->set_text(TTR("Regular Expression Error:")); self->lbl_preview->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color("error_color", "Editor")); self->lbl_preview->set_text(vformat(TTR("At character %s"), err_str)); } diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index 7404c9779b..a62448169d 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -258,27 +258,35 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) { int num_connections = p_node->get_persistent_signal_connection_count(); int num_groups = p_node->get_persistent_group_count(); + String msg_temp; + if (num_connections >= 1) { + Array arr; + arr.push_back(num_connections); + msg_temp += TTRN("Node has one connection.", "Node has {num} connections.", num_connections).format(arr, "{num}"); + msg_temp += " "; + } + if (num_groups >= 1) { + Array arr; + arr.push_back(num_groups); + msg_temp += TTRN("Node is in one group.", "Node is in {num} groups.", num_groups).format(arr, "{num}"); + } + if (num_connections >= 1 || num_groups >= 1) { + msg_temp += "\n" + TTR("Click to show signals dock."); + } + + Ref<Texture2D> icon_temp; + auto signal_temp = BUTTON_SIGNALS; if (num_connections >= 1 && num_groups >= 1) { - item->add_button( - 0, - get_theme_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)); + icon_temp = get_theme_icon("SignalsAndGroups", "EditorIcons"); } else if (num_connections >= 1) { - item->add_button( - 0, - get_theme_icon("Signals", "EditorIcons"), - BUTTON_SIGNALS, - false, - vformat(TTR("Node has %s connection(s).\nClick to show signals dock."), num_connections)); + icon_temp = get_theme_icon("Signals", "EditorIcons"); } else if (num_groups >= 1) { - item->add_button( - 0, - get_theme_icon("Groups", "EditorIcons"), - BUTTON_GROUPS, - false, - vformat(TTR("Node is in %s group(s).\nClick to show groups dock."), num_groups)); + icon_temp = get_theme_icon("Groups", "EditorIcons"); + signal_temp = BUTTON_GROUPS; + } + + if (num_connections >= 1 || num_groups >= 1) { + item->add_button(0, icon_temp, signal_temp, false, msg_temp); } } diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp index 628475bbc0..90efb11b7d 100644 --- a/editor/script_create_dialog.cpp +++ b/editor/script_create_dialog.cpp @@ -722,6 +722,15 @@ void ScriptCreateDialog::_update_dialog() { } get_ok()->set_disabled(!script_ok); + + Callable entered_call = callable_mp(this, &ScriptCreateDialog::_path_entered); + if (script_ok) { + if (!file_path->is_connected("text_entered", entered_call)) { + file_path->connect("text_entered", entered_call); + } + } else if (file_path->is_connected("text_entered", entered_call)) { + file_path->disconnect("text_entered", entered_call); + } } void ScriptCreateDialog::_bind_methods() { @@ -849,7 +858,6 @@ ScriptCreateDialog::ScriptCreateDialog() { hb->connect("sort_children", callable_mp(this, &ScriptCreateDialog::_path_hbox_sorted)); file_path = memnew(LineEdit); file_path->connect("text_changed", callable_mp(this, &ScriptCreateDialog::_path_changed)); - file_path->connect("text_entered", callable_mp(this, &ScriptCreateDialog::_path_entered)); file_path->set_h_size_flags(Control::SIZE_EXPAND_FILL); hb->add_child(file_path); path_button = memnew(Button); diff --git a/editor/settings_config_dialog.cpp b/editor/settings_config_dialog.cpp index 9f286bd8f6..35610ef71b 100644 --- a/editor/settings_config_dialog.cpp +++ b/editor/settings_config_dialog.cpp @@ -405,6 +405,7 @@ EditorSettingsDialog::EditorSettingsDialog() { tab_general->add_child(hbc); search_box = memnew(LineEdit); + search_box->set_placeholder(TTR("Search")); search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); hbc->add_child(search_box); @@ -449,6 +450,7 @@ EditorSettingsDialog::EditorSettingsDialog() { tab_shortcuts->add_child(hbc); shortcut_search_box = memnew(LineEdit); + shortcut_search_box->set_placeholder(TTR("Search")); shortcut_search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); hbc->add_child(shortcut_search_box); shortcut_search_box->connect("text_changed", callable_mp(this, &EditorSettingsDialog::_filter_shortcuts)); diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 45ac317d99..075bc25f6e 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -43,12 +43,13 @@ # HeroFight dev <abdkafi2002@gmail.com>, 2020. # أحمد مصطفى الطبراني <eltabaraniahmed@gmail.com>, 2020. # ChemicalInk <aladdinalkhafaji@gmail.com>, 2020. +# Musab Alasaifer <mousablasefer@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-21 13:41+0000\n" -"Last-Translator: ChemicalInk <aladdinalkhafaji@gmail.com>\n" +"PO-Revision-Date: 2020-08-11 14:04+0000\n" +"Last-Translator: Musab Alasaifer <mousablasefer@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -5619,9 +5620,8 @@ msgid "Divide grid step by 2" msgstr "قسم خطوة الشبكة بـ 2" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Pan View" -msgstr "أظهر" +msgstr "إظهار شامل" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -5963,9 +5963,8 @@ msgstr "" "هذا هو الخيار الأسرع (لكنه الأقل دقة) للكشف عن وقوع التصادم." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Multiple Convex Collision Siblings" -msgstr "إنشاء متصادم محدب قريب" +msgstr "إنشاء أشقاء تصادم محدب متعددة" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -6020,11 +6019,12 @@ msgid "Remove item %d?" msgstr "مسح العنصر %d؟" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "" "Update from existing scene?:\n" "%s" -msgstr "تحديث من المشهد" +msgstr "" +"التحديث من المشهد المتواجد؟:\n" +"%s" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Mesh Library" @@ -6146,12 +6146,10 @@ msgstr "إنشاء مُضلع التنقل" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles" -msgstr "تحويل إلي %s" +msgstr "تحويل إلى %s" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Generating Visibility Rect" msgstr "توليد Rect الرؤية" @@ -6173,23 +6171,20 @@ 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 "العقدة لا تحتوي على هندسة (الوجوه)." +msgstr "الهندسة لا تحتوي على وجوه." #: editor/plugins/particles_editor_plugin.cpp msgid "\"%s\" doesn't inherit from Spatial." msgstr "\"%s\" لا يرث الفراغي Spatial." #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "\"%s\" doesn't contain geometry." -msgstr "العقدة لا تحتوي على هندسة." +msgstr "\"%s\" لا تحتوي على هندسة." #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "\"%s\" doesn't contain face geometry." -msgstr "العقدة لا تحتوي على هندسة." +msgstr "\"%s\" لا تحتوي على هندسة وجه." #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emitter" @@ -6249,9 +6244,8 @@ 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 msgid "Move Point in Curve" @@ -6882,49 +6876,42 @@ msgid "Debugger" msgstr "مُنقح الأخطاء" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Search Results" -msgstr "إبحث في المساعدة" +msgstr "نتائج البحث" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Clear Recent Scripts" -msgstr "إخلاء المشاهد الحالية" +msgstr "إخلاء النصوص البرمجية الحديثة" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Connections to method:" -msgstr "صلها بالعقدة:" +msgstr "الاتصالات لدالة:" #: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp -#, fuzzy msgid "Source" -msgstr "مورد" +msgstr "مصدر" #: editor/plugins/script_text_editor.cpp msgid "Target" 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 "[Ignore]" msgstr "(تجاهل)" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Line" -msgstr "الخط:" +msgstr "خط" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Function" -msgstr "مسح المهمة" +msgstr "انتقل الى الوظيفة البرمجية" #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." @@ -6974,9 +6961,8 @@ msgid "Bookmarks" 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 @@ -7025,66 +7011,56 @@ msgid "Complete Symbol" msgstr "رمز التمام" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Evaluate Selection" -msgstr "تكبير المحدد" +msgstr "تقييم الاختيار" #: editor/plugins/script_text_editor.cpp msgid "Trim Trailing Whitespace" msgstr "تشذيب الفراغات البيضاء الزائدة" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Convert Indent to Spaces" -msgstr "تحويل إلي %s" +msgstr "تحويل المسافة البادئة إلى مسافات" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Convert Indent to Tabs" -msgstr "تحويل إلي %s" +msgstr "تحويل المسافة البادئة إلى تبويبات" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" msgstr "مسافة بادئة تلقائية" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Find in Files..." -msgstr "فلتر الملفات..." +msgstr "جِد في الملفات..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" msgstr "مساعدة سياقية" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Toggle Bookmark" -msgstr "إلغاء/تفعيل وضع النظرة الحرة" +msgstr "تبديل العلامة المرجعية" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Next Bookmark" -msgstr "إذهب إلي الخطوة التالية" +msgstr "الانتقال إلى العلامة المرجعية التالية" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Previous Bookmark" -msgstr "إذهب إلي الخطوة السابقة" +msgstr "الانتقال إلى العلامة المرجعية السابقة" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Remove All Bookmarks" -msgstr "مسح الكل" +msgstr "إزالة جميع الإشارات المرجعية" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Function..." -msgstr "مسح المهمة" +msgstr "الذهاب إلى وظيفة برمجية..." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Line..." -msgstr "إذهب إلي الخط" +msgstr "الذهاب إلى خط..." #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -7096,14 +7072,12 @@ msgid "Remove All Breakpoints" msgstr "إزالة جميع نقاط التكسّر" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Next Breakpoint" -msgstr "إذهب إلي الخطوة التالية" +msgstr "الذهاب إلى نقطة التكسّر التالية" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Previous Breakpoint" -msgstr "إذهب إلي الخطوة السابقة" +msgstr "الذهاب إلى نقطة التكسّر السابقة" #: editor/plugins/shader_editor_plugin.cpp msgid "" @@ -7122,9 +7096,8 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "لا يملك هذا الهكيل أيّة عظام، أنشئ بعض عُقد العظام ثنائية البُعد كأبناء." #: 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" @@ -7143,23 +7116,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 msgid "Skeleton" msgstr "الهيكل" #: editor/plugins/skeleton_editor_plugin.cpp -#, fuzzy msgid "Create physical skeleton" -msgstr "إنشاء حل C#" +msgstr "إنشاء هيكل عظمي مادي" #: editor/plugins/skeleton_ik_editor_plugin.cpp -#, fuzzy msgid "Play IK" -msgstr "تشغيل" +msgstr "تشغيل IK" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" @@ -7352,12 +7322,11 @@ msgstr "المستمع الصوتي" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Enable Doppler" -msgstr "تغيير خط الحركة" +msgstr "تفعيل دوبلر" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Cinematic Preview" -msgstr "يُنشئ مستعرضات الميش" +msgstr "معاينة سينمائية" #: editor/plugins/spatial_editor_plugin.cpp msgid "Not available when using the GLES2 renderer." @@ -7419,6 +7388,12 @@ msgid "" "Closed eye: Gizmo is hidden.\n" "Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")." msgstr "" +"انقر للتبديل بين حالات الرؤية.\n" +"\n" +"العين المفتوحة: الأداة مرئية.\n" +"العين المغلقة: الأداة مخفية.\n" +"العين نصف مفتوحة: الأداة مرئية أيضا من خلال الأسطح المعتمة (\"الأشعة السينية" +"\")." #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Nodes To Floor" @@ -7496,9 +7471,8 @@ msgid "Transform" msgstr "التحوّل" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Snap Object to Floor" -msgstr "الكبس إلي الشبكة" +msgstr "محاذاة الشيء إلى الأرض" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog..." @@ -7542,9 +7516,8 @@ msgstr "إظهار الشبكة" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Settings..." -msgstr "جاري الإعداد..." +msgstr "اعدادات..." #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" @@ -7612,48 +7585,40 @@ msgid "Nameless gizmo" msgstr "أداة (gizmo) غير مسماة" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create Mesh2D" -msgstr "إنشاء شبكة الخطوط العريضة" +msgstr "إنشاء Mesh2D" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Mesh2D Preview" -msgstr "يُنشئ مستعرضات الميش" +msgstr "معاينة Mesh2D" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create Polygon2D" -msgstr "إنشاء بولي" +msgstr "إنشاء مُضلع ثنائي الأبعاد" #: editor/plugins/sprite_editor_plugin.cpp msgid "Polygon2D Preview" msgstr "مُعاينة المُضلع ثنائي الأبعاد" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create CollisionPolygon2D" -msgstr "إنشاء مُضلع التنقل" +msgstr "إنشاء مُضلع تصادم ثنائي الأبعاد" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "CollisionPolygon2D Preview" -msgstr "إنشاء مُضلع التنقل" +msgstr "معاينة مُضلع التصادم ثنائي الأبعاد" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create LightOccluder2D" -msgstr "أنشئ شكل مُطبق" +msgstr "إنشاء LightOccluder2D" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "LightOccluder2D Preview" -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." @@ -7666,27 +7631,24 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "هندسياً غير صالح، لا يمكن استبداله بسطح (mesh)." #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to Mesh2D" -msgstr "تحويل إلي %s" +msgstr "تحويل إلى Mesh2D" #: 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 "تحويل إلي %s" +msgstr "تحويل إلى مُضلع ثنائي الأبعاد" #: 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 "إنشاء شقيق لمُضلع التصادم ثنائي الأبعاد" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create light occluder." @@ -7714,9 +7676,8 @@ msgid "Grow (Pixels): " msgstr "التكبير (Pixels): " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Update Preview" -msgstr "إستعراض" +msgstr "تحديث المُعاينة" #: editor/plugins/sprite_editor_plugin.cpp msgid "Settings:" @@ -7787,9 +7748,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" @@ -7812,9 +7772,8 @@ msgid "Move (After)" msgstr "تحريك (للتالي)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select Frames" -msgstr "تحديد الوضع" +msgstr "تحديد الإطارات" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Horizontal:" @@ -7926,23 +7885,20 @@ msgid "Create From Current Editor Theme" msgstr "إنشاء مستمد من موضوع Theme المحرر الحالي" #: 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" @@ -7969,14 +7925,12 @@ msgid "Submenu" msgstr "القائمة الفرعية" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Subitem 1" -msgstr "عنصر" +msgstr "العنصر الفرعي 1" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Subitem 2" -msgstr "عنصر" +msgstr "العنصر الفرعي 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" @@ -7987,9 +7941,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" @@ -8004,18 +7957,16 @@ 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" msgstr "الشجرة الفرعية" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Has,Many,Options" -msgstr "بكثير، خيارات عديدة،!" +msgstr "يمتلك، خيارات، عديدة" #: editor/plugins/theme_editor_plugin.cpp msgid "Data Type:" @@ -8039,9 +7990,8 @@ msgid "Color" msgstr "اللون" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme File" -msgstr "إفتح ملف" +msgstr "ملف الثيم" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" @@ -8054,9 +8004,8 @@ 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" @@ -8092,9 +8041,8 @@ msgid "Disable Autotile" msgstr "تعطيل البلاط التلقائي Autotile" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Enable Priority" -msgstr "تعديل المصافي" +msgstr "تمكين الأولوية" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -8123,14 +8071,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" @@ -8141,9 +8087,8 @@ msgid "Flip Vertically" msgstr "القلب عموديًا" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Clear Transform" -msgstr "تحويل تغيير التحريك" +msgstr "محو التَحَوّل" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Add Texture(s) to TileSet." @@ -8184,9 +8129,8 @@ 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." @@ -8267,9 +8211,8 @@ msgid "Erase bitmask." msgstr "زر الفأرة الأيمن: مسح النقطة." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create a new rectangle." -msgstr "إنشاء %s جديد" +msgstr "إنشاء مستطيل جديد." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create a new polygon." @@ -8544,9 +8487,8 @@ msgid "Add a commit message" msgstr "إضافة رسالة إجراء" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Changes" -msgstr "مزامنة تغييرات الكود" +msgstr "اقتراف التعديلا" #: editor/plugins/version_control_editor_plugin.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp @@ -9342,9 +9284,8 @@ msgid "Vector constant." msgstr "ثابت المُتجه." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector uniform." -msgstr "التعين للإنتظام." +msgstr "مُتجهات موحدة." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -10164,9 +10105,8 @@ msgid "Settings saved OK." msgstr "تيسّر حفظ الإعدادات." #: editor/project_settings_editor.cpp -#, fuzzy msgid "Moved Input Action Event" -msgstr "حرك النقطة داخل المنحنى" +msgstr "حدث إجراء إدخال الذي تم نقله" #: editor/project_settings_editor.cpp msgid "Override for Feature" @@ -10361,9 +10301,8 @@ msgid "Select Method" msgstr "إختر طريقة" #: editor/rename_dialog.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Batch Rename" -msgstr "إعادة التسمية" +msgstr "إعادة تسمية الدفعة" #: editor/rename_dialog.cpp msgid "Prefix" @@ -10386,9 +10325,8 @@ msgid "Substitute" msgstr "استبدال" #: editor/rename_dialog.cpp -#, fuzzy msgid "Node name" -msgstr "إسم العقدة:" +msgstr "إسم العقدة" #: editor/rename_dialog.cpp msgid "Node's parent name, if available" @@ -10427,9 +10365,8 @@ msgid "Initial value for the counter" msgstr "القيمة المبدئية للعداد" #: editor/rename_dialog.cpp -#, fuzzy msgid "Step" -msgstr "خطوة (ثانية):" +msgstr "الخطوة" #: editor/rename_dialog.cpp msgid "Amount by which counter is incremented for each node" @@ -10476,9 +10413,8 @@ msgid "To Uppercase" msgstr "لأحرف كبيرة Uppercase" #: editor/rename_dialog.cpp -#, fuzzy msgid "Reset" -msgstr "إرجاع التكبير" +msgstr "إعادة تعيين" #: editor/rename_dialog.cpp msgid "Regular Expression Error" @@ -10551,9 +10487,8 @@ msgid "Instance Child Scene" msgstr "نمذجة المشهد الابن" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Detach Script" -msgstr "إلحاق نص برمجي" +msgstr "فصل النص البرمجي" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on the tree root." @@ -10586,19 +10521,16 @@ 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 -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "حذف العُقدة \"%s\" مع جميع أبنائها؟" +msgstr "حذف العُقدة %d مع جميع أبنائها؟" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes?" -msgstr "إنشاء عقدة" +msgstr "حذف العُقد %d" #: editor/scene_tree_dock.cpp msgid "Delete the root node \"%s\"?" @@ -10609,9 +10541,8 @@ msgid "Delete node \"%s\" and its children?" msgstr "حذف العُقدة \"%s\" مع جميع أبنائها؟" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete node \"%s\"?" -msgstr "إنشاء عقدة" +msgstr "حذف العقدة \"%s\"؟" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." @@ -10667,9 +10598,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!" @@ -10722,9 +10652,8 @@ msgid "Load As Placeholder" msgstr "تحميله كعنصر نائب" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Open Documentation" -msgstr "فُتح مؤخراً" +msgstr "فتح الوثائق" #: editor/scene_tree_dock.cpp msgid "" @@ -10732,15 +10661,16 @@ msgid "" "This is probably because this editor was built with all language modules " "disabled." msgstr "" +"لا يمكن إرفاق نص برمجي: لا توجد لغات مسجلة.\n" +"ربما يكون هذا بسبب أن المحرر تم إنشاؤه مع تعطيل جميع وحدات اللغة." #: 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" @@ -10752,9 +10682,8 @@ msgid "Reparent to New Node" msgstr "إنشاء %s جديد" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Make Scene Root" -msgstr "حفظ المشهد" +msgstr "جعل المشهد الرئيس" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" @@ -10773,9 +10702,8 @@ msgid "Delete (No Confirm)" msgstr "حذف (دون تأكيد)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "إنشاء %s جديد" +msgstr "إضافة/إنشاء عقدة جديدة." #: editor/scene_tree_dock.cpp msgid "" @@ -10786,14 +10714,12 @@ msgstr "" "موروث." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Attach a new or existing script to the selected node." msgstr "إلحاق نص برمجي موجود أو جديد للعُقدة المختارة." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Detach the script from the selected node." -msgstr "مسح النص البرمجي للعُقدة المختارة." +msgstr "فصل النص البرمجي من العُقدة المختارة." #: editor/scene_tree_dock.cpp msgid "Remote" @@ -10808,9 +10734,8 @@ msgid "Clear Inheritance? (No Undo!)" msgstr "مسح الموروث؟ (لا تراجع!)" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Toggle Visible" -msgstr "أظهر الملفات المخفية" +msgstr "تشغيل/إطفاء الوضوحية" #: editor/scene_tree_editor.cpp #, fuzzy diff --git a/editor/translations/cs.po b/editor/translations/cs.po index e629fbc2ff..0d2ae15065 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -20,12 +20,13 @@ # Filip Vincůrek <vincurek.f@gmail.com>, 2020. # Ondrej Pavelka <ondrej.pavelka@outlook.com>, 2020. # Zbyněk <zbynek.fiala@gmail.com>, 2020. +# Daniel Kříž <Daniel.kriz@protonmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-28 09:51+0000\n" -"Last-Translator: Zbyněk <zbynek.fiala@gmail.com>\n" +"PO-Revision-Date: 2020-08-11 14:04+0000\n" +"Last-Translator: Daniel Kříž <Daniel.kriz@protonmail.com>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/" "cs/>\n" "Language: cs\n" @@ -8184,9 +8185,8 @@ msgid "Occlusion" msgstr "Editovat polygon" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation" -msgstr "Vytvořit Navigation Mesh" +msgstr "Navigace" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8965,7 +8965,7 @@ msgstr "Vrátí hyperbolický kosinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." -msgstr "Konvertuje množství v radiánech na stupně." +msgstr "Konvertuje hodnotu v radiánech na stupně." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-e Exponential." @@ -9022,7 +9022,7 @@ msgstr "Vrátí hodnotu prvního parametru umocněného druhým." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in degrees to radians." -msgstr "Konvertuje množství ve stupních na radiány." +msgstr "Konvertuje hodnotu ve stupních na radiány." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / scalar" @@ -9521,7 +9521,7 @@ msgstr "Soubour balíčk" #: editor/project_export.cpp msgid "Features" -msgstr "Funkce" +msgstr "Vlastnosti" #: editor/project_export.cpp msgid "Custom (comma-separated):" @@ -10387,7 +10387,7 @@ msgstr "" #: editor/rename_dialog.cpp msgid "Padding" -msgstr "" +msgstr "Odsazení" #: editor/rename_dialog.cpp msgid "" @@ -10475,7 +10475,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "No parent to instance the scenes at." -msgstr "" +msgstr "Chybí rodič pro instancování scény." #: editor/scene_tree_dock.cpp msgid "Error loading scene from %s" @@ -10489,7 +10489,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Instance Scene(s)" -msgstr "" +msgstr "Scéna/Scény instance" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10501,9 +10501,8 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Detach Script" -msgstr "Připojit skript" +msgstr "Odpojit skript" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on the tree root." @@ -10534,9 +10533,8 @@ msgid "Instantiated scenes can't become root" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Make node as Root" -msgstr "Dává smysl!" +msgstr "Nastavit uzel jako zdrojový" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10693,9 +10691,8 @@ msgid "Reparent to New Node" msgstr "Přidat/Vytvořit nový uzel" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Make Scene Root" -msgstr "Dává smysl!" +msgstr "Nastav scénu jako zdrojovou" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" @@ -10795,6 +10792,8 @@ msgid "" "Node is locked.\n" "Click to unlock it." msgstr "" +"Uzel je zamčený.\n" +"Klikněte pro odemčení." #: editor/scene_tree_editor.cpp msgid "" @@ -11219,16 +11218,15 @@ msgstr "" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Select dependencies of the library for this entry" -msgstr "" +msgstr "Vyberte závislosti knihovny pro tento vstup" #: modules/gdnative/gdnative_library_editor_plugin.cpp -#, fuzzy msgid "Remove current entry" -msgstr "Odstranit signál" +msgstr "Odstranit aktuální vstup" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Double click to create a new entry" -msgstr "" +msgstr "Stiskněte dvakrát pro vytvoření nového vstupu" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Platform:" @@ -12647,16 +12645,15 @@ msgstr "HSV" #: scene/gui/color_picker.cpp msgid "Raw" -msgstr "" +msgstr "Raw" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." -msgstr "" +msgstr "Přepni mezi hexadecimálními a kódovými hodnotami." #: scene/gui/color_picker.cpp -#, fuzzy msgid "Add current color as a preset." -msgstr "Přidat aktuální barvu jako předvolbu" +msgstr "Přidat aktuální barvu jako předvolbu." #: scene/gui/container.cpp msgid "" @@ -12730,11 +12727,11 @@ msgstr "" #: scene/main/viewport.cpp msgid "Viewport size must be greater than 0 to render anything." msgstr "" +"Velikost pohledu musí být větší než 0, aby bylo možné cokoliv renderovat." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid source for preview." -msgstr "Neplatný zdroj pro shader." +msgstr "Neplatný zdroj pro náhled." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." @@ -12747,15 +12744,15 @@ msgstr "Neplatný zdroj pro shader." #: servers/visual/shader_language.cpp msgid "Assignment to function." -msgstr "" +msgstr "Přiřazeno funkci." #: servers/visual/shader_language.cpp msgid "Assignment to uniform." -msgstr "" +msgstr "Přiřazeno uniformu." #: servers/visual/shader_language.cpp msgid "Varyings can only be assigned in vertex function." -msgstr "" +msgstr "Odlišnosti mohou být přiřazeny pouze ve vertex funkci." #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." diff --git a/editor/translations/de.po b/editor/translations/de.po index 4b8252173e..081dfb8e4f 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -54,12 +54,13 @@ # Jacqueline Ulken <Jacqueline.Ulken@protonmail.com>, 2020. # Günther Bohn <ciscouser@gmx.de>, 2020. # Tom Wor <mail@tomwor.com>, 2020. +# Bjarne Hiller <bjarne.hiller@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-28 09:51+0000\n" -"Last-Translator: Tom Wor <mail@tomwor.com>\n" +"PO-Revision-Date: 2020-08-05 16:58+0000\n" +"Last-Translator: Bjarne Hiller <bjarne.hiller@gmail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -9610,7 +9611,7 @@ msgstr "Pack-Datei" #: editor/project_export.cpp msgid "Features" -msgstr "Funktionen" +msgstr "Eigenschaften" #: editor/project_export.cpp msgid "Custom (comma-separated):" @@ -10637,9 +10638,8 @@ msgid "Make node as Root" msgstr "Node zur Szenenwurzel machen" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Node „%s“ und Unterobjekte löschen?" +msgstr "%d Nodes und ihre Unterobjekte löschen?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -12346,6 +12346,9 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"Polygon basierte Formen sollten nicht direkt in CollisionShape2D-Nodes " +"genutzt oder bearbeitet werden. Zu diesem Zweck sollte das CollsionPolygon2D-" +"Node verwendet werden." #: scene/2d/cpu_particles_2d.cpp msgid "" diff --git a/editor/translations/el.po b/editor/translations/el.po index dff4eaafb0..7c2a202767 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-11 01:21+0000\n" -"Last-Translator: KostasMSC <kargyris@athtech.gr>\n" +"PO-Revision-Date: 2020-08-11 14:04+0000\n" +"Last-Translator: George Tsiamasiotis <gtsiam@windowslive.com>\n" "Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/" "el/>\n" "Language: el\n" @@ -503,8 +503,8 @@ msgstr "" "εισαγωγής της σκηνής και θέστε\n" "το «Animation > Storage» σε «Files», ενεργοποιήστε το «Animation > Keep " "Custom Tracks», και κάντε επαν-εισαγωγή.\n" -"Εναλλακτικά, χρησιμοποιήστε μία διαμόρφωση εισαγωγής που εισάγει κινήσεις " -"σε ξεχωριστά αρχεία." +"Εναλλακτικά, χρησιμοποιήστε μία διαμόρφωση εισαγωγής που εισάγει κινήσεις σε " +"ξεχωριστά αρχεία." #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" @@ -1597,7 +1597,7 @@ msgstr "Δεν βρέθηκε προσαρμοσμένο πακέτο αποσφ #: 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 "Δεν βρέθηκε προσαρμοσμένο πακέτο παραγωγής." +msgstr "Δεν βρέθηκε προσαρμοσμένο πακέτο διανομής." #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:" @@ -2456,13 +2456,13 @@ 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 "" -"Αποθήκευση αλλαγών στις ακόλουθες σκηνές σκηνές πριν το άνοιγμα του " -"διαχειριστή έργων;" +"Αποθήκευση αλλαγών στις ακόλουθες σκηνές πριν το άνοιγμα του Διαχειριστή " +"Έργων;" #: editor/editor_node.cpp msgid "" @@ -3128,7 +3128,7 @@ msgstr "Άνοιγμα βιβλιοθήκης" #: editor/editor_node.cpp msgid "Open the next Editor" -msgstr "Άνοιγμα του επόμενου επεξεργαστή" +msgstr "Άνοιγμα του επόμενου Επεξεργαστή" #: editor/editor_node.cpp msgid "Open the previous Editor" @@ -3478,7 +3478,7 @@ msgid "" "for official releases." msgstr "" "Δεν βρέθηκαν συνδέσμοι λήψης για την τρέχουσα έκδοση. Η απευθείας λήψη είναι " -"διαθέσιμη μόνο για τις επίσημες εκδόσεις." +"διαθέσιμη μόνο για τις επίσημες διανομές." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3987,6 +3987,7 @@ msgstr "Σφάλμα κατά την εκτέλεση της δέσμης ενε #: editor/import/resource_importer_scene.cpp msgid "Did you return a Node-derived object in the `post_import()` method?" msgstr "" +"Μήπως επιστρέψατε ένα αντικείμενο τύπου κόμβου στην μέθοδο `post_import()`;" #: editor/import/resource_importer_scene.cpp msgid "Saving..." @@ -6213,7 +6214,7 @@ msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" -msgstr "Χρόνος παραγωγής (sec):" +msgstr "Χρόνος Παραγωγής (sec):" #: editor/plugins/particles_editor_plugin.cpp msgid "The geometry's faces don't contain any area." @@ -6856,7 +6857,7 @@ msgstr "Κλείσιμο όλων" #: editor/plugins/script_editor_plugin.cpp msgid "Close Docs" -msgstr "Κλείσιμο τεκμηρίωσης" +msgstr "Κλείσιμο Τεκμηρίωσης" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" @@ -6957,9 +6958,8 @@ msgstr "" "κόμβο «%s»." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "[Ignore]" -msgstr "(Παράβλεψη)" +msgstr "[Παράβλεψη]" #: editor/plugins/script_text_editor.cpp msgid "Line" @@ -7449,6 +7449,11 @@ msgid "" "Closed eye: Gizmo is hidden.\n" "Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")." msgstr "" +"Πατήστε για εναλλαγή λειτουργίας ορατότητας.\n" +"\n" +"Ανοιχτό μάτι: Ορατό μαραφέτι.\n" +"Κλειστό μάτι: Κρυμμένο μαραφέτι.\n" +"Ημι-ανοιχτό μάτι: Μαραφέτι ορατό και μέσα από στερεές επιφάνειες (\"x-ray\")." #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Nodes To Floor" @@ -8361,7 +8366,9 @@ msgstr "" msgid "" "Select sub-tile to change its priority.\n" "Click on another Tile to edit it." -msgstr "Επιλέξτε υποπλακίδιο για να αλλάξετε την προτεραιότητα του." +msgstr "" +"Επιλέξτε υποπλακίδιο για να αλλάξετε την προτεραιότητα του.\n" +"Πατήστε σε άλλο Πλακίδιο για να το επεξεργαστείτε." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -9069,7 +9076,7 @@ msgstr "Επιστρέφει την υπερβολική εφαπτομένη τ #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the truncated value of the parameter." -msgstr "Βρίσκει την περικομμένη τιμή της παραμέτρου." +msgstr "Βρίσκει την περικομμένη τιμή της παραμέτρου." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -9468,7 +9475,7 @@ msgstr "" #: editor/project_export.cpp msgid "Release" -msgstr "Κυκλοφορία" +msgstr "Διανομή" #: editor/project_export.cpp msgid "Exporting All" @@ -9971,6 +9978,10 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"Το κουτί αναζήτησης φιλτράρει έργα βάσει ονόματος και τελικού μέρους της " +"διαδρομής τους.\n" +"Για φιλτράρισμα βάσει ονόματος και πλήρης διαδρομής, το ερώτημα πρέπει να " +"περιέχει τουλάχιστον έναν χαρακτήρα `/`." #: editor/project_settings_editor.cpp msgid "Key " @@ -10142,7 +10153,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Add Input Action" -msgstr "Προσθήκη συμβάντος ενέργειας εισόδου" +msgstr "Προσθήκη Ενέργειας Εισόδου" #: editor/project_settings_editor.cpp msgid "Error saving settings." @@ -10537,9 +10548,8 @@ msgid "Instance Child Scene" msgstr "Αρχικοποίηση σκηνής ως παιδί" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Detach Script" -msgstr "Σύνδεση Δέσμης Ενεργειών" +msgstr "Αποσύνδεση Δέσμης Ενεργειών" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on the tree root." @@ -10577,9 +10587,8 @@ msgid "Make node as Root" msgstr "Κάνε κόμβο ρίζα" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Διαγραφή κόμβου \"%s\" και των παιδιών του;" +msgstr "Διαγραφή %d κόμβων και τυχών παιδιών τους;" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -10720,6 +10729,9 @@ msgid "" "This is probably because this editor was built with all language modules " "disabled." msgstr "" +"Αδυναμία σύνδεσης δέσμης ενεργειών: Καμία γλώσσα στο μητρώο.\n" +"Αυτό μπορεί να προκληθεί αν ο επεξεργαστής χτιστεί χωρίς καμία λειτουργική " +"μονάδα γλώσσας." #: editor/scene_tree_dock.cpp msgid "Add Child Node" @@ -10770,14 +10782,12 @@ msgstr "" "υπάρχει πηγαίος κόμβος." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Attach a new or existing script to the selected node." -msgstr "Σύνδεση νέας ή υπαρκτής δέσμης ενεργειών για τον επιλεγμένο κόμβο." +msgstr "Σύνδεση νέας ή υπαρκτής δέσμης ενεργειών στον επιλεγμένο κόμβο." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Detach the script from the selected node." -msgstr "Εκκαθάριση δέσμης ενεργειών για τον επιλεγμένο κόμβο." +msgstr "Αποσύνδεση της δέσμης ενεργειών από τον επιλεγμένο κόμβο." #: editor/scene_tree_dock.cpp msgid "Remote" @@ -11118,9 +11128,8 @@ msgid "Total:" msgstr "Συνολικά:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "Εξαγωγή Προφίλ" +msgstr "Εξαγωγή λίστας σε αρχείο CSV" #: editor/script_editor_debugger.cpp msgid "Resource Path" @@ -12016,11 +12025,9 @@ msgstr "" "διαμόρφωση." #: platform/android/export/export.cpp -#, fuzzy msgid "Release keystore incorrectly configured in the export preset." msgstr "" -"Το «debug keystore» δεν έχει καθοριστεί στις Ρυθμίσεις Επεξεργαστή ή την " -"διαμόρφωση." +"Εσφαλμένη ρύθμιση αποθετηρίου κλειδιών διανομής στην διαμόρφωση εξαγωγής." #: platform/android/export/export.cpp msgid "Custom build requires a valid Android SDK path in Editor Settings." @@ -12055,26 +12062,35 @@ msgid "" "Invalid \"GodotPaymentV3\" module included in the \"android/modules\" " "project setting (changed in Godot 3.2.2).\n" msgstr "" +"Εσφαλμένη λειτουργική μονάδα «GodotPaymentV3» στην ρύθμιση εργου «Android/" +"Modules» (άλλαξε στην Godot 3.2.2).\n" #: platform/android/export/export.cpp msgid "\"Use Custom Build\" must be enabled to use the plugins." msgstr "" +"Η επιλογή «Use Custom Build» πρέπει να ενεργοποιηθεί για χρήση προσθέτων." #: platform/android/export/export.cpp msgid "" "\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR" "\"." msgstr "" +"Το «Degrees Of Freedom» είναι έγκυρο μόνο όταν το «Xr Mode» είναι «Oculus " +"Mobile VR»." #: platform/android/export/export.cpp msgid "" "\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"." msgstr "" +"Το «Hand Tracking» είναι έγκυρο μόνο όταν το «Xr Mode» είναι «Oculus Mobile " +"VR»." #: platform/android/export/export.cpp msgid "" "\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"." msgstr "" +"Το «Focus Awareness» είναι έγκυρο μόνο όταν το «Xr Mode» είναι «Oculus " +"Mobile VR»." #: platform/android/export/export.cpp msgid "" @@ -12291,6 +12307,8 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"Τα σχήματα βασισμένα σε πολύγωνα δεν σχεδιάστικαν ώστε να είναι επεξεργάσιμα " +"από τον κόμβο CollisionShape2D. Χρησιμοποιήστε τον κόμβο CollisionPolygon2D." #: scene/2d/cpu_particles_2d.cpp msgid "" diff --git a/editor/translations/es.po b/editor/translations/es.po index e32797440e..172ce58604 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -18,7 +18,7 @@ # Jose Maria Martinez <josemar1992@hotmail.com>, 2018. # Juan Quiroga <juanquiroga9@gmail.com>, 2017. # Kiji Pixel <raccoon.fella@gmail.com>, 2017. -# Lisandro Lorea <lisandrolorea@gmail.com>, 2016-2017, 2019. +# Lisandro Lorea <lisandrolorea@gmail.com>, 2016-2017, 2019, 2020. # Lonsfor <lotharw@protonmail.com>, 2017-2018. # Mario Nachbaur <manachbaur@gmail.com>, 2018. # Oscar Carballal <oscar.carballal@protonmail.com>, 2017-2018. @@ -54,8 +54,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-28 09:51+0000\n" -"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" +"PO-Revision-Date: 2020-07-31 03:47+0000\n" +"Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" "Language: es\n" @@ -1764,7 +1764,7 @@ msgstr "Nuevo" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/project_manager.cpp msgid "Import" -msgstr "Importar" +msgstr "Importación" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" @@ -10627,9 +10627,8 @@ msgid "Make node as Root" msgstr "Convertir nodo como Raíz" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "¿Eliminar el nodo \"%s\" y sus hijos?" +msgstr "¿Eliminar %d nodos y sus hijos?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -12352,6 +12351,9 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"Las formas basadas en polígonos no están pensadas para ser usadas ni " +"editadas directamente a través del nodo CollisionShape2D. Por favor, usa el " +"nodo CollisionPolygon2D en su lugar." #: scene/2d/cpu_particles_2d.cpp msgid "" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 92e6e7d511..f2c72ce1be 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-06-25 08:40+0000\n" +"PO-Revision-Date: 2020-07-31 03:47+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" @@ -10578,9 +10578,8 @@ msgid "Make node as Root" msgstr "Convertir nodo en Raíz" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "¿Eliminar el nodo \"%s\" y sus hijos?" +msgstr "¿Eliminar %d nodos y sus hijos?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -10588,7 +10587,7 @@ msgstr "¿Eliminar %d nodos?" #: editor/scene_tree_dock.cpp msgid "Delete the root node \"%s\"?" -msgstr "¿Eliminar el nodo raiz \"%s\"?" +msgstr "¿Eliminar el nodo raíz \"%s\"?" #: editor/scene_tree_dock.cpp msgid "Delete node \"%s\" and its children?" @@ -12298,6 +12297,9 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"Las formas basadas en polígonos no están pensadas para ser usadas ni " +"editadas directamente a través del nodo CollisionShape2D. Por favor, usá el " +"nodo CollisionPolygon2D en su lugar." #: scene/2d/cpu_particles_2d.cpp msgid "" diff --git a/editor/translations/et.po b/editor/translations/et.po index ae27129ab6..504de558d5 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2020-07-26 15:42+0000\n" +"PO-Revision-Date: 2020-08-11 14:04+0000\n" "Last-Translator: StReef <streef.gtx@gmail.com>\n" "Language-Team: Estonian <https://hosted.weblate.org/projects/godot-engine/" "godot/et/>\n" @@ -638,9 +638,8 @@ msgid "Copy" msgstr "Kopeeri" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Tühista Valik" +msgstr "Vali kõik/mitte ükski" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -1356,7 +1355,7 @@ msgstr "Lae olemasolev siini paigutus." #: editor/editor_audio_buses.cpp msgid "Save As" -msgstr "Salvesta kui…" +msgstr "Salvesta kui" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." @@ -1510,7 +1509,6 @@ msgid "Choose" msgstr "Vali" #: editor/editor_export.cpp -#, fuzzy msgid "Storing File:" msgstr "Salvestan faili:" @@ -1823,14 +1821,12 @@ msgid "Move Favorite Down" msgstr "Liiguta lemmikud alla" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to previous folder." -msgstr "Mine Eelmisele Sammule" +msgstr "Mine eelmisesse kausta." #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to next folder." -msgstr "Mine Järgmisele Sammule" +msgstr "Mine järmisesse kausta." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." @@ -1887,7 +1883,6 @@ msgstr "" "katkestati" #: editor/editor_file_system.cpp -#, fuzzy msgid "(Re)Importing Assets" msgstr "(Taas)impordin varasid" @@ -1906,7 +1901,7 @@ msgstr "Pärib:" #: editor/editor_help.cpp msgid "Inherited by:" -msgstr "Päritud %s poolt" +msgstr "Päritud %s poolt:" #: editor/editor_help.cpp msgid "Description" @@ -2078,9 +2073,8 @@ msgstr "Lõpeta" #: editor/editor_network_profiler.cpp editor/editor_profiler.cpp #: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp -#, fuzzy msgid "Start" -msgstr "Start/Käivita" +msgstr "Käivita" #: editor/editor_network_profiler.cpp msgid "%s/s" @@ -2364,9 +2358,8 @@ msgid "Can't reload a scene that was never saved." msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Reload Saved Scene" -msgstr "Stseeni salvestamine" +msgstr "Taaslae salvestatud stseen" #: editor/editor_node.cpp msgid "" @@ -2571,9 +2564,8 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "Kopeeri" +msgstr "Kopeeri tekst" #: editor/editor_node.cpp msgid "Next tab" @@ -3642,9 +3634,8 @@ msgid "Overwrite" msgstr "" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Create Scene" -msgstr "Loo" +msgstr "Loo stseen" #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp msgid "Create Script" @@ -4249,19 +4240,16 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Anim Clips" -msgstr "Animatsiooni Klipid:" +msgstr "Animatsiooniklipid" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Audio Clips" -msgstr "Heliklipid:" +msgstr "Heliklipid" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Functions" -msgstr "Funktsioonid:" +msgstr "Funktsioonid" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp @@ -4774,9 +4762,8 @@ msgid "Request failed, timeout" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Timeout." -msgstr "Aeg:" +msgstr "Aeg maha." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." @@ -4990,9 +4977,8 @@ msgid "Create Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" -msgstr "Eemalda kehtetud võtmed" +msgstr "Eemalda vertikaalne juht" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Horizontal Guide" @@ -5003,9 +4989,8 @@ msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" -msgstr "Eemalda kehtetud võtmed" +msgstr "Eemalda horisontaalne juht" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Horizontal and Vertical Guides" @@ -6822,9 +6807,8 @@ msgid "Complete Symbol" msgstr "" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Evaluate Selection" -msgstr "Kustuta Valim" +msgstr "Hinda valikut" #: editor/plugins/script_text_editor.cpp msgid "Trim Trailing Whitespace" @@ -8235,9 +8219,8 @@ msgid "Renamed" msgstr "" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Deleted" -msgstr "Kustuta Võti (Võtmed)" +msgstr "Kustutatud" #: editor/plugins/version_control_editor_plugin.cpp msgid "Typechange" @@ -10155,12 +10138,11 @@ msgstr "" #: editor/scene_tree_dock.cpp #, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Kustuta Võti (Võtmed)" +msgstr "Kustuta %d sõlmed ja iga alamsõlm?" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes?" -msgstr "Kustuta Võti (Võtmed)" +msgstr "Kustuta %d sõlmed?" #: editor/scene_tree_dock.cpp msgid "Delete the root node \"%s\"?" @@ -10171,9 +10153,8 @@ msgid "Delete node \"%s\" and its children?" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete node \"%s\"?" -msgstr "Kustuta Võti (Võtmed)" +msgstr "Kustuta sõlm \"%s\"?" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." @@ -10573,9 +10554,8 @@ msgid "Warning:" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Error:" -msgstr "Peegel" +msgstr "Viga:" #: editor/script_editor_debugger.cpp msgid "C++ Error" @@ -10998,9 +10978,8 @@ msgid "Cursor Clear Rotation" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Paste Selects" -msgstr "Kustuta Valitud Võti (Võtmed)" +msgstr "Kleebi valikud" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clear Selection" @@ -11347,9 +11326,8 @@ msgid "Try to only have one sequence input in selection." msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "Loo" +msgstr "Loo funktsioon" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -11388,14 +11366,12 @@ msgid "Add Nodes..." msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Function..." -msgstr "Funktsioonid:" +msgstr "Lisa funktsioon..." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "Funktsioonid:" +msgstr "funktsiooni_nimi" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit its graph." @@ -11418,9 +11394,8 @@ msgid "Cut Nodes" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "Funktsioonid:" +msgstr "Loo funktsioon" #: modules/visual_script/visual_script_editor.cpp msgid "Refresh Graph" diff --git a/editor/translations/extract.py b/editor/translations/extract.py index 749bad5fff..02ed65131f 100755 --- a/editor/translations/extract.py +++ b/editor/translations/extract.py @@ -33,6 +33,7 @@ matches.sort() unique_str = [] unique_loc = {} +ctx_group = {} # Store msgctx, msg, and locations. main_po = """ # LANGUAGE translation of the Godot Engine editor. # Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. @@ -52,6 +53,34 @@ msgstr "" """ +def _write_message(msgctx, msg, msg_plural, location): + global main_po + main_po += "\n#: " + location + "\n" + if msgctx != "": + main_po += 'msgctxt "' + msgctx + '"\n' + main_po += 'msgid "' + msg + '"\n' + if msg_plural != "": + main_po += 'msgid_plural "' + msg_plural + '"\n' + main_po += 'msgstr[0] ""\n' + main_po += 'msgstr[1] ""\n' + else: + main_po += 'msgstr ""\n' + + +def _add_additional_location(msgctx, msg, location): + global main_po + # Add additional location to previous occurrence + msg_pos = -1 + if msgctx != "": + msg_pos = main_po.find('\nmsgctxt "' + msgctx + '"\nmsgid "' + msg + '"') + else: + msg_pos = main_po.find('\nmsgid "' + msg + '"') + + if msg_pos == -1: + print("Someone apparently thought writing Python was as easy as GDScript. Ping Akien.") + main_po = main_po[:msg_pos] + " " + location + main_po[msg_pos:] + + def process_file(f, fname): global main_po, unique_str, unique_loc @@ -60,10 +89,11 @@ def process_file(f, fname): lc = 1 while l: - patterns = ['RTR("', 'TTR("', 'TTRC("'] + patterns = ['RTR("', 'TTR("', 'TTRC("', 'TTRN("', 'RTRN("'] idx = 0 pos = 0 while pos >= 0: + # Loop until a pattern is found. If not, next line. pos = l.find(patterns[idx], pos) if pos == -1: if idx < len(patterns) - 1: @@ -72,29 +102,64 @@ def process_file(f, fname): continue pos += len(patterns[idx]) + # Read msg until " msg = "" while pos < len(l) and (l[pos] != '"' or l[pos - 1] == "\\"): msg += l[pos] pos += 1 + # Read plural. + msg_plural = "" + if patterns[idx] in ['TTRN("', 'RTRN("']: + pos = l.find('"', pos + 1) + pos += 1 + while pos < len(l) and (l[pos] != '"' or l[pos - 1] == "\\"): + msg_plural += l[pos] + pos += 1 + + # Read context. + msgctx = "" + pos += 1 + read_ctx = False + while pos < len(l): + if l[pos] == ")": + break + elif l[pos] == '"': + read_ctx = True + break + pos += 1 + + pos += 1 + if read_ctx: + while pos < len(l) and (l[pos] != '"' or l[pos - 1] == "\\"): + msgctx += l[pos] + pos += 1 + + # File location. location = os.path.relpath(fname).replace("\\", "/") if line_nb: location += ":" + str(lc) - if not msg in unique_str: - main_po += "\n#: " + location + "\n" - main_po += 'msgid "' + msg + '"\n' - main_po += 'msgstr ""\n' - unique_str.append(msg) - unique_loc[msg] = [location] - elif not location in unique_loc[msg]: - # Add additional location to previous occurrence too - msg_pos = main_po.find('\nmsgid "' + msg + '"') - if msg_pos == -1: - print("Someone apparently thought writing Python was as easy as GDScript. Ping Akien.") - main_po = main_po[:msg_pos] + " " + location + main_po[msg_pos:] - unique_loc[msg].append(location) - + if msgctx != "": + # If it's a new context or a new message within an existing context, then write new msgid. + # Else add location to existing msgid. + if not msgctx in ctx_group: + _write_message(msgctx, msg, msg_plural, location) + ctx_group[msgctx] = {msg: [location]} + elif not msg in ctx_group[msgctx]: + _write_message(msgctx, msg, msg_plural, location) + ctx_group[msgctx][msg] = [location] + elif not location in ctx_group[msgctx][msg]: + _add_additional_location(msgctx, msg, location) + ctx_group[msgctx][msg].append(location) + else: + if not msg in unique_str: + _write_message(msgctx, msg, msg_plural, location) + unique_str.append(msg) + unique_loc[msg] = [location] + elif not location in unique_loc[msg]: + _add_additional_location(msgctx, msg, location) + unique_loc[msg].append(location) l = f.readline() lc += 1 @@ -102,7 +167,7 @@ def process_file(f, fname): print("Updating the editor.pot template...") for fname in matches: - with open(fname, "r") as f: + with open(fname, "r", encoding="utf8") as f: process_file(f, fname) with open("editor.pot", "w") as f: diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 67deaf06b3..124ae4f2e0 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-06-26 06:11+0000\n" +"PO-Revision-Date: 2020-08-05 16:58+0000\n" "Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" @@ -1710,7 +1710,7 @@ msgstr "Uusi" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/project_manager.cpp msgid "Import" -msgstr "Tuo" +msgstr "Tuonti" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" @@ -8147,7 +8147,7 @@ msgstr "Peitto" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Navigation" -msgstr "Siirtyminen" +msgstr "Navigointi" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Bitmask" @@ -10525,9 +10525,8 @@ msgid "Make node as Root" msgstr "Tee solmusta juurisolmu" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Poista solmu \"%s\" ja sen alisolmut?" +msgstr "Poista %d solmua ja kaikki alisolmut?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -12228,6 +12227,9 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"Polygonipohjaisia muotoja ei ole tarkoitus käyttää tai muokata suoraan " +"CollisionShape2D solmun kautta. Ole hyvä ja käytä sen sijaan " +"CollisionPolygon2D solmua." #: scene/2d/cpu_particles_2d.cpp msgid "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 95e9d7a55c..9bb04cb2b0 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -79,8 +79,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-26 15:41+0000\n" -"Last-Translator: Nathan <bonnemainsnathan@gmail.com>\n" +"PO-Revision-Date: 2020-08-01 11:14+0000\n" +"Last-Translator: Pierre Caye <pierrecaye@laposte.net>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -1787,7 +1787,7 @@ msgstr "Nouveau" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/project_manager.cpp msgid "Import" -msgstr "Importer" +msgstr "Importation" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" diff --git a/editor/translations/he.po b/editor/translations/he.po index c3789f9804..0f9a19c842 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -14,12 +14,13 @@ # test test <ugbdvwpeikvyzwaadt@awdrt.org>, 2020. # Anonymous <noreply@weblate.org>, 2020. # Daniel Kariv <danielkariv98@gmail.com>, 2020. +# Ziv D <wizdavid@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-05-07 21:28+0000\n" -"Last-Translator: Anonymous <noreply@weblate.org>\n" +"PO-Revision-Date: 2020-08-11 14:04+0000\n" +"Last-Translator: Ziv D <wizdavid@gmail.com>\n" "Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/" "godot/he/>\n" "Language: he\n" @@ -28,7 +29,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 4.1-dev\n" +"X-Generator: Weblate 4.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -258,7 +259,7 @@ msgstr "החלפת נתיב רצועה" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." -msgstr "הפעל/כבה רצועה" +msgstr "הפעל/כבה רצועה." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" @@ -340,9 +341,8 @@ msgid "Change Animation Update Mode" msgstr "שינוי מצב עדכון הנפשה" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Interpolation Mode" -msgstr "החלפת ערך מילון" +msgstr "שינוי מצב אינטרפולציה בהנפשה" #: editor/animation_track_editor.cpp msgid "Change Animation Loop Mode" @@ -554,9 +554,8 @@ msgid "Edit" msgstr "עריכה" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation properties." -msgstr "שקופיות ההנפשה" +msgstr "מאפייני ההנפשה." #: editor/animation_track_editor.cpp #, fuzzy @@ -712,12 +711,11 @@ msgstr "%d הוחלף." #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d match." -msgstr "d% התאמות." +msgstr "%d התאמות." #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d matches." -msgstr "אין תוצאות" +msgstr "%d התאמות." #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" @@ -831,9 +829,8 @@ msgid "Extra Call Arguments:" msgstr "" #: editor/connections_dialog.cpp -#, fuzzy msgid "Receiver Method:" -msgstr "מאפייני פריט." +msgstr "שיטת המקלט:" #: editor/connections_dialog.cpp msgid "Advanced" @@ -933,9 +930,8 @@ msgid "Disconnect All" msgstr "ניתוק" #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit..." -msgstr "עריכה" +msgstr "עריכה..." #: editor/connections_dialog.cpp #, fuzzy @@ -1395,9 +1391,8 @@ msgid "Add Bus" msgstr "הוספת אפיק" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add a new Audio Bus to this layout." -msgstr "שמירת פריסת אפיקי השמע בתור…" +msgstr "הוסף אפיק שמע חדש לפריסה זו." #: editor/editor_audio_buses.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp @@ -1603,9 +1598,8 @@ 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 -#, fuzzy msgid "Custom debug template not found." -msgstr "קובץ התבנית לא נמצא:" +msgstr "תבנית ניפוי שגיאות מותאמת אישית לא נמצאה." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -1718,9 +1712,8 @@ msgid "" msgstr "" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Error saving profile to path: '%s'." -msgstr "שגיאה בשמירה" +msgstr "שגיאה בשמירת פרופיל לנתיב 's%'." #: editor/editor_feature_profile.cpp msgid "Unset" @@ -1899,14 +1892,12 @@ 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 #, fuzzy @@ -1914,9 +1905,8 @@ 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 @@ -1924,19 +1914,16 @@ 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 -#, fuzzy msgid "View items as a grid of thumbnails." -msgstr "צפייה בפריטים כרשת של תמונות ממוזערות" +msgstr "הצג פריטים כרשת של תמונות ממוזערות." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp -#, fuzzy msgid "View items as a list." -msgstr "הצגת פריטים כרשימה" +msgstr "הצג פריטים כרשימה." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" @@ -2759,9 +2746,8 @@ msgid "Project" msgstr "מיזם" #: editor/editor_node.cpp -#, fuzzy msgid "Project Settings..." -msgstr "הגדרות מיזם" +msgstr "הגדרות מיזם..." #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -2777,27 +2763,24 @@ msgid "Shut Down Version Control" msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Export..." -msgstr "ייצוא" +msgstr "ייצוא..." #: editor/editor_node.cpp msgid "Install Android Build Template..." msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Open Project Data Folder" -msgstr "לפתוח את מנהל המיזמים?" +msgstr "פתיחת תיקיית נתוני המיזם" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" msgstr "כלים" #: editor/editor_node.cpp -#, fuzzy msgid "Orphan Resource Explorer..." -msgstr "דפדפן משאבים יתומים" +msgstr "סייר משאבים יתומים ..." #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2883,9 +2866,8 @@ msgid "Editor" msgstr "עורך" #: editor/editor_node.cpp -#, fuzzy msgid "Editor Settings..." -msgstr "הגדרות עורך" +msgstr "הגדרות העורך..." #: editor/editor_node.cpp msgid "Editor Layout" @@ -2911,9 +2893,8 @@ msgid "Toggle System Console" msgstr "החלפת מצב" #: editor/editor_node.cpp -#, fuzzy msgid "Open Editor Data/Settings Folder" -msgstr "הגדרות עורך" +msgstr "פתח תיקיית נתונים/הגדרות של העורך" #: editor/editor_node.cpp msgid "Open Editor Data Folder" @@ -3527,9 +3508,8 @@ msgid "" msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting URL:" -msgstr "שגיאה בבקשת כתובת: " +msgstr "שגיאה בבקשת כתובת:" #: editor/export_template_manager.cpp msgid "Connecting to Mirror..." @@ -3858,14 +3838,12 @@ msgid "Cancel" msgstr "" #: editor/find_in_files.cpp -#, fuzzy msgid "Find: " -msgstr "איתור" +msgstr "איתור " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace: " -msgstr "להחליף" +msgstr "להחליף " #: editor/find_in_files.cpp #, fuzzy @@ -4812,9 +4790,8 @@ msgid "Set the end animation. This is useful for sub-transitions." msgstr "" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition: " -msgstr "מעברון" +msgstr "מעברון: " #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy @@ -9679,9 +9656,8 @@ msgid "Make Patch" msgstr "" #: editor/project_export.cpp -#, fuzzy msgid "Pack File" -msgstr " קבצים" +msgstr "קובץ ארכיון" #: editor/project_export.cpp msgid "Features" @@ -9734,9 +9710,8 @@ msgid "Export Project" msgstr "ייצוא מיזם" #: editor/project_export.cpp -#, fuzzy msgid "Export mode?" -msgstr "ייצוא מיזם" +msgstr "מצב הייצוא?" #: editor/project_export.cpp #, fuzzy @@ -9744,9 +9719,8 @@ msgid "Export All" msgstr "ייצוא" #: editor/project_export.cpp editor/project_manager.cpp -#, fuzzy msgid "ZIP File" -msgstr " קבצים" +msgstr "קובץ ZIP" #: editor/project_export.cpp msgid "Godot Game Pack" @@ -10488,9 +10462,8 @@ msgid "Node type" msgstr "איתור סוג מפרק" #: editor/rename_dialog.cpp -#, fuzzy msgid "Current scene name" -msgstr "הסצנה הנוכחית לא נשמרה. לפתוח בכל זאת?" +msgstr "שם סצנה נוכחית" #: editor/rename_dialog.cpp #, fuzzy @@ -10686,7 +10659,7 @@ msgstr "מחיקת שורה" #: editor/scene_tree_dock.cpp #, fuzzy msgid "Delete %d nodes?" -msgstr "מחיקת שורה" +msgstr "מחק %d מפרקים?" #: editor/scene_tree_dock.cpp msgid "Delete the root node \"%s\"?" @@ -10697,9 +10670,8 @@ msgid "Delete node \"%s\" and its children?" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete node \"%s\"?" -msgstr "מחיקת שורה" +msgstr "מחק מפרק \"%s\"?" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." @@ -12507,7 +12479,7 @@ msgstr "ARVROrigin דורש מפרק צאצא מסוג ARVRCamera" #: scene/3d/baked_lightmap.cpp msgid "%d%%" -msgstr "" +msgstr "%d%%" #: scene/3d/baked_lightmap.cpp msgid "(Time Left: %d:%02d s)" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 5661ed02cd..c6828cc7d3 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -5,17 +5,18 @@ # Árpád Horváth <horvatha4@googlemail.com>, 2018. # Nagy Lajos <neutron9707@gmail.com>, 2017. # Sandor Domokos <sandor.domokos@gmail.com>, 2017-2018. -# Varga Dániel <danikah.danikah@gmail.com>, 2016-2018. -# Gabor Csordas <gaborcsordas@yahoo.com>, 2018, 2019. +# Varga Dániel <danikah.danikah@gmail.com>, 2016-2018, 2020. +# Gabor Csordas <gaborcsordas@yahoo.com>, 2018, 2019, 2020. # Tusa Gamer <tusagamer@mailinator.com>, 2018. # Máté Lugosi <mate.lugosi@gmail.com>, 2019. # sztrovacsek <magadeve@gmail.com>, 2019. +# Ács Zoltán <acszoltan111@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-01-30 03:56+0000\n" -"Last-Translator: Deleted User <noreply+18797@weblate.org>\n" +"PO-Revision-Date: 2020-08-11 14:04+0000\n" +"Last-Translator: Ács Zoltán <acszoltan111@gmail.com>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/godot-engine/" "godot/hu/>\n" "Language: hu\n" @@ -23,7 +24,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.11-dev\n" +"X-Generator: Weblate 4.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -44,7 +45,7 @@ msgstr "Nincs elég bájt a bájtok dekódolására, vagy hibás formátum." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "Érvénytelen bemenet %i (nem átadott) a kifejezésben." +msgstr "Érvénytelen bemenet %i (nem átadott) a kifejezésben" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -52,7 +53,7 @@ msgstr "self nem használható, mert a példány null (nincs átadva)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." -msgstr "Érvénytelen operandus a %s, %s és %s operátorokhoz." +msgstr "Érvénytelen operandusok az %s, %s és %s operátorhoz." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" @@ -102,7 +103,7 @@ msgstr "EiB" #: editor/animation_bezier_editor.cpp msgid "Free" -msgstr "Ingyenes" +msgstr "Szabad" #: editor/animation_bezier_editor.cpp msgid "Balanced" @@ -134,11 +135,11 @@ msgstr "Kiválasztott kulcsok törlése" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" -msgstr "Bezier pont hozzáadása" +msgstr "Bézier pont hozzáadása" #: editor/animation_bezier_editor.cpp msgid "Move Bezier Points" -msgstr "Bezier pont Mozgatása" +msgstr "Bézier pont mozgatása" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" @@ -214,7 +215,7 @@ msgstr "UV Térkép Transzformálása" #: editor/animation_track_editor.cpp msgid "Call Method Track" -msgstr "" +msgstr "Hívás módszer követése" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" @@ -222,7 +223,7 @@ msgstr "Bezier Görbe Nyomvonal" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" -msgstr "" +msgstr "Hang lejátszás követése" #: editor/animation_track_editor.cpp #, fuzzy @@ -265,9 +266,8 @@ msgid "Change Track Path" msgstr "Tömb Értékének Megváltoztatása" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Toggle this track on/off." -msgstr "Zavarmentes mód váltása." +msgstr "A sáv ki/be kapcsolása." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" @@ -287,9 +287,8 @@ msgid "Remove this track." msgstr "Kiválasztott nyomvonal eltávolítása." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s): " -msgstr "Áttűnési Idő (mp):" +msgstr "Idő (mp):" #: editor/animation_track_editor.cpp #, fuzzy @@ -618,7 +617,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Use Bezier Curves" -msgstr "" +msgstr "Bézier görbék használata" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -710,11 +709,11 @@ msgstr "Tömb Értékének Megváltoztatása" #: editor/code_editor.cpp msgid "Go to Line" -msgstr "Sorra Ugrás" +msgstr "Ugrás Sorra" #: editor/code_editor.cpp msgid "Line Number:" -msgstr "Sor Száma:" +msgstr "Sorszám:" #: editor/code_editor.cpp #, fuzzy @@ -736,7 +735,7 @@ msgstr "Pontos Egyezés" #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Whole Words" -msgstr "Teljes Szavak" +msgstr "Egész Szavak" #: editor/code_editor.cpp editor/rename_dialog.cpp msgid "Replace" @@ -826,7 +825,7 @@ msgstr "A Node nem tartalmaz geometriát." #: 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 "Hozzáad" +msgstr "Hozzáadás" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/editor_feature_profile.cpp editor/groups_editor.cpp @@ -837,7 +836,7 @@ msgstr "Hozzáad" #: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp #: editor/project_settings_editor.cpp msgid "Remove" -msgstr "Eltávolít" +msgstr "Eltávolítás" #: editor/connections_dialog.cpp msgid "Add Extra Call Argument:" @@ -922,7 +921,7 @@ msgstr "Kapcsolás..." #: editor/connections_dialog.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Disconnect" -msgstr "Szétkapcsol" +msgstr "Leválasztás" #: editor/connections_dialog.cpp #, fuzzy @@ -980,7 +979,7 @@ msgstr "Kedvencek:" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp msgid "Recent:" -msgstr "Legutóbbi:" +msgstr "Legutolsó:" #: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp #: editor/property_selector.cpp editor/quick_open.cpp @@ -1066,7 +1065,7 @@ msgstr "Csere Forrás Keresése:" #: modules/visual_script/visual_script_property_selector.cpp #: scene/gui/file_dialog.cpp msgid "Open" -msgstr "Megnyit" +msgstr "Megnyitás" #: editor/dependency_editor.cpp msgid "Owners Of:" @@ -2266,7 +2265,7 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: scene/gui/dialogs.cpp msgid "OK" -msgstr "" +msgstr "OK" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Error saving resource!" @@ -4315,16 +4314,14 @@ msgid "Create points." msgstr "Pontok Törlése" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "" "Edit points.\n" "LMB: Move Point\n" "RMB: Erase Point" msgstr "" -"Meglévő sokszög módosítása:\n" -"Bal Egérgomb: Pont Mozgatása.\n" -"Ctrl + Bal Egérgomb: Szakasz Felosztása.\n" -"Jobb Egérgomb: Pont Eltörlése." +"Pontok szerkesztése\n" +"Bal Egérgomb: Pont mozgatása\n" +"Jobb Egérgomb: Pont törlése" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp @@ -5841,7 +5838,7 @@ msgstr "Nézet Megjelenítése" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Group And Lock Icons" -msgstr "" +msgstr "Csoport Megjelenítése és ikonok zárolása" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -8362,7 +8359,7 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp msgid "Icon" -msgstr "" +msgstr "Ikon" #: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp msgid "Style" @@ -8370,7 +8367,7 @@ msgstr "Stílus" #: editor/plugins/theme_editor_plugin.cpp msgid "Font" -msgstr "" +msgstr "Betűtípus" #: editor/plugins/theme_editor_plugin.cpp msgid "Color" @@ -8392,9 +8389,8 @@ msgstr "Érvénytelen név." #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Cut Selection" -msgstr "Kijelölés Középre" +msgstr "Kijelölés kivágása" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint TileMap" @@ -8402,7 +8398,7 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Line Draw" -msgstr "" +msgstr "Vonal rajzolás" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rectangle Paint" @@ -8491,7 +8487,7 @@ msgstr "Jelenlegi tétel eltávolítása" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from Scene" -msgstr "" +msgstr "Létrehozás jelenetből" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from Scene" @@ -10048,7 +10044,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Rename Project" -msgstr "" +msgstr "Projekt átnevezése" #: editor/project_manager.cpp msgid "Import Existing Project" @@ -10076,7 +10072,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Project Name:" -msgstr "" +msgstr "Projekt neve:" #: editor/project_manager.cpp msgid "Project Path:" @@ -10120,7 +10116,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Unnamed Project" -msgstr "" +msgstr "Névtelen projekt" #: editor/project_manager.cpp #, fuzzy @@ -10224,7 +10220,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Project Manager" -msgstr "" +msgstr "Projektkezelő" #: editor/project_manager.cpp #, fuzzy @@ -10237,7 +10233,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Scan" -msgstr "" +msgstr "Keresés" #: editor/project_manager.cpp msgid "Select a Folder to Scan" diff --git a/editor/translations/it.po b/editor/translations/it.po index 93ca2a8f29..b2dac5ae0e 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -27,8 +27,8 @@ # Hairic95 <hairic95@gmail.com>, 2019. # Christian Biffi <creixx@virgilio.it>, 2019. # Giuseppe Guerra <me@nyodev.xyz>, 2019. -# RHC <rhc.throwaway@gmail.com>, 2019. -# Antonio Giungato <antonio.giungato@gmail.com>, 2019. +# RHC <rhc.throwaway@gmail.com>, 2019, 2020. +# Antonio Giungato <antonio.giungato@gmail.com>, 2019, 2020. # Marco Galli <mrcgll98@gmail.com>, 2019, 2020. # MassiminoilTrace <omino.gis@gmail.com>, 2019, 2020. # MARCO BANFI <mbanfi@gmail.com>, 2019. @@ -58,8 +58,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-26 15:41+0000\n" -"Last-Translator: Mirko <miknsop@gmail.com>\n" +"PO-Revision-Date: 2020-08-05 16:58+0000\n" +"Last-Translator: Lorenzo Cerqua <lorenzocerqua@tutanota.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -72,23 +72,23 @@ 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 "Argomento non valido per convert(), usare le costanti TYPE_*." +msgstr "Argomento tipo non valido per convert(), usare le costanti TYPE_*." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "Prevista una stringa di lunghezza 1 (singolo carattere)." +msgstr "Prevista una stringa di lunghezza 1 (un singolo carattere)." #: 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 "" -"Non vi sono abbastanza byte per riuscire a decodificarli, oppure il formato " +"Non ci sono abbastanza byte per riuscire a decodificarli, oppure il formato " "non è valido." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "Input non valido %i (non passato) nell'espressione" +msgstr "Input non valido %i (assente) nell'espressione" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -100,7 +100,7 @@ msgstr "Operandi non validi per l'operatore %s, %s e %s." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "Indice del tipo %s non valido per il tipo base %s" +msgstr "Indice di tipo %s non valido per il tipo base %s" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" @@ -108,7 +108,7 @@ msgstr "Nome indice '%s' non valido per il tipo base %s" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" -msgstr "Argomenti non validi per il costrutto '%s'" +msgstr "Argomenti non validi per costruire '%s'" #: core/math/expression.cpp msgid "On call to '%s':" @@ -241,7 +241,7 @@ msgstr "Modifica ciclicità animazione" #: editor/animation_track_editor.cpp msgid "Property Track" -msgstr "Proprietà Traccia" +msgstr "Traccia proprietà" #: editor/animation_track_editor.cpp msgid "3D Transform Track" @@ -249,7 +249,7 @@ msgstr "Traccia trasformazione 3D" #: editor/animation_track_editor.cpp msgid "Call Method Track" -msgstr "Traccia di Chiamata di Metodi" +msgstr "Traccia chiamata metodo" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" @@ -265,7 +265,7 @@ msgstr "Traccia di riproduzione animazione" #: editor/animation_track_editor.cpp msgid "Animation length (frames)" -msgstr "Durata Animazione (frames)" +msgstr "Durata animazione (fotogrammi)" #: editor/animation_track_editor.cpp msgid "Animation length (seconds)" @@ -277,7 +277,7 @@ msgstr "Aggiungi Traccia" #: editor/animation_track_editor.cpp msgid "Animation Looping" -msgstr "Ciclicità Animazione" +msgstr "Ripeti Ciclicamente Animazione" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -290,7 +290,7 @@ msgstr "Clip Audio:" #: editor/animation_track_editor.cpp msgid "Anim Clips:" -msgstr "Clip Anim:" +msgstr "Clip Animazione:" #: editor/animation_track_editor.cpp msgid "Change Track Path" @@ -306,11 +306,11 @@ msgstr "Modalità di aggiornamento (Come viene impostata questa proprietà)" #: editor/animation_track_editor.cpp msgid "Interpolation Mode" -msgstr "Modalità di Interpolazione" +msgstr "Modalità Interpolazione" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" -msgstr "Modalità Loop Wrap (Interpola la fine con l'inizio del loop)" +msgstr "Modalità Ciclo ad Anello (Interpola la fine con l'inizio del ciclo)" #: editor/animation_track_editor.cpp msgid "Remove this track." @@ -1049,11 +1049,11 @@ msgstr "Dipendenze:" #: editor/dependency_editor.cpp msgid "Fix Broken" -msgstr "Riparare rotti" +msgstr "Ripara rotti" #: editor/dependency_editor.cpp msgid "Dependency Editor" -msgstr "Editor dipendenze" +msgstr "Editor Dipendenze" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" @@ -1157,7 +1157,7 @@ msgstr "Grazie dalla comunità di Godot!" #: editor/editor_about.cpp msgid "Godot Engine contributors" -msgstr "Contributori a Godot Engine" +msgstr "Contributori di Godot engine" #: editor/editor_about.cpp msgid "Project Founders" @@ -1391,7 +1391,7 @@ msgstr "Salva disposizione del bus audio come..." #: editor/editor_audio_buses.cpp msgid "Location for New Layout..." -msgstr "Posizione della nuova disposizione…" +msgstr "Posizione per la nuova disposizione..." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" @@ -1441,7 +1441,7 @@ msgstr "Salva questa disposizione bus in un file." #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" -msgstr "Carica predefiniti" +msgstr "Carica Predefiniti" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." @@ -1887,7 +1887,7 @@ msgstr "Attiva/disattiva preferito" #: editor/editor_file_dialog.cpp msgid "Toggle Mode" -msgstr "Modalità di Attivazione/Disattivazione" +msgstr "Commuta Modalità" #: editor/editor_file_dialog.cpp msgid "Focus Path" @@ -2535,12 +2535,14 @@ msgstr "" #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." msgstr "" -"Impossibile trovare il campo per lo script del componente aggiuntivo in: " +"Impossibile trovare il campo dello script per il componente aggiuntivo in: " "'res://addons/%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." -msgstr "Impossibile caricare uno script aggiuntivo dal percorso: '%s'." +msgstr "" +"Impossibile caricare lo script di un componente aggiuntivo dal percorso: " +"'%s'." #: editor/editor_node.cpp msgid "" @@ -2560,8 +2562,8 @@ msgstr "" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" -"Impossibile caricare uno script aggiuntivo dal percorso: Lo script '%s' non " -"è in tool mode." +"Impossibile caricare lo script di un componente aggiuntivo dal percorso: " +"'%s' Lo script non è in modalità strumento." #: editor/editor_node.cpp msgid "" @@ -2630,7 +2632,7 @@ msgstr "Elimina disposizione" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "Default" +msgstr "Predefinito" #: editor/editor_node.cpp editor/editor_properties.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp @@ -2679,7 +2681,7 @@ msgstr "%d altri file" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "Posizione dock" +msgstr "Posizione Dock" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -2798,7 +2800,7 @@ msgstr "Esporta..." #: editor/editor_node.cpp msgid "Install Android Build Template..." -msgstr "Installa il Build Template di Android…" +msgstr "Installa il Modello di Costruzione di Android…" #: editor/editor_node.cpp msgid "Open Project Data Folder" @@ -2945,7 +2947,7 @@ msgstr "Apri cartella dati/impostazioni editor" #: editor/editor_node.cpp msgid "Open Editor Data Folder" -msgstr "Apri la cartella dati dell'editor" +msgstr "Apri la Cartella dei Dati dell'Editor" #: editor/editor_node.cpp msgid "Open Editor Settings Folder" @@ -2957,7 +2959,7 @@ msgstr "Gestisci le funzionalità dell'editor…" #: editor/editor_node.cpp msgid "Manage Export Templates..." -msgstr "Gestisci template d'esportazione…" +msgstr "Gestisci Modello d'Esportazione…" #: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp msgid "Help" @@ -2983,11 +2985,11 @@ msgstr "Domande e risposte" #: editor/editor_node.cpp msgid "Report a Bug" -msgstr "Riporta un Bug" +msgstr "Segnala un problema" #: editor/editor_node.cpp msgid "Send Docs Feedback" -msgstr "Invia opinione sui documenti" +msgstr "Valuta documentazione" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3086,7 +3088,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Manage Templates" -msgstr "Gestisci i template d'esportazione" +msgstr "Gestisci i modelli d'esportazione" #: editor/editor_node.cpp msgid "" @@ -3114,7 +3116,7 @@ msgid "" "Remove the \"res://android/build\" directory manually before attempting this " "operation again." msgstr "" -"Il template della build Android è già installato in questo progetto e non " +"Il modello della build Android è già installato in questo progetto e non " "sarà sovrascritto.\n" "Rimuovi la cartella \"res://android/build\" manualmente prima di ritentare " "questa operazione." @@ -3242,7 +3244,7 @@ msgstr "Frame %" #: editor/editor_profiler.cpp msgid "Physics Frame %" -msgstr "Frame della Fisica %" +msgstr "Fotogramma della Fisica %" #: editor/editor_profiler.cpp msgid "Inclusive" @@ -3520,8 +3522,8 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" -"Non sono stati trovati link di download per questa versione. Il download " -"diretto è disponibile solamente per rilasci ufficiali." +"Nessun collegamento di download trovato per questa versione. I download " +"diretti sono disponibili solo per i rilasci ufficiali." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3615,7 +3617,7 @@ msgstr "Errore di Connessione" #: editor/export_template_manager.cpp msgid "SSL Handshake Error" -msgstr "Errore nell'Handshake SSL" +msgstr "Errore Handshake SSL" #: editor/export_template_manager.cpp msgid "Uncompressing Android Build Sources" @@ -3643,7 +3645,7 @@ msgstr "Seleziona file template" #: editor/export_template_manager.cpp msgid "Godot Export Templates" -msgstr "Template di Export" +msgstr "Modello di Esportazione Godot" #: editor/export_template_manager.cpp msgid "Export Template Manager" @@ -3651,7 +3653,7 @@ msgstr "Gestore Template Esportazione" #: editor/export_template_manager.cpp msgid "Download Templates" -msgstr "Scarica Template" +msgstr "Scarica Modelli" #: editor/export_template_manager.cpp msgid "Select mirror from list: (Shift+Click: Open in Browser)" @@ -4038,11 +4040,11 @@ msgstr "%d File" #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "Imposta come Default per '%s'" +msgstr "Imposta come Predefinito per '%s'" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "Elimina Default per '%s'" +msgstr "Elimina Predefinito per '%s'" #: editor/import_dock.cpp msgid "Import As:" @@ -4629,7 +4631,7 @@ msgstr "Opzioni dell'onion skinning" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Directions" -msgstr "Indicazioni" +msgstr "Direzioni" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Past" @@ -5725,7 +5727,7 @@ msgstr "Errore istanziamento scena da %s" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Default Type" -msgstr "Cambia tipo di default" +msgstr "Cambia Tipo Predefinito" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -8669,7 +8671,7 @@ msgstr "Imposta Nome Uniforme" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Input Default Port" -msgstr "Imposta Porta Input di Default" +msgstr "Imposta Porta Input Predefinita" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add Node to Visual Shader" @@ -9011,7 +9013,7 @@ msgstr "Calcola la parte frazionaria dell'argomento." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse of the square root of the parameter." -msgstr "Ritorna l'inversa della radice quadrata del parametro." +msgstr "Restituisce l'inversa della radice quadrata del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Natural logarithm." @@ -9073,15 +9075,15 @@ msgstr "Estrae il segno del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the sine of the parameter." -msgstr "Ritorna il seno del parametro." +msgstr "Restituisce il seno del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic sine of the parameter." -msgstr "Ritorna il seno iperbolico del parametro." +msgstr "Restituisce il seno iperbolico del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." -msgstr "Ritorna la radice quadrata del parametro." +msgstr "Restituisce la radice quadrata del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9093,8 +9095,8 @@ msgid "" msgstr "" "SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n" "\n" -"Ritorna 0.0 se 'x' è più piccolo di 'edge0', o 1.0 se 'x' è più grande di " -"'edge1'. Altrimenti, il valore di ritorno è interpolato tra 0.0 ed 1.0 " +"Restituisce 0.0 se 'x' è più piccolo di 'edge0', o 1.0 se 'x' è più grande " +"di 'edge1'. Altrimenti, il valore di ritorno è interpolato tra 0.0 ed 1.0 " "usando i polinomi di Hermite." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9105,15 +9107,15 @@ msgid "" msgstr "" "Step function( scalar(edge), scalar(x) ).\n" "\n" -"Ritorna 0.0 se 'x' è più piccolo di 'edge', altrimenti 1.0." +"Restituisce 0.0 se 'x' è più piccolo di 'edge', altrimenti 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." -msgstr "Ritorna la tangente del parametro." +msgstr "Restituisce la tangente del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic tangent of the parameter." -msgstr "Ritorna la tangente iperbolica del parametro." +msgstr "Restituisce la tangente iperbolica del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the truncated value of the parameter." @@ -9133,7 +9135,7 @@ msgstr "Moltiplica lo scalare per scalare." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two scalars." -msgstr "Ritorna il resto dei due scalari." +msgstr "Restituisce il resto dei due scalari." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts scalar from scalar." @@ -9243,11 +9245,11 @@ msgstr "Scompone il vettore a tre scalari." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the cross product of two vectors." -msgstr "Calcola il prodotto incrociato di due vettori." +msgstr "Calcola il prodotto vettoriale di due vettori." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the distance between two points." -msgstr "Ritorna la distanza tra due punti." +msgstr "Restituisce la distanza tra due punti." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the dot product of two vectors." @@ -9260,7 +9262,7 @@ 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 "" -"Ritorna un vettore che punta nella stessa direzione di quello di " +"Restituisce un vettore che punta nella stessa direzione di quello di " "riferimento. La funzione ha tre vettori parametro: N, il vettore da " "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. " @@ -9295,12 +9297,12 @@ msgid "" "Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" -"Ritorna un vettore che punta nella direzione della riflessione ( a : vettore " -"incidente, b : vettore normale )." +"Restituisce un vettore che punta nella direzione della riflessione ( a : " +"vettore incidente, b : vettore normale )." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the vector that points in the direction of refraction." -msgstr "Ritorna un vettore che punta nella direzione della refrazione." +msgstr "Restituisce un vettore che punta nella direzione della refrazione." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9312,7 +9314,7 @@ msgid "" msgstr "" "SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n" "\n" -"Ritorna 0.0 se 'x' è minore di 'edge0', ed 1.0 se 'x' è più grande di " +"Restituisce 0.0 se 'x' è minore di 'edge0', ed 1.0 se 'x' è più grande di " "'edge1'. Altrimenti, il valore di ritorno è interpolato tra 0.0 ed 1.0 " "usando i polinomiali di Hermite." @@ -9326,7 +9328,7 @@ msgid "" msgstr "" "SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n" "\n" -"Ritorna 0.0 se 'x' è minore di 'edge0', ed 1.0 se 'x' è più grande di " +"Restituisce 0.0 se 'x' è minore di 'edge0', ed 1.0 se 'x' è più grande di " "'edge1'. Altrimenti, il valore di ritorno è interpolato tra 0.0 ed 1.0 " "usando i polinomiali di Hermite." @@ -9338,7 +9340,7 @@ msgid "" msgstr "" "Step function( vector(edge), vector(x) ).\n" "\n" -"Ritorna 0.0 se 'x' è minore di 'edge', altrimenti 1.0." +"Restituisce 0.0 se 'x' è minore di 'edge', altrimenti 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9348,7 +9350,7 @@ msgid "" msgstr "" "Step function( scalar(edge), vector(x) ).\n" "\n" -"Ritorna 0.0 se 'x' è minore di 'edge', altrimenti 1.0." +"Restituisce 0.0 se 'x' è minore di 'edge', altrimenti 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds vector to vector." @@ -9356,7 +9358,7 @@ msgstr "Aggiunge un vettore al vettore." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides vector by vector." -msgstr "Divide vettore per vettore." +msgstr "Divide due vettori." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by vector." @@ -9364,7 +9366,7 @@ msgstr "Moltiplica vettore per vettore." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two vectors." -msgstr "Ritorna il resto dei due vettori." +msgstr "Restituisce il resto dei due vettori." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts vector from vector." @@ -9394,7 +9396,7 @@ msgid "" "Returns falloff based on the dot product of surface normal and view " "direction of camera (pass associated inputs to it)." msgstr "" -"Ritorna il decadimento in base al prodotto scalare della normale della " +"Restituisce il decadimento in base al prodotto scalare della normale della " "superfice e direzione della telecamera (passa gli input associati ad essa)." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10630,9 +10632,8 @@ msgid "Make node as Root" msgstr "Rendi il nodo come Radice" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Elimina il nodo \"%s\" e tutti i suoi figli?" +msgstr "Eliminare %d nodi ed eventuali figli?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -10675,9 +10676,8 @@ msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" -"Abilitando \"Carica Come Placeholder\" disabiliterà \"Figlio Modificabile\" " -"e causerà tutte le proprietà del nodo di essere riportare ai loro valori " -"default." +"Abilitare \"Carica Come Placeholder\" disabiliterà \"Figlio Modificabile\" e " +"riporterà tutte le proprietà del nodo ai loro valori predefiniti." #: editor/scene_tree_dock.cpp msgid "Make Local" @@ -11111,7 +11111,7 @@ msgstr "Processo Figlio Connesso." #: editor/script_editor_debugger.cpp msgid "Copy Error" -msgstr "Copia messaggio di errore" +msgstr "Copia Errore" #: editor/script_editor_debugger.cpp msgid "Video RAM" @@ -11644,7 +11644,7 @@ msgstr "Cambia nome Argomento" #: modules/visual_script/visual_script_editor.cpp msgid "Set Variable Default Value" -msgstr "Imposta Valore di Default della Variabile" +msgstr "Imposta Valore Predefinito della Variabile" #: modules/visual_script/visual_script_editor.cpp msgid "Set Variable Type" @@ -12109,18 +12109,18 @@ msgstr "" "Mobile VR\"." #: platform/android/export/export.cpp -#, fuzzy msgid "" "\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"." msgstr "" -"\"Hand Tracking\" è valido solo quando \"Xr Mode\" è \"Oculus Mobile VR\"." +"\"Hand Tracking\" è valido solo quando \"Xr Mode\" è impostato su \"Oculus " +"Mobile VR\"." #: platform/android/export/export.cpp -#, fuzzy msgid "" "\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"." msgstr "" -"\"Focus Awareness\" è valida solo quando \"Xr Mode\" è \"Oculus Mobile VR\"." +"\"Focus Awareness\" è valido solo quando \"Xr Mode\" è impostato su \"Oculus " +"Mobile VR\"." #: platform/android/export/export.cpp msgid "" @@ -12191,8 +12191,9 @@ msgid "Run in Browser" msgstr "Esegui nel Browser" #: platform/javascript/export/export.cpp +#, fuzzy msgid "Run exported HTML in the system's default browser." -msgstr "Esegui HTML esportato all'interno del browser di sistema di default." +msgstr "Esegui HTML esportato all'interno del browser di sistema predefinito." #: platform/javascript/export/export.cpp msgid "Could not write file:" @@ -12215,6 +12216,7 @@ msgid "Could not read boot splash image file:" msgstr "Impossibile leggere il file immagine di avvio splash:" #: platform/javascript/export/export.cpp +#, fuzzy msgid "Using default boot splash image." msgstr "Utilizzando l'immagine di splash di avvio predefinita." @@ -12350,6 +12352,9 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"Le forme basate sui poligoni non sono state fatte per essere usate nè " +"modificate direttamente tramite il nodo CollisionShape2D. Per piacere usa " +"invece il nodo CollisionPolygon2D." #: scene/2d/cpu_particles_2d.cpp msgid "" @@ -12853,9 +12858,9 @@ msgid "" "functions. Making them visible for editing is fine, but they will hide upon " "running." msgstr "" -"I popup saranno nascosti per default affinché non chiami la funzione " -"popup(), oppure una delle funzioni popup*(). Farli diventare visibili per " -"modificarli va bene, ma scompariranno all'esecuzione." +"I popup saranno nascosti di predefinita finchè non chiami popup() o una " +"delle qualsiasi funzioni popup*(). Farli diventare visibili per modificarli " +"va bene, ma scompariranno all'esecuzione." #: scene/gui/range.cpp msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." diff --git a/editor/translations/ja.po b/editor/translations/ja.po index d3b2771793..e0a1d4d909 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -36,7 +36,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-28 09:51+0000\n" +"PO-Revision-Date: 2020-08-11 14:04+0000\n" "Last-Translator: Wataru Onuki <bettawat@yahoo.co.jp>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" @@ -533,8 +533,7 @@ msgstr "警告:インポートしたアニメーションを編集していま #: editor/animation_track_editor.cpp msgid "Select an AnimationPlayer node to create and edit animations." msgstr "" -"アニメーションを作って編集するために AnimationPlayer ノードへのパスを選択して" -"下さい。" +"アニメーションを作って編集するには、 AnimationPlayer ノードを選択して下さい。" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -899,7 +898,7 @@ msgstr "'%s' を '%s' から切断" #: editor/connections_dialog.cpp msgid "Disconnect all from signal: '%s'" -msgstr "シグナル '%s' から全てを切断" +msgstr "シグナル '%s' からすべてを切断" #: editor/connections_dialog.cpp msgid "Connect..." @@ -920,7 +919,7 @@ 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" @@ -928,7 +927,7 @@ msgstr "シグナル" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from this signal?" -msgstr "このシグナルから全ての接続を除去してもよろしいですか?" +msgstr "このシグナルからすべての接続を除去してもよろしいですか?" #: editor/connections_dialog.cpp msgid "Disconnect All" @@ -1762,7 +1761,7 @@ msgstr "Godot機能プロファイル" #: editor/editor_feature_profile.cpp msgid "Import Profile(s)" -msgstr "プロファイルのインポート" +msgstr "プロファイルをインポート" #: editor/editor_feature_profile.cpp msgid "Export Profile" @@ -5363,7 +5362,7 @@ msgstr "IKチェーンをクリア" msgid "" "Warning: Children of a container get their position and size determined only " "by their parent." -msgstr "警告:コンテナの子の位置とサイズは、親によってのみ決定されます。" +msgstr "注意:コンテナの子の位置とサイズは、親によってのみ決定されます。" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp @@ -7016,15 +7015,15 @@ msgstr "コメントの切り替え" #: editor/plugins/script_text_editor.cpp msgid "Fold/Unfold Line" -msgstr "行を折りたたむ/展開する" +msgstr "行を折りたたむ / 展開する" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "全ての行を折りたたむ" +msgstr "すべての行を折りたたむ" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "全ての行を展開する" +msgstr "すべての行を展開する" #: editor/plugins/script_text_editor.cpp msgid "Clone Down" @@ -7321,11 +7320,11 @@ msgstr "シェーディングなしで表示" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Environment" -msgstr "環境表示" +msgstr "環境を表示" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Gizmos" -msgstr "ギズモ(Gizmo)を表示" +msgstr "ギズモを表示" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Information" @@ -7530,7 +7529,7 @@ msgstr "ギズモ" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" -msgstr "原点の表示" +msgstr "ビューの原点" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Grid" @@ -8340,7 +8339,7 @@ msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Region" -msgstr "タイル領域の設定" +msgstr "タイル領域を設定" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create Tile" @@ -8549,7 +8548,7 @@ msgstr "Sampler" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" -msgstr "入力ポートの追加" +msgstr "入力ポートを追加" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add output port" @@ -8581,7 +8580,7 @@ msgstr "出力ポートの削除" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set expression" -msgstr "式の設定" +msgstr "式を設定" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Resize VisualShader node" @@ -9838,7 +9837,7 @@ msgid "" "Remove %d projects from the list?\n" "The project folders' contents won't be modified." msgstr "" -"%d プロジェクトを一覧から削除しますか?\n" +"%d プロジェクトを一覧から削除しますか?\n" "プロジェクトフォルダの内容は変更されません。" #: editor/project_manager.cpp @@ -9846,7 +9845,7 @@ msgid "" "Remove this project from the list?\n" "The project folder's contents won't be modified." msgstr "" -"このプロジェクトを一覧から削除しますか?\n" +"このプロジェクトを一覧から削除しますか?\n" "プロジェクトフォルダの内容は変更されません。" #: editor/project_manager.cpp @@ -9967,11 +9966,11 @@ msgstr "入力アクションイベントの名前を変更する" #: editor/project_settings_editor.cpp msgid "Change Action deadzone" -msgstr "アクションデッドゾーンの変更" +msgstr "アクション デッドゾーンを変更" #: editor/project_settings_editor.cpp msgid "Add Input Action Event" -msgstr "入力アクションイベントを追加" +msgstr "入力アクション イベントを追加" #: editor/project_settings_editor.cpp msgid "All Devices" @@ -10075,7 +10074,7 @@ msgstr "マウスホイールを下に。" #: editor/project_settings_editor.cpp msgid "Add Global Property" -msgstr "グローバルプロパティの追加" +msgstr "グローバルプロパティを追加" #: editor/project_settings_editor.cpp msgid "Select a setting item first!" @@ -10535,9 +10534,8 @@ msgid "Make node as Root" msgstr "ノードをルートにする" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "\"%s\" ノードとその子ノードを削除しますか?" +msgstr "%d ノードとその子ノードすべてを削除しますか?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -12235,6 +12233,8 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"ポリゴンベースのシェイプは、CollisionShape2Dノードで使用したり直接編集したり" +"するには適しません。代わりにCollisionPolygon2Dノードを使用してください。" #: scene/2d/cpu_particles_2d.cpp msgid "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index 23a9e4dded..9b19450d58 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -18,11 +18,12 @@ # Tilto_ <tilto0822@develable.xyz>, 2020. # Myeongjin Lee <aranet100@gmail.com>, 2020. # Doyun Kwon <caen4516@gmail.com>, 2020. +# Jun Hyung Shin <shmishmi79@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-06-29 15:26+0000\n" +"PO-Revision-Date: 2020-07-31 03:47+0000\n" "Last-Translator: Ch. <ccwpc@hanmail.net>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" @@ -7359,7 +7360,6 @@ msgid "XForm Dialog" msgstr "XForm 대화 상자" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "" "Click to toggle between visibility states.\n" "\n" @@ -10461,9 +10461,8 @@ msgid "Make node as Root" msgstr "노드를 루트로 만들기" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "노드 \"%s\"와(과) 자식을 삭제할까요?" +msgstr "%d 개의 노드와 모든 자식 노드를 삭제할까요?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -12141,6 +12140,8 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"폴리곤 기반 Shape는 CollisionShape2D에 추가하거나 거기서 편집하게끔 설계하지 " +"않았습니다. 대신 CollisionPolygon2D 노드를 사용하십시오." #: scene/2d/cpu_particles_2d.cpp msgid "" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 2a09acd7c5..d7ff515b05 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -45,8 +45,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-21 13:41+0000\n" -"Last-Translator: Filip Glura <mcmr.slendy@gmail.com>\n" +"PO-Revision-Date: 2020-07-31 03:47+0000\n" +"Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" "Language: pl\n" @@ -10560,9 +10560,8 @@ msgid "Make node as Root" msgstr "Zmień węzeł na Korzeń" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Usunąć węzeł \"%s\" oraz jego węzły potomne?" +msgstr "Usunąć %d węzłów i ich węzły potomne?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -12266,6 +12265,9 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"Kształty oparte na wielokątach nie są przystosowane, by ich używać lub " +"edytować bezpośrednio przez węzeł CollisionShape2D. Zamiast tego użyj węzła " +"CollisionPolygon2D." #: scene/2d/cpu_particles_2d.cpp msgid "" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index e2e19c99ce..6c035decd5 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -97,13 +97,14 @@ # Necco <necco@outlook.com>, 2020. # Marcelo Silveira Hayden <mshayden.1998@gmail.com>, 2020. # GUILHERME SOUZA REIS DE MELO LOPES <guilhermesrml@unipam.edu.br>, 2020. +# Gabriela Araújo <Gabirin@outlook.com.br>, 2020. +# Jairo Tuboi <tuboi.jairo@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2020-07-26 15:41+0000\n" -"Last-Translator: GUILHERME SOUZA REIS DE MELO LOPES <guilhermesrml@unipam." -"edu.br>\n" +"PO-Revision-Date: 2020-08-11 14:04+0000\n" +"Last-Translator: Jairo Tuboi <tuboi.jairo@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -242,7 +243,7 @@ msgstr "Alterar Transição da Animação" #: editor/animation_track_editor.cpp msgid "Anim Change Transform" -msgstr "Alterar Transformação da Anim" +msgstr "Alterar Transformação da Animação" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Value" @@ -250,7 +251,7 @@ msgstr "Alterar Valor de Quadro-Chave da Anim" #: editor/animation_track_editor.cpp msgid "Anim Change Call" -msgstr "Alterar Chamada da Anim" +msgstr "Alterar Chamada da Animação" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" @@ -1795,7 +1796,7 @@ msgstr "Novo" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/project_manager.cpp msgid "Import" -msgstr "Importar" +msgstr "Import" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" @@ -3869,7 +3870,7 @@ msgstr "Criar Script" #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp msgid "Find in Files" -msgstr "Localizar nos Arquivos" +msgstr "Localizar nos arquivos" #: editor/find_in_files.cpp msgid "Find:" @@ -4177,7 +4178,7 @@ msgstr "Alterações podem ser perdidas!" #: editor/multi_node_edit.cpp msgid "MultiNode Set" -msgstr "Múltiplos Nodes definidos" +msgstr "Conjunto de Multi-Nós" #: editor/node_dock.cpp msgid "Select a single node to edit its signals and groups." @@ -6817,7 +6818,7 @@ msgstr "Localizar próximo" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp msgid "Find Previous" -msgstr "Encontrar Anterior" +msgstr "Localizar anterior" #: editor/plugins/script_editor_plugin.cpp msgid "Filter scripts" @@ -7080,7 +7081,7 @@ msgstr "Recortar" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Select All" -msgstr "Selecionar Tudo" +msgstr "Selecionar tudo" #: editor/plugins/script_text_editor.cpp msgid "Delete Line" @@ -10627,9 +10628,8 @@ msgid "Make node as Root" msgstr "Tornar Raiz o Nó" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Deletar nó \"%s\" e seus filhos?" +msgstr "Deletar nó \"%d\" e seus filhos?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -12332,6 +12332,8 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"Formas baseadas em polígonos não foram feitas para serem diretamente " +"editadas no nó CollisionShape2D. Em vez disso use o nó CollisionPolygon2D." #: scene/2d/cpu_particles_2d.cpp msgid "" diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po index ba1f5b31d5..b9d6c82ff0 100644 --- a/editor/translations/pt_PT.po +++ b/editor/translations/pt_PT.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-06-26 06:11+0000\n" +"PO-Revision-Date: 2020-07-31 03:47+0000\n" "Last-Translator: João Lopes <linux-man@hotmail.com>\n" "Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_PT/>\n" @@ -10525,9 +10525,8 @@ msgid "Make node as Root" msgstr "Tornar Nó Raiz" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Apagar nó \"%s\" e filhos?" +msgstr "Apagar %d nós e filhos?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -12232,6 +12231,8 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"Formas baseadas em polígono não pretendem ser usadas ou editadas diretamente " +"através do nó CollisionShape2D. Em vez disso use o nó CollisionPolygon2D." #: scene/2d/cpu_particles_2d.cpp msgid "" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index ba5fbcf11a..29487392f8 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -3,7 +3,7 @@ # Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). # This file is distributed under the same license as the Godot source code. # Calin Sopterean <csopterean@gmail.com>, 2018. -# Filip <filipanton@tutanota.com>, 2018. +# Filip <filipanton@tutanota.com>, 2018, 2020. # Nitroretro <nitroretro@protonmail.com>, 2018. # TigerxWood <TigerxWood@gmail.com>, 2018. # Grigore Antoniuc <grisa181@gmail.com>, 2018. @@ -17,8 +17,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-19 01:27+0000\n" -"Last-Translator: f0roots <f0rootss@gmail.com>\n" +"PO-Revision-Date: 2020-08-11 14:04+0000\n" +"Last-Translator: Filip <filipanton@tutanota.com>\n" "Language-Team: Romanian <https://hosted.weblate.org/projects/godot-engine/" "godot/ro/>\n" "Language: ro\n" @@ -1720,7 +1720,7 @@ msgstr "Nou" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/project_manager.cpp msgid "Import" -msgstr "Importă" +msgstr "Importare" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" @@ -2142,23 +2142,23 @@ msgstr "Nod" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" -msgstr "" +msgstr "Intrare RPC" #: editor/editor_network_profiler.cpp msgid "Incoming RSET" -msgstr "" +msgstr "Intrare RSET" #: editor/editor_network_profiler.cpp msgid "Outgoing RPC" -msgstr "" +msgstr "Ieșire RPC" #: editor/editor_network_profiler.cpp msgid "Outgoing RSET" -msgstr "" +msgstr "Ieșire RSET" #: editor/editor_node.cpp editor/project_manager.cpp msgid "New Window" -msgstr "Fereastra Noua" +msgstr "Fereastră Nouă" #: editor/editor_node.cpp msgid "Imported resources can't be saved." @@ -2251,11 +2251,11 @@ msgstr "" #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" -msgstr "" +msgstr "Nu pot salva peste scena care este înca deschisă!" #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" -msgstr "Imposibil de încărcat MeshLibrary pentru unire!" +msgstr "Nu pot încarca MeshLibrary pentru combinare!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" @@ -2378,7 +2378,7 @@ msgstr "Resurse modificate %s salvate." #: editor/editor_node.cpp msgid "A root node is required to save the scene." -msgstr "" +msgstr "Un nod rădăcină este necesar pentru a salva scena." #: editor/editor_node.cpp msgid "Save Scene As..." @@ -2406,11 +2406,11 @@ msgstr "Exportă Librăria de Mesh-uri" #: editor/editor_node.cpp msgid "This operation can't be done without a root node." -msgstr "Această operațiune nu poate fi făcută fără un nod de bază." +msgstr "Această operațiune nu poate fi făcută fără un nod rădăcină." #: editor/editor_node.cpp msgid "Export Tile Set" -msgstr "Exportă Setul de Plăci" +msgstr "Exportă Tile Setul" #: editor/editor_node.cpp msgid "This operation can't be done without a selected node." @@ -2422,25 +2422,27 @@ msgstr "Scena curentă nu este salvată. Deschizi oricum?" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." -msgstr "Nu se poate reîncărca o scenă care nu a fost salvată niciodată." +msgstr "Nu pot reîncărca o scenă care nu a fost salvată niciodată." #: editor/editor_node.cpp msgid "Reload Saved Scene" -msgstr "Reîncărcare scenă salvată" +msgstr "Reîncarcă scenă salvată" #: editor/editor_node.cpp msgid "" "The current scene has unsaved changes.\n" "Reload the saved scene anyway? This action cannot be undone." msgstr "" +"Scena actuală are modificări nesalvate.\n" +"Reîncărcați scena salvată? Această acțiune nu poate fi anulată." #: editor/editor_node.cpp msgid "Quick Run Scene..." -msgstr "Execută Rapid Scena..." +msgstr "Rulează Rapid Scena..." #: editor/editor_node.cpp msgid "Quit" -msgstr "Închidere" +msgstr "Închide" #: editor/editor_node.cpp msgid "Exit the editor?" @@ -2448,7 +2450,7 @@ msgstr "Ieși din editor?" #: editor/editor_node.cpp msgid "Open Project Manager?" -msgstr "Deschizi Managerul de Proiect?" +msgstr "Deschide Managerul de Proiect?" #: editor/editor_node.cpp msgid "Save & Quit" @@ -2603,12 +2605,14 @@ msgid "Undo Close Tab" msgstr "Anulare fila Închidere" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Close Other Tabs" -msgstr "" +msgstr "Închideți Alte File" #: editor/editor_node.cpp +#, fuzzy msgid "Close Tabs to the Right" -msgstr "" +msgstr "Închidere file la dreapta" #: editor/editor_node.cpp msgid "Close All Tabs" @@ -2738,20 +2742,23 @@ msgid "Version Control" msgstr "Control versiune" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +#, fuzzy msgid "Set Up Version Control" -msgstr "" +msgstr "Configurați controlul versiunii" #: editor/editor_node.cpp +#, fuzzy msgid "Shut Down Version Control" -msgstr "" +msgstr "Închidere control versiune" #: editor/editor_node.cpp msgid "Export..." msgstr "Export..." #: editor/editor_node.cpp +#, fuzzy msgid "Install Android Build Template..." -msgstr "" +msgstr "Instalare șablon compilare Android..." #: editor/editor_node.cpp msgid "Open Project Data Folder" @@ -2867,15 +2874,15 @@ msgstr "Editor" #: editor/editor_node.cpp msgid "Editor Settings..." -msgstr "Setările editorului..." +msgstr "Setări Editor..." #: editor/editor_node.cpp msgid "Editor Layout" -msgstr "Schema Editorului" +msgstr "Schema Editor" #: editor/editor_node.cpp msgid "Take Screenshot" -msgstr "Salvează captură de ecran" +msgstr "Captură de ecran" #: editor/editor_node.cpp msgid "Screenshots are stored in the Editor Data/Settings Folder." @@ -2886,23 +2893,20 @@ msgid "Toggle Fullscreen" msgstr "Comutare ecran complet" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Modul de Comutare" +msgstr "Cumutează Consola de Sistem" #: editor/editor_node.cpp -#, fuzzy msgid "Open Editor Data/Settings Folder" -msgstr "Setări ale Editorului" +msgstr "Deschide Dosarul De Date/Setări" #: editor/editor_node.cpp msgid "Open Editor Data Folder" -msgstr "" +msgstr "Deschidere dosarul de date editor" #: editor/editor_node.cpp -#, fuzzy msgid "Open Editor Settings Folder" -msgstr "Setări ale Editorului" +msgstr "Deschide Dosarul de Setări Editor" #: editor/editor_node.cpp msgid "Manage Editor Features..." @@ -2935,13 +2939,12 @@ msgid "Q&A" msgstr "Întrebări și Răspunsuri" #: editor/editor_node.cpp -#, fuzzy msgid "Report a Bug" -msgstr "Reimportă" +msgstr "Raportează o Eroare" #: editor/editor_node.cpp msgid "Send Docs Feedback" -msgstr "" +msgstr "Trimite Feedbackul Docs" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -2960,8 +2963,9 @@ msgid "Play" msgstr "Rulează" #: editor/editor_node.cpp +#, fuzzy msgid "Pause the scene execution for debugging." -msgstr "" +msgstr "Întrerupeți executarea scenei pentru depanare." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3001,17 +3005,14 @@ msgid "Spins when the editor window redraws." msgstr "Se rotește când fereastra editorului se redeschide." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "Continuu" +msgstr "Actualizare continuă" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Modificări ale Actualizării" +msgstr "Actualizează Doar La Modificare" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" msgstr "Dezactivează Cercul de Actualizare" @@ -3024,9 +3025,8 @@ msgid "Inspector" msgstr "Inspector" #: editor/editor_node.cpp -#, fuzzy msgid "Expand Bottom Panel" -msgstr "Extinde toate" +msgstr "Extinde Panoul De Jos" #: editor/editor_node.cpp msgid "Output" @@ -3039,11 +3039,11 @@ msgstr "Nu Salva" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." msgstr "" +"Android construi șablon lipsește, vă rugăm să instalați șabloane relevante." #: editor/editor_node.cpp -#, fuzzy msgid "Manage Templates" -msgstr "Administrează Șabloanele de Export" +msgstr "Gestionați șabloanele" #: editor/editor_node.cpp msgid "" @@ -3069,9 +3069,8 @@ msgid "Import Templates From ZIP File" msgstr "Importă Șabloane Dintr-o Arhivă ZIP" #: editor/editor_node.cpp -#, fuzzy msgid "Template Package" -msgstr "Exportă Managerul de Șabloane" +msgstr "Pachetul cu șabloane" #: editor/editor_node.cpp msgid "Export Library" @@ -3126,9 +3125,8 @@ msgid "Warning!" msgstr "" #: editor/editor_path.cpp -#, fuzzy msgid "No sub-resources found." -msgstr "Nicio sursă de suprafață specificată." +msgstr "Nu s-a găsit nici o sub-resursă." #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" @@ -3143,9 +3141,8 @@ msgid "Main Script:" msgstr "Script principal:" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Edit Plugin" -msgstr "Editează Poligon" +msgstr "Editare Plugin" #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" @@ -3269,9 +3266,8 @@ msgid "New Script" msgstr "" #: editor/editor_properties.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Extend Script" -msgstr "Execută Scriptul" +msgstr "Extinde Script" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "New %s" @@ -3317,14 +3313,12 @@ msgid "Remove Item" msgstr "" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "New Key:" -msgstr "Nume nou:" +msgstr "Cheie Nouă:" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "New Value:" -msgstr "Nume nou:" +msgstr "Valoare Nouă:" #: editor/editor_properties_array_dict.cpp msgid "Add Key/Value Pair" @@ -3384,7 +3378,6 @@ msgid "Import From Node:" msgstr "Importă Din Nod:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Redownload" msgstr "Descarcă din nou" @@ -3426,9 +3419,8 @@ msgid "Can't open export templates zip." msgstr "Nu se pot deschide șabloanele de export zip." #: editor/export_template_manager.cpp -#, fuzzy msgid "Invalid version.txt format inside templates: %s." -msgstr "Format nevalid versiune.txt în șabloane." +msgstr "Formatul versiune.txt nevalid din interiorul șabloanelor: % s." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." @@ -3495,9 +3487,8 @@ msgid "Download Complete." msgstr "Descărcare Completă." #: editor/export_template_manager.cpp -#, fuzzy msgid "Cannot remove temporary file:" -msgstr "Nu se poate șterge:" +msgstr "Nu pot sterge fișierul temporar:" #: editor/export_template_manager.cpp msgid "" @@ -3556,9 +3547,8 @@ msgid "SSL Handshake Error" msgstr "Eroare SSL Handshake" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uncompressing Android Build Sources" -msgstr "Decomprimare Asset-uri" +msgstr "Decomprimare Surse de compilare Android" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -3579,12 +3569,11 @@ msgstr "Elimină Șablon" #: editor/export_template_manager.cpp #, fuzzy msgid "Select Template File" -msgstr "Selectează fișierul șablon" +msgstr "Selectare fișier șablon" #: editor/export_template_manager.cpp -#, fuzzy msgid "Godot Export Templates" -msgstr "Administrează Șabloanele de Export" +msgstr "Șabloane de export Godot" #: editor/export_template_manager.cpp msgid "Export Template Manager" @@ -3665,14 +3654,12 @@ msgid "New Inherited Scene" msgstr "Nouă scenă moștenită" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Set As Main Scene" -msgstr "Alege o Scenă Principală" +msgstr "Setează ca scenă principală" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Open Scenes" -msgstr "Deschide o scenă" +msgstr "Deschide Scene" #: editor/filesystem_dock.cpp msgid "Instance" @@ -3683,9 +3670,8 @@ msgid "Add to Favorites" msgstr "Adauga la Favorite" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Remove from Favorites" -msgstr "Elimină din Grup" +msgstr "Eliminare din Preferințe" #: editor/filesystem_dock.cpp msgid "Edit Dependencies..." @@ -3712,26 +3698,22 @@ msgid "New Scene..." msgstr "Scenă nouă..." #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "New Script..." -msgstr "Deschide un script rapid..." +msgstr "Script nou ..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Resource..." -msgstr "Salvați Resursa Ca..." +msgstr "Resursă nouă ..." #: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Expand All" -msgstr "Extinde toate" +msgstr "Extinde Toate" #: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Collapse All" -msgstr "Restrânge toate" +msgstr "Reduceți Toate" #: editor/filesystem_dock.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -3741,28 +3723,24 @@ msgid "Rename" msgstr "Redenumește" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Previous Folder/File" -msgstr "Fila anterioară" +msgstr "Folder/Fișier Anterior" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Next Folder/File" -msgstr "Creați Director" +msgstr "Folder/Fișier Următor" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" msgstr "Rescanează Sistemul de Fișiere" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Toggle Split Mode" -msgstr "Modul de Comutare" +msgstr "Comută Modul Split" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Search files" -msgstr "Căutare Clase" +msgstr "Căută fișiere" #: editor/filesystem_dock.cpp msgid "" @@ -3777,27 +3755,24 @@ msgid "Move" msgstr "Mută" #: editor/filesystem_dock.cpp -#, fuzzy msgid "There is already file or folder with the same name in this location." -msgstr "Un fișier sau un director cu acest nume există deja." +msgstr "Există deja un fișier sau un dosar cu același nume în această locație." #: editor/filesystem_dock.cpp msgid "Overwrite" msgstr "" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Create Scene" -msgstr "Salvează Scena" +msgstr "Crează scenă" #: 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 -#, fuzzy msgid "Find in Files" -msgstr "%d mai multe fișiere" +msgstr "Caută în fișiere" #: editor/find_in_files.cpp msgid "Find:" @@ -3839,19 +3814,16 @@ msgid "Replace: " msgstr "Înlocuiți: " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace all (no undo)" -msgstr "Înlocuiți Tot" +msgstr "Înlocuiește tot (fără anulare)" #: editor/find_in_files.cpp -#, fuzzy msgid "Searching..." -msgstr "Se Salvează..." +msgstr "Caut..." #: editor/find_in_files.cpp -#, fuzzy msgid "Search complete" -msgstr "Căutați Text" +msgstr "Căutare completă" #: editor/groups_editor.cpp msgid "Add to Group" @@ -3866,28 +3838,24 @@ msgid "Group name already exists." msgstr "Numele grupului există deja." #: editor/groups_editor.cpp -#, fuzzy msgid "Invalid group name." -msgstr "Nume nevalid." +msgstr "Nume de grup nevalid." #: editor/groups_editor.cpp -#, fuzzy msgid "Rename Group" -msgstr "Grupuri" +msgstr "Renumește Grupul" #: editor/groups_editor.cpp -#, fuzzy msgid "Delete Group" -msgstr "Șterge Schema" +msgstr "Șterge Grupul" #: editor/groups_editor.cpp editor/node_dock.cpp msgid "Groups" msgstr "Grupuri" #: editor/groups_editor.cpp -#, fuzzy msgid "Nodes Not in Group" -msgstr "Adaugă în Grup" +msgstr "Nodurile Nu Sunt în Grup" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp #: editor/scene_tree_editor.cpp @@ -3895,23 +3863,20 @@ msgid "Filter nodes" msgstr "" #: editor/groups_editor.cpp -#, fuzzy msgid "Nodes in Group" -msgstr "Adaugă în Grup" +msgstr "Noduri în Grup" #: editor/groups_editor.cpp msgid "Empty groups will be automatically removed." msgstr "" #: editor/groups_editor.cpp -#, fuzzy msgid "Group Editor" -msgstr "Deschide Editorul de Scripturi" +msgstr "Editor Grup" #: editor/groups_editor.cpp -#, fuzzy msgid "Manage Groups" -msgstr "Grupuri" +msgstr "Gestionați grupuri" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" @@ -4023,9 +3988,8 @@ msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp -#, fuzzy msgid "Changing the type of an imported file requires editor restart." -msgstr "Schimbarea driver-ului video necesită restartarea editorului." +msgstr "Modificarea tipului de fișier importat necesită repornirea editorului." #: editor/import_dock.cpp msgid "" @@ -4037,14 +4001,12 @@ msgid "Failed to load resource." msgstr "Încărcarea resursei a eșuat." #: editor/inspector_dock.cpp -#, fuzzy msgid "Expand All Properties" -msgstr "Extinde toate proprietăţile" +msgstr "Extindeți toate proprietățile" #: editor/inspector_dock.cpp -#, fuzzy msgid "Collapse All Properties" -msgstr "Restrânge toate proprietăţile" +msgstr "Reduceți toate proprietățile" #: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp @@ -4116,19 +4078,16 @@ msgid "MultiNode Set" msgstr "Set MultiNod" #: editor/node_dock.cpp -#, fuzzy msgid "Select a single node to edit its signals and groups." -msgstr "Selectează un Nod pentru a edita Semnalele și Grupurile." +msgstr "Selectați un singur nod pentru a-i edita semnalele și grupurile." #: editor/plugin_config_dialog.cpp -#, fuzzy msgid "Edit a Plugin" -msgstr "Editează Poligon" +msgstr "Editează un Plugin" #: editor/plugin_config_dialog.cpp -#, fuzzy msgid "Create a Plugin" -msgstr "Crează Poligon" +msgstr "Crează un plugin" #: editor/plugin_config_dialog.cpp msgid "Plugin Name:" @@ -4152,9 +4111,8 @@ msgstr "" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Create Polygon" -msgstr "Crează Poligon" +msgstr "Crează poligon" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp @@ -4174,12 +4132,10 @@ msgstr "" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Erase points." -msgstr "RMB: Șterge Punctul." +msgstr "Șterge puncte." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Edit Polygon" msgstr "Editează Poligon" @@ -4188,14 +4144,12 @@ msgid "Insert Point" msgstr "Inserează Punct" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Edit Polygon (Remove Point)" -msgstr "Editează Poligon (Elimină Punct)" +msgstr "Editează Poligon (Șterge puncte)" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Remove Polygon And Point" -msgstr "Elimină Poligon Și Punct" +msgstr "Șterge Poligon Și Punct" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4214,19 +4168,16 @@ msgstr "Încărca..." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Move Node Point" -msgstr "Deplasare punct" +msgstr "Mută punct nod" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Change BlendSpace1D Limits" -msgstr "Schimbă Timpul Amestecului" +msgstr "Modifică limitele BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Change BlendSpace1D Labels" -msgstr "Schimbă Timpul Amestecului" +msgstr "Modifică etichetele BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -9632,9 +9583,8 @@ msgid "Make Patch" msgstr "" #: editor/project_export.cpp -#, fuzzy msgid "Pack File" -msgstr "Pachet Fișier" +msgstr "Împachetează Fișierul" #: editor/project_export.cpp msgid "Features" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index 16be6345f0..7b12d8195c 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -82,12 +82,15 @@ # Calamander <Calamander@yandex.ru>, 2020. # Terminator <fresh-ter@yandex.com>, 2020. # Anatoly Kuznetsov <muffinnorth@yandex.ru>, 2020. +# kyanukovich <ianu0001@algonquinlive.com>, 2020. +# Ron788 <ustinov200511@gmail.com>, 2020. +# Daniel <dan.ef1999@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-23 02:44+0000\n" -"Last-Translator: Anatoly Kuznetsov <muffinnorth@yandex.ru>\n" +"PO-Revision-Date: 2020-08-01 11:14+0000\n" +"Last-Translator: Daniel <dan.ef1999@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -7419,7 +7422,7 @@ msgstr "Свободный вид, право" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Forward" -msgstr "Freelook Forward" +msgstr "Обзор вперёд" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Backwards" @@ -8172,11 +8175,11 @@ msgstr "Удалить выбранную текстуру из TileSet." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from Scene" -msgstr "Создать из сцены" +msgstr "Создать из Сцены" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from Scene" -msgstr "Слияние из сцены" +msgstr "Слияние из Сцены" #: editor/plugins/tile_set_editor_plugin.cpp msgid "New Single Tile" @@ -9578,7 +9581,7 @@ msgstr "Файл пакета" #: editor/project_export.cpp msgid "Features" -msgstr "Свойства" +msgstr "Возможности" #: editor/project_export.cpp msgid "Custom (comma-separated):" @@ -10599,9 +10602,8 @@ msgid "Make node as Root" msgstr "Сделать узел корневым" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Удалить узел «%s» и его дочерние элементы?" +msgstr "Удалить узел «%d» и его дочерние элементы?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -12300,6 +12302,9 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"Полигональные фигуры не предназначены для использования или редактирования " +"непосредственно через узел \"CollisionShape2D\". Пожалуйста, используйте " +"вместо этого узел \"CollisionPolygon2D\" ." #: scene/2d/cpu_particles_2d.cpp msgid "" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index edab41c9b6..f7386bf72d 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -14,11 +14,12 @@ # Богдан Матвіїв <bomtvv@gmail.com>, 2019. # Tymofij Lytvynenko <till.svit@gmail.com>, 2020. # Vladislav Glinsky <cl0ne@mithril.org.ua>, 2020. +# Микола Тимошенко <9081@ukr.net>, 2020. msgid "" msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-06-25 08:40+0000\n" +"PO-Revision-Date: 2020-08-04 06:43+0000\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot/uk/>\n" @@ -10564,9 +10565,8 @@ msgid "Make node as Root" msgstr "Зробити вузол кореневим" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Вилучити вузол «%s» і його дочірні записи?" +msgstr "Вилучити %d вузлів та усі їхні дочірні записи?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -12015,7 +12015,7 @@ msgstr "" #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." -msgstr "Неокректний відкритий ключ для розгортання APK." +msgstr "Некоректний відкритий ключ для розгортання APK." #: platform/android/export/export.cpp msgid "Invalid package name:" @@ -12280,6 +12280,9 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"Засновані на багатокутниках форми не призначено для використання або " +"редагування з вузла CollisionShape2D. Будь ласка, скористайтеся замість " +"нього вузлом CollisionPolygon2D." #: scene/2d/cpu_particles_2d.cpp msgid "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 8db07bf4b0..bd52b850e4 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -13,12 +13,15 @@ # Peter Anh <peteranh3105@gmail.com>, 2019. # Dũng Đinh <dqdthanhthanh@gmail.com>, 2019. # Steve Dang <bynguu@outlook.com>, 2020. +# Harry Mitchell <minhyh0987@gmail.com>, 2020. +# HSGamer <huynhqtienvtag@gmail.com>, 2020. +# LetterC67 <hoangdeptoong@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-28 09:51+0000\n" -"Last-Translator: Steve Dang <bynguu@outlook.com>\n" +"PO-Revision-Date: 2020-08-11 14:04+0000\n" +"Last-Translator: LetterC67 <hoangdeptoong@gmail.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" "godot/vi/>\n" "Language: vi\n" @@ -73,31 +76,31 @@ msgstr "Khi cuộc gọi đến '%s':" #: core/ustring.cpp msgid "B" -msgstr "" +msgstr "B" #: core/ustring.cpp msgid "KiB" -msgstr "" +msgstr "KiB" #: core/ustring.cpp msgid "MiB" -msgstr "" +msgstr "MiB" #: core/ustring.cpp msgid "GiB" -msgstr "" +msgstr "GiB" #: core/ustring.cpp msgid "TiB" -msgstr "" +msgstr "TiB" #: core/ustring.cpp msgid "PiB" -msgstr "" +msgstr "PiB" #: core/ustring.cpp msgid "EiB" -msgstr "" +msgstr "EiB" #: editor/animation_bezier_editor.cpp msgid "Free" @@ -121,7 +124,7 @@ msgstr "Giá trị:" #: editor/animation_bezier_editor.cpp msgid "Insert Key Here" -msgstr "Thêm Khoá Tại Đây" +msgstr "Chèn Khóa Tại Đây" #: editor/animation_bezier_editor.cpp msgid "Duplicate Selected Key(s)" @@ -137,23 +140,23 @@ msgstr "Thêm điểm Bezier" #: editor/animation_bezier_editor.cpp msgid "Move Bezier Points" -msgstr "Di chuyển điểm Bezier" +msgstr "Di chuyển các điểm Bezier" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" -msgstr "Nhân đôi Các Key của Animation" +msgstr "Nhân đôi các Animation Key" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Delete Keys" -msgstr "Xóa phím Anim" +msgstr "Xóa các Animation Key" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Time" -msgstr "Đổi thời gian khung hình" +msgstr "Đổi thời gian khung hình Animation" #: editor/animation_track_editor.cpp msgid "Anim Change Transition" -msgstr "Đổi Transition Animation" +msgstr "Đổi Animation Chuyển tiếp" #: editor/animation_track_editor.cpp msgid "Anim Change Transform" @@ -161,7 +164,7 @@ msgstr "Đổi Transform Animation" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Value" -msgstr "Đổi giá trị khung hình" +msgstr "Đổi giá trị khung hình Animation" #: editor/animation_track_editor.cpp msgid "Anim Change Call" @@ -12597,7 +12600,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "Pick a color from the editor window." -msgstr "" +msgstr "Chọn một màu từ cửa sổ biên tập" #: scene/gui/color_picker.cpp msgid "HSV" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index e344be12e9..f35da2476c 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -68,12 +68,14 @@ # 无双流 <1257678024@qq.com>, 2020. # ZhangXinyu <zhang2xinyu@outlook.com>, 2020. # Silence Tai <silence.m@hotmail.com>, 2020. +# MintSoda <lionlxh@qq.com>, 2020. +# Gardner Belgrade <hapenia@sina.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2020-07-26 15:41+0000\n" -"Last-Translator: yzt <834950797@qq.com>\n" +"PO-Revision-Date: 2020-08-11 14:04+0000\n" +"Last-Translator: Gardner Belgrade <hapenia@sina.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" "Language: zh_CN\n" @@ -100,7 +102,7 @@ msgstr "没有足够的字节来解码,或格式无效。" #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "表达式中包含得%i无效(未传递)" +msgstr "表达式中包含的%i无效(未传递)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -3756,7 +3758,7 @@ msgstr "创建脚本" #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp msgid "Find in Files" -msgstr "在文件中查找" +msgstr "跨文件查找" #: editor/find_in_files.cpp msgid "Find:" @@ -5317,7 +5319,7 @@ msgstr "重置缩放" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Select Mode" -msgstr "选择模式" +msgstr "鼠标模式" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag: Rotate" @@ -10399,7 +10401,6 @@ msgid "Make node as Root" msgstr "将节点设置为根节点" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" msgstr "是否删除节点“%s”及其子节点?" @@ -12048,6 +12049,8 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"基于多边形的形状不应该被 CollisionShape2D 节点直接使用或编辑。请使用 " +"CollisionPolygon2D 节点。" #: scene/2d/cpu_particles_2d.cpp msgid "" @@ -12258,7 +12261,7 @@ msgstr "平面形状无法正常工作,未来版本将被删除。请勿使用 #: scene/3d/collision_shape.cpp msgid "" "ConcavePolygonShape doesn't support RigidBody in another mode than static." -msgstr "ConcavePolygonShape仅支持静态RigidBody。" +msgstr "ConcavePolygonShape 只支持静态模式下的 RigidBody。" #: scene/3d/cpu_particles.cpp msgid "Nothing is visible because no mesh has been assigned." diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 73b99ee161..51efdfd2b8 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -24,12 +24,13 @@ # Allen H. <w84miracle@gmail.com>, 2020. # BinotaLIU <binota@protonmail.ch>, 2020. # BinotaLIU <me@binota.org>, 2020. +# MintSoda <lionlxh@qq.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-07 15:56+0000\n" -"Last-Translator: BinotaLIU <me@binota.org>\n" +"PO-Revision-Date: 2020-07-31 03:47+0000\n" +"Last-Translator: MintSoda <lionlxh@qq.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" @@ -10361,7 +10362,6 @@ msgid "Make node as Root" msgstr "將節點設為根節點" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" msgstr "確定要刪除節點「%s」與其子節點嗎?" @@ -12017,6 +12017,8 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" +"基於多邊形的形狀不應該被 CollisionShape2D 節點直接使用或編輯。請使用 " +"CollisionPolygon2D 節點。" #: scene/2d/cpu_particles_2d.cpp msgid "" |